ESP法和二次断点法脱壳总结
一直想学一些逆向破解之类的知识,但是起步比较难,听看雪的某个高手说你可以从免杀方面的知识入手,掌握点基础。
首先感谢姬良写的《杀不死的秘密》这本书,真心不错。
1、ESP
原理:维持堆栈平衡
壳程序运行后,首先运行壳部分,然后将原程序还原到内存中并将控制权返还。而大部分压缩壳在运行壳程序时都会将原程序做一个堆栈保护,壳程序运行完成后将原程序还原到内存时会将原先保存的环境恢复供原程序使用,这样我们就可以很轻易的找到OEP。
操作实践:
未加壳程序text.exe
入口点:00001020
加UPX壳程序UPX壳.exe
入口点:0000A7B0
同时也提示加了UPX壳,说明加壳成功。
载入OD(OllyICE),出现下面提示,选择否。
程序停在0040A7B0处,这里有一指令
pushad 这一指令很重要,他的作用是将所有32位寄存器压栈,很显然这是为了保护环境。如果这条指令后面有JMP指令,
那么JMP指令后的地址很可能就是OEP
在看一下寄存器部分注意和下面对比。
F8单步调试
发现ESP变了,EIP为指令寄存器不管它,在下面的Command编辑框中输入
Hr 0012FFA4 在按回车键,在这里下一个硬件中断。F9直接运行。
程序停在Jmp这里 ,在看下图有没有发现寄存器的值和执行pushad指令前一样,这就说明在这里做了环境恢复。
F7调试步入。
这时程序停在00401020出,这时你会觉得很熟悉了,原程序入口点是00001020,这里的00401020是基址00400000加上入口点得到的虚拟地址。既然找到了原程序的入口点了,接下来就是脱壳了。
右击00401020处指令选择Dump debugged process
点击 Dump按钮保存即可,之后我们运行脱壳后的程序,并用Pedit查看和加壳前的程序比较。发现是一样的,说明此次脱壳成功。
总结:改方法脱壳利用堆栈平衡原理,适用于大部分压缩壳,方法简单。但在脱北斗壳是会出现一些假象,不要管他继续Dump即可。
2、二次断点法(又叫内存镜像法)
个人觉得这个原理比较难懂一点,需要一点PE结构的知识。我对这方面原理的理解来自
看雪论坛http://bbs.pediy.com/showthread.php?t=20366
黑客防线http://bbs.hackerxfiles.net/archiver/tid-88027.html
原理: