昨晚一时兴起跟风了一篇64位脱壳笔记,有个坛友 @和合66 问脱壳方法是否能适用到32位的通达信。虽然文字无法准确的表达表情和语气,但是字里行间我感受到了质疑的存在,我这该死的好胜心,为了得一篇精华,继续拼了~
32位程序的下载,官网下载地址: https://data.tdx.com.cn/level2/new_tdx.exe, 我下载的是金融终端 V7.65版本。
找个32位的调试器,我们开始32位程序的脱壳之旅。
前文有说过,通达信的VMP保护,就是个银样镴枪头:
不过值得庆幸的是,由于通达信的`交易模块`中存在 `MalwareScout[332.3.X].dll` 和 `NodeGuardC.dll` 两个检测组件,这两个检测组件不仅检测电脑的运行环境,HOOK信息,还把 TdxW.Exe、Tc.dll 等程序的 代码段、资源段(主要是图标资源),IAT表 等信息也会提取出来加密作为校验的样本。这就使得 通达信的程序,虽然是使用了令人闻风丧胆的VMP3的壳来保护自己,但是保护强度也只是个银样镴枪头,整个脱壳的工作也就简单的很多,现记录如下:
{本文为理想论坛博主「陈不二」的帖子,转载请注明出处。
原文链接: https://www.55188.com/thread-23735978-1-1.html}
配置好对应的插件,如下图:
然后用调试器直接加载金融终端V7.65的主程序 tdxw.exe,如下图:
按照前文中介绍的思路:
所有程序找OEP的思路是差不多的,一个带壳程序的运行,总得先运行壳代码,等壳代码加载好,被保护的原始代码被解密完之后,壳代码总得将程序的运行权限交给原始程序,让程序正常启动起来的。
有了这个思路,找OEP的方法就有很多了,由于上面我说的交易模块中检测组件的原因,通达信的保护强度不高,我们可以直接再数据段或者资源段下写入断点,确保原始程序的资源都释放的差不多了,再在代码段下访问或者执行断点,就可以直接到达OEP附近。
{本文为理想论坛博主「陈不二」的帖子,转载请注明出处。
原文链接: https://www.55188.com/thread-23735978-1-1.html}
我们可以让壳程序先运行,待资源都释放的差不多了,我们可以直接来到OEP附近。这里我们先查看一下内存模块:
先让壳释放 资源数据,在 .rsrc 处下F2断点,然后运行程序,程序断在了.VMP1区段的位置,如下图:
继续查看内存模块,在PE头的位置下F2断点,如下图:
然后,继续运行程序,断在了同样的位置,继续在资源段下F2断点:
继续运行程序,这次程序断在了系统NTDLL模块的领空,并没有断在 .VMP1 的壳代码中,如下图:
第六感告诉我,应该是差不多了,我们查看函数的调用栈,如下图:
找到最下面的 tdxw模块的代码,双击来到对应的函数调用代码处,如下图:
这里应该就是在OEP附近了,我们向上滚动,找到函数头的位置,如下图:
熟悉的配方,熟悉的味道。OEP应该就是这里了,为了确保这里就是我们的OEP,我们可以查看一下所有调用这个方法的代码:
找到了一处 JMP跳转的地方,如下图:
看地址,也是在 tdxw.exe 模块中,我们双击JMP这一行,来到调用段的代码处,如下图:
在这里,如果嫌上面的操作麻烦,还可以继续留点特征,下次直接通过特征码到达OEP处,这个就不细说了。
接下来的步骤,与x64位通用,在OEP处下硬件执行断点,重新载入程序,如下图:
剩下的就是 dump程序,修复IAT,然后优化程序大小,这些步骤同 X64位一样,可参考: https://www.55188.com/thread-23735978-1-1.html 继续进行。
题外的话
如果您仔细跟着操作的话,会发现一个问题,再修复 IAT时,会有一个API查找失败,如下图:
我们在调试器中来到这个项目的位置,如下图:
我们可以看出来,这个IAT项目是插在两个user32模块之间,如果我们熟悉PE的IAT表结构的话,我们会发现不同模块的IAT应该用 0 来间隔的,这里明显不符合正常的IAT表结构。
我们可以断定,这里一定还是 user32 模块的API,只是 appehelp.dll 模块不知道处于什么原因,HOOK了这个地址。如果有大佬了解这个机制,可以在这里答复我: https://www.52pojie.cn/thread-1475138-1-1.html
这里我们为了脱壳,不深究这个问题,直接在这个API下F2断点运行程序,我的思路是如果软件运行后从来就没调用过这个API,我们就直接将这个IAT删掉,反正不影响程序正常运行,如果程序会断下来,我们就根据调用放来判断这个是什么API。
很荣幸,我们断下来了,如下图:
我们知道,这个是 USER32.CallNextHookEx,继续修复IAT即可。
至此,所有IAT修复完毕,如下图:
剩下的如何dump程序,如何优化程序大小之类的,就不再重复,参考 X64位的文章即可。
脱壳后的文件大小:
绕过
- 006C5F5C 833D 48EA3301 0>cmp dword ptr [0x133EA48], 0x0
检测之后,可以正常运行。
最后附上我脱壳后的文件,方便大家复盘。