手脱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个无效指针,直接剪切掉即可。此时修复转储文件后,发现可以正常运行了。

posted @ 2012-07-12 11:05  monkeycd  阅读(357)  评论(0)    收藏  举报