根据堆栈平衡原理寻找OEP

实例程序加eXPressor1.3.0.1这种壳。

0x00 首先OD加载程序,F9运行,大致知道程序运行过程。

 

0x01 Alt+M查看程序结构。我们可以发现PE头的起始地址是400000,基址地址为401000(代码段)。我们要知道一点,程序正常的OEP是从代码段开始的,而我们的程序起始地址是46B7209,明显超出代码段起始地址。这个地址是壳程序的起始地址,我们的任务是找到程序正常的OEP。

 

0x02 堆栈平衡法寻找OEP(原理暂时未知)主要是跟踪堆栈寄存器ESP的值的变化。我们最先载入程序时,ESP=12FFC4。

之后我们F8单步调试,注意观察ESP的变化,在ESP第一次发生变化的地方停止。然后跟踪数据段。

 

在数据段中下一个硬件断点(普通软件断点重新加载后会失效)

0x03 重新载入程序。F9运行至断点处停下,这时候会看到一个“jmp eax“指令 这个指令将要跳转的地方就是程序正常的OEP。F8步过执行指令,跳转至程序OEP。

我们可以看到此时的逻辑地址是4271B0,处于代码段之内。到此OEP已经成功找到了,我们利用OD的插件将这个dump导出。

然后用OD载入dump后的程序,查看程序入口地址。

 

0x04 重构PE结构。(LordPE工具)

用LordPE加载我们dump出来的程序。

在这里我们要检查这里的代码基址,数据基址等等数据是否合理,并且对照OD中的PE格式(Alt+M)做出合理修改。这里将代码基址我们修改为1000。(通常情况Win32程序都是起始地址为400000,代码基址为1000),保存,确定。(有时还可以删除OPE的多余区段)

多余区段清除(不是本程序)

最后一步重建修改后的PE程序。

 

猜你喜欢

转载自blog.csdn.net/CSDNPM250/article/details/81542049