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。经试验,

是对的。