逆向基础:软件手动脱壳技术入门( 三 )


然后如果这时使用 dump后修复,就和前两种一样了 。这里先是使用获取函数输入表第一个位置的指针地址 。
然后得到函数指针偏移地址在,加上基地址后为,这时在该位置下硬件访问双字断点 。再重新SHIFT+F9忽略异常执行后,由于下了断点,会触发的CRC校验错误:
所以这里要先绕过CRC校验,才能成功执行到硬件断点位置,所以首先暂停程序,然后使用Alt+F9返回用户代码 。点击确定按钮后,程序暂停在调用的位置:
现在要向上找一找能跳过这个退出的跳转(CRC判断跳转),然后进行修改并跳过:
找到了应该修改的位置,但是如果修改之后重新运行是会被恢复的,所以先记下来这个跳转的地址, 。重新运行之后,在idata断设置内存断点,SHIFT+F9停下后,再Ctrl+G找到修改点再修改 。修改完之后再设置之前的硬件断点,这样不会触发CRC校验错误了 。
无数次的SHIFT+F9之后,在寄存器窗口可以看到指针以及能够正常显示:
然后此时F8单步,找magic jump……看小生大大的视屏是通过分析疑似CRC跳转得到magic jump的位置:
这里记下来magic jump的地址是,然后清空udd文件,删除硬件断点,再次重新运行程序,然后在idata下内存断点停住,然后Ctrl+G找到magic jump位置处,修改跳转:
然后在code段下内存断点:
然后SHIFT+F9执行,停下来就到了OEP的位置:
这时候再dump程序,IAT表已经被修复,可以直接获得脱壳版程序:
这里尝试使用了另外两种脱壳方法,并且通过预先找OEP的方式,修复了CRC校验后,直接dump到了IAT被修复了的程序 。
3.3 脱壳笔记
先把程序扔到里面,然后程序停在这里,看起来蛮怪的:
好吧,重新加载程序,尝试使用最后一次异常法,不忽略所有异常,然后使用异常计数器插件,程序停在最后一次异常处:
如果此时F8单步下去,程序会触发异常处理,然后又到不了OEP了 。这时需要看一下堆栈数据情况:
这时需要在处F2下断点,然后SHIFT+F9执行,可以跳过这个坑:
然后接下来就是F8+F4的操作,一路直到OEP:
用脱壳,然后用修复后,虽然没有无效指针,但是还是不能运行:
这时候用的重建PE功能:
然后就可以正常运行了:
这个壳使用了单步跟踪的脱壳方法,一路跳过程序“陷阱”,最后达到OEP 。并且使用了的重建PE功能,对程序进行了重建,最终完成了这个加密壳的脱壳全过程 。
3.4 FSG变形壳脱壳笔记
首先进行侦壳:
使用ESP定律,首先把程序扔到里面,F8单步走,观察ESP变化,在ESP第一次发生变化时,对ESP对应的地址处设置内存硬件访问WORD断点,然后SHIFT+F9运行,在程序停下来之后,取消硬件断点,进行F8单步:
用F4略过向后的跳转(循环),然后继续往下找,一直到这里:
在这个jmp下面F4,程序会跑飞 。说明程序代码在这个循环中就已经释放完毕,所以向上找找这个循环中有没有带条件的大跳 。这样很容易找到magic jump的位置,然后我们Enter或者Ctrl+G到的位置,发现果然是OEP,重新分析,然后F2下断点,让程序走到OEP:
如果是FSG1.33,直接使用 dump文件,然后使用修复,就可以正常脱壳了 。但是这里在使用修复时,会出现一个无效指针:
这里直接剪掉(或者删掉)这个指针,然后修复转存文件,发现无法正常打开:
然后再把修复后的程序,丢到中F9直接运行:
【逆向基础:软件手动脱壳技术入门】这里是变形壳添加的一个暗桩,会导致程序出现异常退出,这里直接nop掉或者把之前的jle(校验)改成jmp,然后保存修改另存文件 。然后就可以运行了