2024年5月7日发(作者:)
第31课 内存二次断点法
内存二次断点法的原理是:第一次,先通过对数据(data) 、资源(rsrc )、rdata、idata等
区段下断,以达到等待壳对代码(code)段解压完毕的目的;第二次,在代码段寻找OEP。
一般来说,壳是最后对代码(code)段解压的。
[例1] ex1710,PESHiELD 0.25加壳的win98记事本脱壳
由于此程序调试时经常莫名其妙地退出,故有反调试代码,故需要在“插件”中隐藏调试器
OllyICE载入后程序停在40D000
0040D000 > 60 pushad
0040D001 E8 2B000000 call 0040D031
首先OllyDbg异常设置:忽略所有异常
首先,对主程序的资源区段下内存断点,看到资源区段变红
然后Shift+F9来到:
7C9322FD 66:8B50 0C mov dx, word ptr [eax+C]
7C932301 66:8955 B4 mov word ptr [ebp-4C], dx
Alt+M再次打开内存镜像,在主程序的代码区段下内存断点,看到代码区段变红
Shift+F9来到:
接下来,命令行进行条件追踪,tc eip<405000
,不一会儿就停在了OEP:
用OllyDbg的Dump插件直接脱壳,选方式一,修复输入表即可。
[例2] ex1711,
OllyICE载入后程序停在40C000
0040C000 > 60 pushad
0040C001 E8 00000000 call 0040C006
首先OllyDbg异常设置:忽略所有异常
F9运行或点按钮,点Shift+F9程序运行。故重新来过,重复上面的步骤
堆栈窗口如下:
OllyDbg主窗口右键菜单“转到→表达式”
输入00a6046f
在00A6046F行F2下断,然后Shift+F9,取消断点。接下来,Alt+M打开内存镜像,使用内
存二次断点法直接来到OEP。
第一次的区段
第二次的区段
最后,用LordPE转存程序,用Import REConstructor修复输入表,用三个级别分别修复,
还剩3个无效指针。分别为639C、63A0和63E4。尝试用svkp插件失败。
根据前人总结的经验:SVKP无法识别的加密函数一般是GetProcAddress、
GetModuleHandleA、GetCommandLineA、 ExitProcess、GetVersion等。由于Import
REConstructor修复时没有发生退出现象,所以ExitProcess排除。
GetStartupInfoA之后的函数一般是GetModuleHandleA,GetModuleHandleA一般出现在
GetProcAddress前面。已知GetStartupInfoA,所以639C、63A0可以确定。
而63E4位于OEP开头
入口开始的头两个函数肯定是GetVersion或GetCommandLineA。经试验,
是对的。
发布评论