Archive for 28 9 月, 2011

aliedit

星期三, 28 9 月, 2011

最近有需要研究下支付宝的密码控件,即aliedit。谷歌百度之,发现还有驱动级别的(::>_<::)。自己动手,丰衣足食。
先看下支付宝的登录源码,其中有这样一段:alipay

OK,载体是一个ActiveX控件。不用浏览器安装这个ActiveX控件,直接从官网上下载aliedit.exe。
使用Universal Extractor将安装包解包,发现其中只有dll,看来并没有网上所说的驱动了(后面使用工具反复找也没找到驱动模块的痕迹)。
在Ring3的aliedit是如何处理键盘消息并防止被hook键盘消息的呢?
使用spy++捕捉支付宝页面的键盘消息,发现就只有aliedit控件处的键盘消息是无法捕捉到的,怀疑也是hook。
于是用工具找找hooks看,出于意料的是QQ管家、spy++等的hooks都被检查出来了,aliedit却没有(囧rz),只能看看其内部实现了。

直接用IDA打开发现IDA报警告,分析出的代码含UPX节,可能是加壳了。PEiD查壳果然,用UPX脱之,不费力。
在IDA的Imports中果然找到了SetWindowsHookEx和UnhookWindowsHookEx的引用,主要就是分析引用它们的例程了,分别是offset 0x936D和offset 0x93BC。

.text:100093A1 push 0 ; dwThreadId
.text:100093A3 push eax ; hmod
.text:100093A4 push offset fn ; lpfn
.text:100093A9 push 0Dh ; idHook
.text:100093AB call ds:SetWindowsHookExA

是一个全局的低级键盘钩子,奇怪的是我用工具没找到它的踪影——要么应该在工具中列出该钩子,要么在运行aliedit之后运行的进程中会有aliedit.dll模块。

IDA具体的分析如下:aliedit.idb(附件太大就不传了)

这里我只说说为什么会找不到aliedit的钩子。
先用OD附加打开了支付宝登录页面的IE,查看—>可执行模块中找到aliedit.dll的路径(C:\WINDOWS\system32\aliedit\2.5.0.3\aliedit.dll),用脱壳后的文件替换,然后再如上附加。
查看—>可执行模块中找到aliedit.dll的基址(07780000),查看—>内存中找到aliedit.dll的基址处,在代码节下断,然后运行。程序很快就会在aliedit.dll的领空断下来。
在0778936D(引用SetWindowsHookEx的例程)和077893BC(引用UnhookWindowsHookEx的例程)处下断,运行,总结:
aliedit控件获得焦点时会SetWindowsHookEx,反之,失去焦点时会UnhookWindowsHookEx。注意这里是aliedit控件,不是整个alipay的页面或IE。
这就解释了为什么用一般工具找不到它的hook了。

补充一个调用aliedit的测试页面:aliedit_test.html