UPX是一种常见的压缩壳。通过PEID检测到是UPX的壳的话,可以用如下四种方式来脱壳:
单步跟踪法、ESP定律、内存镜像法、POPAD查找法
1.单步跟踪法
执行单步跟踪程序,当发现大跨度跳转如JMP、JE、RETN等指令出现时,程序入口点(Original Entry Point,OEP)可能就在附近。
2. ESP 定律法
ESP是栈顶指针寄存器,保存了下次将要弹出的内容,其遵循堆栈平衡原理,在壳对程序进行操作加密或者压缩时,会把程序的 OEP 压入栈中,当壳执行完成后,进行解密或者解压缩,会把真正的 OEP 从栈中弹出,从而找到程序入口点。
在OD中,按F7键单步执行程序,当ESP 寄存器变红时,右击ESP,以便数据窗口跟随,对该处设置DWORD 硬件断点,然后按F9键运行程序跟踪到 OEP。
3.2次内存镜像法
在壳进行解密或解压缩时,最后释放的是资源区段:.rsrc,这个区段被释放完全后,说明整个程序已经被全部解密。在OD中,按组合键“Alt+M”打开内存窗口,找到第一个资源区段,在此设置断点,按“Shift+F9”组合键运行,再到内存窗口找到地址为401000的代码区段设置断点并运行,结合单步跟踪法找到 OEP。
找到OEP 后使用 OD 的 Dump 功能将当前程序代码保存下来,再使用输入表重建工具 ImportREC 修复该程序。
案例 ESP定律
查壳
OD打开
F8 发现ESP、EIP变红了
1、右击ESP选择Follw inDumb(数据窗口中跟随)
2、选中前4个字节右击选择Breakpoint 、Herd ware,on access (设置硬件断点)
3、F9运行 注意^
4、点0040E620 (也就是jnz下面的一行)F4 、F8
5、继续F8 发现进入OEP 直接右击选择Dump debugged process Dump下来
6、之后可以用输入表重建工具 ImportREC 修复该程序