作者:Fly2015
这个程序是吾爱破解脱壳练习第8期的加壳程序,该程序的壳是MoleBox V2.6.5壳,之前也碰过该种壳但是这个程序似乎要复杂一点。
首先对加壳程序进行侦壳处理。
Exeinfo PE侦壳的结果:
DIE侦壳的结果,很显然DIE告诉我们被加壳程序的源程序使用Delphi编写的,这个比较有用,对于我们找到程序的真实OEP很有帮助作用。
OD载入该加MoleBox V2.6.5壳的程序,入口点汇编的代码如图。看到PUSHAD,我们很自然会想到使用ESP定律进行脱壳。F8单步走到PUSHAD的下一条指令即地址00469BD9处,选择ESP寄存器,右键-->HW Break [esp](硬件断点),F9运行程序。
程序在刚才下硬件写入断点的地址处断了下来,如图。
单步F7到地址0046997B3处,发现Call eax指令中的EAX保存是加壳程序真实OEP的VA地址0045159C。
F7跟进到地址0045159C处查看,汇编代码是不是很熟悉?典型的Delphi程序的入口点汇编代码。说实话,我不怎么喜欢Delphi程序的反汇编,因为对于Delphi程序的反汇编没有比较理想的工具。
OK,被加壳程序的真实OEP找到了,是不是就可以直接Dump给程序脱壳完事呢?试一试就知道了。使用OD的插件OllyDump或者Load PE+ImportREC或者是Scylla_x86进行程序的脱壳,然后运行程序,结果如图。
程序运行的不友好界面又出现了。被加壳程序的真实OEP地址已经找到了,但是程序运行还是出了问题,那么很有可能是Dump程序的IAT没有修复好。在进行程序的IAT修复的时候,直接将ImportREC程序中显示的无效函数地址给剪切了。经过观察发现,被剪切的无效函数不是系统Dll的导出函数,但是一般被加壳程序的IAT表中的函数地址结尾的标记是-1或者0等。后来经过参考吾爱破解上的帖子才知道,原来是有部分函数的API地址被加密处理了。
下面使用OD在程序的内存数据中查找IAT表保存的内存位置。当找到了被加壳程序的真实的OEP以后,就可以在原程序真实OEP地址以后(被加壳原程序)代码中去查找被加壳原程序的IAT的保存地址即找到IAT表的入口地址。
从上面找到的代码中,观察发现跟进地址0040658C处就能找到调用系统Dll导出函数的代码。果然,跟进以后找到了程序调用系统API函数的地方,比较明显的是在地址004554DC处保存着函数user32.PostQuitMessage的调用地址。
在该程序的内存数据区Ctrl+G到地址004554DC处找到了函数user32.PostQuitMessage地址的保存位置。
上下拖动一下OD的数据区的滚动条,就可以找到IAT表的起始VA地址0045512C和IAT表的结束地址00455728并且IAT表的大小为455724 - 45512C = 5F8。
在IAT表发现了被加密的系统API函数的位置。很显然,被加密处理的IAT表中的函数地址在系统的Dll中是不存在,OD的解析中没有对应的系统API函数,如图。
现在的任务就是将这部分加密的系统API函数恢复还原出来。
Ctrl+F2让OD再次调试载入被加壳的程序,删除之前下的硬件写入断点,OD内存数据区Ctrl+G到IAT表的起始VA地址0045512C处,然后找到IAT表中所有的被加密的系统API函数的保存地址如00455170处,选择这些地址 右键-->下DWORD型的硬件写入断点,几次F9以后被加密的系统函数API地址显示出来了,然后将这些API函数地址记录下来。
下面是经过上面这种方法记录下来的被加密系统API函数的地址。
被加密系统API函数的地址没有恢复之前,用Scylla_x86看到的IAT表函数的结果是有18个无效函数地址。
离被加壳程序脱壳又进了一步。Ctrl+F2让OD再次运行程序进行分析,删除前面下的所有类型的断点。再次根据ESP脱壳定律,用之前的方法找到该程序的真实的OEP的VA地址并运行到此即地址0045159C处。在OD的内存数据区Ctrl+G到IAT表的起始VA地址0045512C处,然后找到IAT表中被加密系统API函数的地址处,根据前面的记录的系统API函数的正确地址手动将加密的函数API地址修改过来,如图。
手动将加密的系统API函数的地址修改正确之后,用Scylla_x86看到的IAT表函数的结果,如图。
OK,大功告成。直接用OD的插件OllyDump在程序真实的OEP的RVA为5159C处进行dump进程就可以完成改程序的完美脱壳了。或者使用Load PE结合RecImport进行程序的Dump和IAT表的修复,完成程序的脱壳。或者直接使用Scylla_x86工具进行先程序Dump然后进行Fix Dump。
但是在使用工具的时候请注意Scylla_x86和RecImport所填写的数据不一样,前者填入的VA地址,后者填写的RVA地址。
程序脱壳成功,运行验证一下,如图。
总结,上面的脱壳的方法是挫了点,但是思路没有错还是解决了问题,后面有空研究一下,其他比较好的脱壳的方法。
Mole Box V2.6.5脱壳分析文档以及完美脱壳后的程序的下载地址:http://download.csdn.net/detail/qq1084283172/8896587
吾爱破解脱壳练习第8期的地址:http://www.52pojie.cn/thread-11306-1-1.html。
吾爱破解脱壳练习第8期脱壳分析的地址:http://www.52pojie.cn/thread-11306-2-1.html。