软件加壳本质就是隐藏了程序的真正oep,无法达到真实的入口点就根本无法脱壳
记录常见的寻找OEP方法:
1.一步直达法
利用壳的特征,壳一般在执行完壳代码之后需要跳转到OEP处,而这个跳转指令一般是call ,jmp ,push retn类型的指令,而且因为壳代码所在的区段和OEP代码所在的区段一般属于不同的区段,所以我们可以通过搜索这些特殊指令的机器码并查看其跳转范围,如果跳转范围较大(也就是跨段跳转)则可以判断为此指令会跳到OEP处
2.单步跟踪法
用OD载入,不分析代码,单步向下跟踪F8,是向下跳的让它实现,遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选),绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现,如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,这样很快就能到程序的OEP,在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中按F7进入,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就会到程序的OEP。
这种方法实际是利用了壳代码的一般逻辑都是先解压缩原程序的各个区段和一些简单处理,然后最后跳转到OEP处。所以可以忽略前面的那些操作,直接去寻找OEP跳转的指令。这种方法也是存在一定的偶然性,对一些简单的壳能起到奇效
3.ESP定律法
利用堆栈平衡,一般壳代码在执行的时候回保存寄存器环境,在跳转到OEP处的时候再恢复环境。我们可以利用此特点在执行完push指令保存环境后,对堆栈设置硬件访问断点或内存访问断点。这样在跳转到OEP前其会执行pop指令,程序就会暂停我们就可以单步向下跟踪寻找OEP跳转指令
4.内存映像法
通过对加载到内存中的程序下内存断点来寻找OEP,因为加壳程序在解压缩各个区段后会跳转到OEP执行此处的代码,所以我们可以通过先对OEP所在的区块设置内存写入断点,待此区段解压缩完成后我们再在此区块上设置内存访问断点。这样当程序执行到OEP处时就会暂停
5.最后一次异常法
有的加壳程序会在执行壳代码的时候设置很多异常来干扰脱壳破解者,其会在各个异常的异常处理程序中检测断点以及进行反调试。所以我们如果还用esp定律,内存映像等下断点的方法就会失效。我们需要将这些异常执行完之后在采取以上办法。最后一次异常法就是寻找到程序最后一次异常发生的指令,当最后一次异常执行后再采取常规方法寻找OEP