这里选择的程序是http://www.52pojie.cn/thread-11112-1-1.html【小生大大脱壳练习第六期】中的那个程序,Peid侦壳的加壳类型是:tElock1.0P.S.整个脱文基本上参照小生大大的动画视频,结尾也列出了一些同类的帖子,请叫我知识的搬运工 = =
1、先使用最简单的最后一次异常法: 首先把程序扔到OllyIce里面设置OD调试选项中的异常选项,
仅保留内存非法访问异常,然后使用异常计数器插件,在使用前要清空断点设置:
等到程序正常运行后,重新加载程序,再选择第二步,停在最后一次异常之前:
然后用Alt+M转到内存窗口,对主程序code段下内存断点,SHIFT+F9执行:
这样程序就中断在了正确的OEP处,可以选择从模块中删除分析以显示正常分析的汇编代码。然后使用LoadPE dump程序,并修正程序映像大小:
接下来就是修复dump的程序,选择重新打开dump前的程序,使用ImportREC v1.6F Fix版,输入正确的OEP,获取函数输入表信息:
这时会发现有很多无效的函数指针,使用方法一修复后,再使用方法三可以完全修复:
再点击Fix dump,可以修复之前dump下来的程序,脱壳完成:
2、再使用二次内存断点法:
首先载入程序,将所有的异常类型忽略,然后在IDAta段设置内存断点:
然后SHIFT+F9,停下来后再次在code段设置内存断点,再次SHIFT+F9执行,可以直接达到正确的OEP中: 然后LoadPE dump,然后修复……同方法一。
3、寻找magic jump以及修复函数表完成后dump程序
前两步还是加内存断点(idata、code),然后定位到程序的正确OEP处。
然后如果这时使用LoadPE dump后修复,就和前两种一样了。这里先是使用ImportREC获取函数输入表第一个位置的指针地址。
然后得到函数指针偏移地址在0x005512C,加上基地址后为0x045512C,这时在该位置下硬件访问双字断点。再重新SHIFT+F9忽略异常执行后,由于下了断点,会触发tElock的CRC校验错误:
所以这里要先绕过CRC校验,才能成功执行到硬件断点位置,所以首先暂停程序,然后使用Alt+F9返回用户代码。点击确定按钮后,程序暂停在调用ExitProcess的位置:
现在要向上找一找能跳过这个退出的跳转(CRC判断跳转?),然后进行修改并跳过:
找到了应该修改的位置,但是如果修改之后重新运行是会被恢复的,所以先记下来这个跳转的地址,0x00469622。重新运行之后,在idata断设置内存断点,SHIFT+F9停下后,再Ctrl+G找到修改点再修改。修改完之后再设置之前的硬件断点,这样不会触发CRC校验错误了……
无数次的SHIFT+F9之后,在寄存器窗口可以看到指针以及能够正常显示:
然后此时F8单步,找magic jump……小生大大是通过分析疑似CRC跳转得到magic jump的位置:
这里记下来magic jump的地址是0x0046973B,然后清空udd文件,删除硬件断点,再次重新运行程序,然后在idata下内存断点停住,然后Ctrl+G找到magic jump位置处,修改跳转:
然后在code段下内存断点:
然后SHIFT+F9执行,停下来就到了OEP的位置:
这时候再dump程序,IAT表已经被修复,可以直接获得脱壳版程序:
相关参考的文章:
|