对于加了壳的软件,要寻找其OEP(Origin entry pointer)入口点的时候,该如何去寻找
1.根据跨段指令去寻找OEP
绝大多数加壳程序在被加密的程序中加上一个或多个区块,这个可以使用PEID软件去查看相应的区段(section)。
这个方法的思路是:一般是跟踪软件,一直跟踪,然后看起跨段指令,最后得出OEP。
加壳程序的入口点代码如下。
一直跟踪就能跟出外壳程序,外壳程序以push 0x401130 retn这两句来结尾,等价于jmp 0x401130,跳转程序的真正入口点。
2.用内存访问断点找OEP
思路:就是外壳首先将原来压缩的代码解压,并放在对应的区块上,处理完后将跳到代码段上运行。就是对代码设置两次内存访问断点,第一次设置之后,当解压函数将各个区块解压完成之后,并放到相应地内存地址处后,再对代码段设置断点,因为解压完之后要跳转到代码段中执行,所以当跳转中,对代码段设断点就会被暂停,就能找到相应地入口点。
3.根据堆栈平衡原理找OEP
编写加壳软件时,必须保证外壳初始化的现场环境(各寄存器值)与原程序的现场环境是相同的。加壳程序在初始化时保存了各寄存器的值,当外壳执行完毕之后,在恢复各寄存器内容,最后再跳到原程序执行。通常使用pushad/popad、pushfd/popfd指令对来保存于恢复现场环境。
所以外壳程序开始时的esp值与加壳后的esp值是完全一模一样的。
使用可以对相应的寄存器值设置硬件访问断点,hr +address
这种方法很快就可以找到相应的OEP
4.根据编译语言特点找OEP
常见语言的人口代码,对相应的函数设置断点,两次之后,就能很容易找到OEP。