Ollydbg,OD手动脱壳
 
Notifications
Clear all

Ollydbg,OD手动脱壳

2 Posts
1 Users
0 Likes
2,634 Views
(@taichi)
Member
Joined: 4 years ago
Posts: 408
Topic starter  

单独跟踪法:
1.OD载入,不分析代码。
2.近CALL—F7,远CALL—F8,实现向下的跳转。
3.有回跳处,下一句代码处—F4 (右键—代码断点运行到所选)
4.大的跳转(大跨段,JMP或JE或RETN),很快就会到OEP

最后一次异常法:
1.OD打开—点选项—调试选项—去掉所有异常—CTRL+F2重载.
2.SHIFT+F9.只到程序运行,记下次数M
3.CTRL+F2重载—按SHIFT+F9(次数为M-1次)
4.按CTRL+G—输入OE右下角的SE句柄前的地址.
5.F2下断—SHIFT+F9到断点处.
6.去断按F8,到OEP.

模拟跟踪法:
无暗桩情况下使用
1.F9试运行,跑起来就无SEH暗桩之类的,否则就有.
2.ALT+N打开内存镜像,找到包含“=sfx,imports reloco tions”字符
3.地址=  命令行输入:tceip<,回车.

内存镜像法:
1.OD载入软件
2.点选项—调试选项—忽略全部—CTRL+F2重载
3.ALT+N打开内存镜像,找程序第一个.rsrc—F2下断—SHIFT+F9运行到断点,再打开找到程序第一个.rsrc上面的.code处(就是00401000处),F2下断—SHIFT+F9或无异常按F9,到OEP

ESP定律法:
1.F8,观察OD右上角寄存器中ESP有没有实现(红色)
2.命令行下 DD ******(当前代码ESP值),回车
3.DD就选中下端地址,断点—硬件访问—DWORD断点,F9运行,到跳转处按F8 到OEP

一步到ESP法:
只适合少数壳,如UPX,ASPACK
1.CTRL+F—输入:POPAD.回车查找—F2下断—F9运行到此处.
2.来到大跳转处,点F8到OEP.

SFX法:
1.设置OD,忽略所有异常.
2.切换到SFX选项卡,选择“字节模式跟踪实际入口”,确定.
3.重载—“否”压缩代码,到OEP.


   
Quote
Topic Tags
(@taichi)
Member
Joined: 4 years ago
Posts: 408
Topic starter  

下面给出整理的使用以上方法,自己尝试手动脱这几种常用壳的脱壳笔记。

3.1UPX脱壳笔记

首先进行侦壳:

enter image description here

首先把程序扔到OllyIce里面可以看到:

enter image description here

然后这里尝试使用ESP定理:即在ESP第一次改变时,对ESP的地址设置硬件字访问断点,这样可以在代码被UPX算法还原之后,跳转到程序的正常入口处。

enter image description here

然后F5运行,并没有直接到跳转到程序入口处的大跳位置,但是可以看到UPX的大跳就在眼前:

enter image description here

所以被还原后的程序入口点就是0x00445151(通过单步往下走,F4略过往回走的循环语句,也可以看到这个大跳的位置。)接下来走到大跳位置,跳到正常程序入口处:

enter image description here

然后去掉硬件断点,并使用LoadPEdump功能dump目标程序:

enter image description here

先修正映像大小,然后再选择完整脱壳,这样可以得到第一步dump的程序,然后再使用ImportREC修复dump程序的OEPOEP的信息通过OD自带的dump功能查询或者直接填45151

enter image description here

将正确的入口地址填入ImportREC中,然后自动搜索IAT信息:

enter image description here

然后点击获取输入表得到修正IAT之后的程序函数输入表,然后再点击显示无效函数,愉快地发现没有无效函数,那么就可以直接修复转存文件了。

enter image description here

选择刚刚第一步dump下来的转储文件进行修复,修复完成之后脱壳完成:

enter image description here

这里对于压缩壳UPX,直接使用了ESP定律,可以很方便找到OEPdump程序。

4.2 tElock脱壳笔记

这里脱的是一个tElock的壳:

enter image description here

1、先使用最简单的最后一次异常法: 首先把程序扔到OllyIce里面设置OD调试选项中的异常选项,

enter image description here

仅保留内存非法访问异常,然后使用异常计数器插件,在使用前要清空断点设置:

enter image description here

等到程序正常运行后,重新加载程序,再选择第二步,停在最后一次异常之前:

enter image description here

然后用Alt+M转到内存窗口,对主程序code段下内存断点,SHIFT+F9执行:

enter image description here

这样程序就中断在了正确的OEP处,可以选择从模块中删除分析以显示正常分析的汇编代码。然后使用LoadPE dump程序,并修正程序映像大小。但是在使用ImportREC v1.6F Fix版,输入正确的OEP,获取函数输入表信息时,会发现无效的指针。使用方法一修复后,再使用方法三可以完全修复:

enter image description here

再点击Fix dump,可以修复之前dump下来的程序,脱壳完成:

enter image description here

2、使用二次内存断点法: 首先载入程序,将所有的异常类型忽略,然后在idata段设置内存断点, 然后SHIFT+F9

enter image description here

enter image description here

停下来后再次在code段设置内存断点,再次SHIFT+F9执行,可以直接达到正确的OEP中:

enter image description here

然后LoadPE dump,然后修复IAT。修复方法同方法1。

3、寻找magic jump以及修复函数表完成后dump程序: 前两步还是加内存断点(idatacode),然后定位到程序的正确OEP

enter image description here

然后如果这时使用LoadPE dump后修复,就和前两种一样了。这里先是使用ImportREC获取函数输入表第一个位置的指针地址。

enter image description here

然后得到函数指针偏移地址在0x005512C,加上基地址后为0x045512C,这时在该位置下硬件访问双字断点。再重新SHIFT+F9忽略异常执行后,由于下了断点,会触发tElockCRC校验错误:

enter image description here

所以这里要先绕过CRC校验,才能成功执行到硬件断点位置,所以首先暂停程序,然后使用Alt+F9返回用户代码。点击确定按钮后,程序暂停在调用ExitProcess的位置:

enter image description here

现在要向上找一找能跳过这个退出的跳转(CRC判断跳转),然后进行修改并跳过:

enter image description here

找到了应该修改的位置,但是如果修改之后重新运行是会被恢复的,所以先记下来这个跳转的地址,0x00469622。重新运行之后,在idata断设置内存断点,SHIFT+F9停下后,再Ctrl+G找到修改点再修改。修改完之后再设置之前的硬件断点,这样不会触发CRC校验错误了。

无数次的SHIFT+F9之后,在寄存器窗口可以看到指针以及能够正常显示:

enter image description here

然后此时F8单步,找magic jump……看小生大大的视屏是通过分析疑似CRC跳转得到magic jump的位置:

enter image description here

这里记下来magic jump的地址是0x0046973B,然后清空udd文件,删除硬件断点,再次重新运行程序,然后在idata下内存断点停住,然后Ctrl+G找到magic jump位置处,修改跳转:

enter image description here

然后在code段下内存断点:

enter image description here

然后SHIFT+F9执行,停下来就到了OEP的位置:

enter image description here

这时候再dump程序,IAT表已经被修复,可以直接获得脱壳版程序:

enter image description here

这里尝试使用了另外两种脱壳方法,并且通过预先找OEP的方式,修复了CRC校验后,直接dump到了IAT被修复了的程序。

3.3 PEncrypt脱壳笔记

首先进行侦壳:

enter image description here

先把程序扔到OllyIce里面,然后程序停在这里,看起来蛮怪的:

enter image description here

enter image description here好吧,重新加载程序,尝试使用最后一次异常法,不忽略所有异常,然后使用异常计数器插件,程序停在最后一次异常处:

enter image description here

如果此时F8单步下去,程序会触发异常处理,然后又到不了OEP了。这时需要看一下堆栈数据情况:

enter image description here

这时需要在0040CCD7F2下断点,然后SHIFT+F9执行,可以跳过这个坑:

enter image description here

然后接下来就是F8+F4的操作,一路直到OEP

enter image description here

enter image description here

LoadPE脱壳,然后用ImportREC修复后,虽然没有无效指针,但是还是不能运行:

enter image description here

这时候用LoadPE的重建PE功能:

enter image description here

enter image description here

然后就可以正常运行了:

enter image description here

这个壳使用了单步跟踪的脱壳方法,一路跳过程序“陷阱”,最后达到OEP。并且使用了LoadPE的重建PE功能,对程序进行了重建,最终完成了这个加密壳的脱壳全过程。

3.4 FSG变形壳脱壳笔记

首先进行侦壳:

enter image description here

使用ESP定律,首先把程序扔到OllyIce里面,F8单步走,观察ESP变化,在ESP第一次发生变化时,对ESP对应的地址处设置内存硬件访问WORD断点,然后SHIFT+F9运行,在程序停下来之后,取消硬件断点,进行F8单步:

enter image description here

F4略过向后的跳转(循环),然后继续往下找,一直到这里:

enter image description here

在这个jmp下面F4,程序会跑飞。说明程序代码在这个循环中就已经释放完毕,所以向上找找这个循环中有没有带条件的大跳。这样很容易找到magic jump的位置,然后我们Enter或者Ctrl+G00402666的位置,发现果然是OEP,重新分析,然后F2下断点,让程序走到OEP

enter image description here

如果是FSG1.33,直接使用LoadPE dump文件,然后使用ImportREC修复,就可以正常脱壳了。但是这里在使用ImportREC修复时,会出现一个无效指针:

enter image description here

这里直接剪掉(或者删掉)这个指针,然后修复转存文件,发现无法正常打开:

enter image description here

然后再把修复后的程序,丢到OllyIceF9直接运行:

enter image description here

这里是变形壳添加的一个暗桩,会导致程序出现异常退出,这里直接nop掉或者把之前的jle(校验)改成jmp,然后保存修改另存文件。然后就可以运行了

enter image description here

4 参考

【百度百科(各种概念)、自己之前的脱文……】 另附一篇脱壳步骤汇总:  http://www.52pojie.cn/thread-259984-1-1.html


   
ReplyQuote
Share: