方法1:单步跟踪 |
F8单步跟踪,向上不能让他跳,有loopd循环也一样(跳转的下一行按F4:运行到选定位置,循环loopd在call下一句F4执行) 只允许向下跳,如单步跟踪CALL处程序运行,则需要重载程序,再CALL处F7跟进(近CALL F7,远CALL F8) |
pushad 入栈 |
popad:出栈 出栈就离OEP不远了 |
看基址如有大的跳转则为调到OEP,到达OEP后就壳脱壳 |
005791EE 61 popad |
005791EF - E9 98E1EFFF jmp rmvbfix.0047738C |
0047738C 55 push ebp |
0047738D 8BEC mov ebp,esp |
0047738F 83C4 F0 add esp,-0x10 |
00477392 B8 2C714700 mov eax,rmvbfix.0047712C ; UNICODE "K" |
找到OEP后下来就是脱壳,两种方法 |
1)OD插件OllyDump, |
2)LordPE:选择进程->修正镜像大小并完整保存->运行ImportREC输入表重建程序,找进程,OEP改为找到的OPE基址,取后5位,然后自动查找IAT,获取输入表,修复转存文件 |
注:如遇到SRV病毒,需要脱壳后在导入OD分析,如下位SRV病毒OEP特点 |
00579080 60 pushad |
00579081 BE 00104F00 mov esi,rmvbfix.004F1000 |
00579086 8DBE 0000F1FF lea edi,dword ptr ds:[esi-0xF0000] |
0057908C 57 push edi |
0057908D 83CD FF or ebp,-0x1 |
00579090 EB 10 jmp short rmvbfix.005790A2 |
方法2:ESP定律法 |
F8单步一下进入下一行,寄存器窗口ESP显示红色,ESP右键 数据窗口中跟随或命令 dd或hr ESP基址来到大跳转->在第一行数值 右键 断点-硬件访问断点 word->F9运行->删除硬件断点,单步直达OEP |
dd XXXXX-->ESP地址 |
hr XXXXX-->ESP地址 |
方法3:2次内存镜像法 |
m:在区段的程序段.rsrc(第一个.rsrc)下断点,运行,然后在进入m在00401000在下断点运行,F8单步到popad->oep |
注意:如在第一个程序区段无.rsrc,则直接在00401000(code)处下断点 |
方法4:一步直达法 |
不是什么壳都适用。绝大多数UPX和ASPACK |
查找popad(取消勾选整个区块),单步到大跳转OEP,可多次查找popad |
方法5.最后一次异常法 |
1.调试选项忽略所有异常 |
载入程序shift+F9运行知道程序运行跑飞,记下次数比如5次,则重新载入按5-1=4次,然后找到如下SE句柄,转到表达式,然后下断点并运行,取消断点然后单步跟踪 |
方法6.脱壳脚本
插件-》OdbgScript-运行脚本 打开脱壳脚本,直达OEP(不一定准确,不准时需继续单步)