实例程序加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程序。