注:文中涉及到的方法、例子等均来源于52pojie社区,学习过程中总结方便以后阅读
方法一:单步跟踪
F8跟进,遇到跑飞的Call就F7进入
遇到sysenter也会跑飞,同样F7进入,之后单步跟,即可找到OEP
方法二:ESP定律法
单步跟进,发现右侧ESP突变,数据窗口跟随,然后硬件访问>word
运行,之后删除硬件访问,之后单步跟进
方法三:下BP VirtualFree断点(一次运行)
下断点后Shift+F9运行,来到这里
之后F2取消断点,然后Alt+F9执行到用户代码
然后搜索push 8000
然后在此处下断点,运行
取消断点,之后单步跟,之后找到JMP OEP处,继续单步跟即可到达OEP
方法四:下BP VirtualFree断点(两次运行)
同样是下BP VirtualFree断点,然后两次Shift+F9运行
之后F2取消断点
Alt+F9执行到用户代码
之后单步跟,来到JMP OEP处
单步跟,即可到达OEP
方法五
程序拖进OD中,它就会停留在一层
要下的断点就是它的数字,也就是0045de74
下断点之后,运行来到这里
看到有个retn,单步的话会跑飞,所以跳过它在它的下方设置断点
然后运行,取消断点
之后单步跟进,来到JMP OEP处
跟进即可到达OEP
方法六:下bp VirtualAlloc断点
下好bp VirtualAlloc断点后,Shift+F9运行
取消断点,并执行用户代码,也就是ALT+F9
这时候先不单步跟,向下拉会看到一个很熟悉的JMP
F4运行到此处,之后单步跟,来到JMP OEP
再跟一步即可到达OEP
方法七:最后一次异常法
这个方法是利用程序跑飞之前的一次运行来寻找SET句柄从而跟随,但是实际测试中发现同一个程序不同的机器上达到跑飞的次数并不一样,在Win7上面是一次运行直接就跑飞,而在win1上面,程序运行三次才会跑飞,而且并没有寻找到SET句柄,暂时还不知道原因出在哪里。
但是在Win10上面虽然不能用SET句柄跟随,却发现了另一种方式也可以到达OEP
首先在选项的调试设置里面把异常全部取消勾选,之后重新载入程序
同样是利用Shift+F9运行,三次就跑飞,在第二次运行处停止
然后在箭头处,惊奇的发现一个熟悉的JMP
下断点,运行到这里,再取消断点,单步跟
惊奇的发现到达了OEP
然后试了试脱壳,用自带插件脱壳不能正常运行,用修复IAT的方式可以脱壳
———————————————补充————————————————————
之后去了论坛找到一篇帖子,有一个方法和这个比较像,但是他没有运行,而是利用第一个push压栈地址,也就是
而它压入的是eax,所以要跟随的就是eax寄存器的地址,也就是0045de74
然后跟随到这里
在这里有个返回的retn,需要跳过去,在下方断点,运行,再删除断点
然后单步跟,就可以找到JMP OEP的位置
继续单步跟即可到达OEP
方法八:两次内存法
使用OD的快捷栏中的m来到内存窗口,找到程序的第一段的.rsrc
设置断点,Shift+F9运行
然后再一次进入内存窗口,找到它的.text,设置断点,运行
然后下方有个retn,在它的下方设置断点,跳过retn运行
之后单步跟进,找到JMP OEP
继续单步一步即可到达OEP