手脱FSG 2.0壳及其IAT修复的过程
1、PEiD查壳:
FSG 2.0 -> bart/xt
2、OD载入,隐藏OD,忽略除内存访问异常外的所有异常,程序断到蓝色代码处:
00400154 F> 8725 EC444100 xchg dword ptr ds:[4144EC],esp
0040015A 61 popad
0040015B 94 xchg eax,esp
F8单步跟踪至红色代码行,查看右下角的堆栈,显示为:
004144F0 004001E8 FSG_2_0.004001E8
004144F4 004001DC FSG_2_0.004001DC
004144F8 004001DE FSG_2_0.004001DE
004144FC 004010CC FSG_2_0.004010CC
其中的红色代码行是不是很面熟?对,这就是真正的OEP的位置。右单击“004010CC”,选择“数据窗口中跟随”,在数据窗口中,拖选一个16位的数据区,右单击,选择“断点”->“设置硬件执行断点”,Shift+F9,运行到如下的蓝色代码处:
004001D1 - FF63 0C jmp dword ptr ds:[ebx+C] ; FSG_2_0.004010CC
004001D4 50 push eax
004001D5 55 push ebp
F8就来到了真正的OEP处:
004010CC 55 push ebp ; ADVAPI32.77DA0000
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,44
004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA
004010D9 8BF0 mov esi,eax
脱
壳时,修复是个问题,正常时,只有kernel32的几十个函数,修复后,发现程序无法运行,推测应该IAT修复有问题。我们查找一下真正的OEP吧。在
数据窗口中,ctrl+G,输入4063E4,回车,然后把数据窗口向上拉,来到了全零的地方,发现地址004062E4之前,是全零,因此断定
004062E4就是IAT的起始地址,因此修复时的RVA是:62E4,然后,再把鼠标向下拖动,找到全零处,地址为00406E00,地址之差
为:00406E00 - 004062E4 = B1C,因此IAT的大小为B1C。此时可以修复了,在ImportREC的OEP:10CC,RVA:62E4,大小:B1C,点击“获取输入表”,发现有533个无效指针,直接剪切掉即可。此时修复转储文件后,发现可以正常运行了。

浙公网安备 33010602011771号