1. 堆栈平衡法(ESP定律) 壳代码就像一个函数,进入时会开辟堆栈、保存寄存器环境,退出时会恢复堆栈、恢复寄存器。所以应该是堆栈平衡的,那我们可以在壳代码操作了堆栈后对堆栈设置访问或写入断点,然后运行程序,当断点命中的时候,应该就是退出壳代码的时候。在其附近单步几次,应该就能到达程序的原始OEP。 2. 特征定位法 在我们熟悉的程序中,我们可以使用特征来定位程序原始OEP。特征有几种: ① 二进制特征 比如release版的VS2013是: oep入口特征:E8????????E9 第一个CALL内的特征:5657BF4EE640BBBE0000FFFF3BC7 注意:搜索特征应该在程序解密之后再搜索,一般让程序跑起来,在程序代码段开始处搜索,使用Ctrl+B搜索二进制 ② API特征 比如release版的VS2013的第一个API调用是: GetSystemTimeAsFileTime 比如vc6.0的第一个API调用是: GetVersion 比如Delphi程序第一个API调用是: GetModuleHandleA ③编译器特征 IAT调用不同的编译器生成的调用机器码是不一样 vs -》 call [IAT地址] -》 FF15 xx xx xx xx delphi -> jmp [IAT地址] -》 FF25 xx xx xx xx 3. 单步跟踪法