单步跟踪
将程序载入OD,然后单步F8进行跟踪,遇到向下的跳转就跟着跳,遇到向上的跳转就在它跳转的下一行按F4让他直接运行下来。然后一步步的跟踪,再遇到一个跨度很大的跳转(一般是jmp跳转)就可以到达真正的OEP,就可以进行脱壳了。这里解释下,一般情况下,程序的壳的代码在后面,所以,它一些向上的跳转就是进行一些替换,然后最后的一个大跳转,就是替换完毕,然后开始运行真正的程序。
ESP定律
载入OD以后,开始单步F8,然后遇到第一个push的时候注意右边的寄存器窗口,关注ESP寄存器,当发现它变化了之后,就可反手键选择在数据窗口中跟随,然后在第一行的位置全部选择,反手键,选择断点,硬件访问的word或者dword。然后F9运行,等到断下来的时候继续F8运行,直到继续遇到大跳转,到达OEP。(这里的堆栈平衡主要是程序加了壳以后,会进行一个压栈操作,然后有压栈必定有出栈,那么就可以用堆栈平衡法)
二次内存镜像
忽略所有异常全部取消,然后打开内存界面,在.rsrc段按F2下断,然后shift+F9运行,断下来以后,再次在内存界面中的.code段F2下断,再次shift+F9,然后就可以到达程序的OEP。对于这个方法,可以理解为程序先让它的壳的代码进行加载,然后壳加载完毕之后,程序肯定要到自己的OEP,这时候我们在代码段下的断就会把它断下来,我们就可以捕捉到真正的OEP了。
最后一次异常
取消忽略所有异常,然后一直shift+F9,记得数你按了几次shift+F9(假设是n次),然后再次载入,,按n-1次shift+f9,到了以后查看右下角的堆栈窗口,选择SE句柄那一句,我们就可反手键数据窗口跟随,然后再在数据窗口全选第一行,反手键选择内存写入断点,shift+F9,到了以后,F8几步就会到达真正的OEP。我们第一次不需要取消忽略所有异常,直接让程序运行,然后打开OD的log窗口,查看它有几次访问违例,就再第二次载入程序的时候,按几次shift+f9。然后再在内存段下断,就会来到OEP。