17、脱壳实战(上):使用OD手动寻找OEP、Dump进程、修复导入表
脱壳这件事,说白了就是给程序“卸妆”。
壳本身是一段加密或压缩代码,它先把原始程序藏起来,等运行的时候再解出来。我们的目标,就是找到那个“卸妆”完成的瞬间——也就是原始入口点(OEP)。
我个人习惯用OD(OllyDbg)来做这件事。它轻量、顺手,而且对新手非常友好。今天我们就一步步走一遍手动脱壳的完整流程:找OEP、Dump进程、修复导入表。
17.1 什么是OEP?为什么它这么重要?
OEP,全称Original Entry Point,原始入口点。就是程序原本的代码开始执行的地方。
加壳之后,程序入口被改成了壳的代码。壳先运行,解密、解压缩,然后把控制权交给OEP。你想想看,如果我们能直接跳到OEP,不就等于绕过了壳吗?
核心思路: 脱壳 = 找到OEP + 把内存中的原始程序Dump出来 + 修复导入表让它能独立运行。
17.2 使用OD手动寻找OEP
我常用的方法有两种:单步跟踪法和ESP定律法。今天先讲ESP定律,因为它对大多数压缩壳都有效。
17.2.1 ESP定律的原理
壳在解压原始程序时,通常会先保存当前寄存器的状态。尤其是ESP寄存器,它指向栈顶。壳执行完自己的代码后,会恢复ESP的值,然后跳转到OEP。
所以,如果我们能在壳刚开始执行时,对ESP下硬件断点,那么当壳恢复ESP时,断点就会触发。这时候离OEP通常只有一步之遥。
17.2.2 实战步骤
- 用OD加载加壳程序。停在入口点,通常是pushad指令(保存所有寄存器)。
- 记录当前ESP的值。比如ESP = 0012FFC4。
- 在命令行输入:
hr 0012FFC4(hr = hardware breakpoint on read/write)。 - 按F9运行。程序会断在某个地方,通常是popad或retn附近。
- 单步(F8)几次,直到看到类似
push ebp、mov ebp, esp这样的代码——这就是典型的OEP特征。
小技巧: 我曾经遇到一个壳,ESP定律断下来后,直接就是一个jmp跳转。跳过去就是OEP。这种情况很常见,别慌。
17.3 Dump进程:把内存中的程序抓出来
找到OEP之后,程序已经在内存中完全解密了。这时候我们需要把它的“完整形态”从内存中抓出来,保存成文件。
我推荐使用OD的插件OllyDump,或者用LordPE。这里我用OllyDump演示。
17.3.1 使用OllyDump
- 在OEP处停下(不要运行到OEP里面去)。
- 右键 → 插件 → OllyDump → Dump debugged process。
- 弹窗里会显示当前模块的基址和大小。一般不用改。
- 点击“Dump”,保存为dump.exe。
注意: 这时候dump出来的程序还不能运行。因为导入表(IAT)还是被壳处理过的状态,指向的是壳的跳转表,而不是真正的系统API。这就是我们下一步要修复的东西。
17.4 修复导入表:让程序“活过来”
导入表修复,是脱壳中最容易翻车的一步。我刚开始学的时候,经常卡在这里。
工具用ImportREC,它专门干这个活。
17.4.1 操作步骤
- 打开ImportREC,在“进程”下拉框里选择我们正在OD中调试的进程。
- 填入OEP的RVA(相对虚拟地址)。比如OEP在00401000,基址是00400000,那么RVA = 01000。
- 点击“自动搜索IAT”。ImportREC会尝试扫描导入表。
- 如果扫描成功,会列出所有DLL和函数。点击“获取输入表”。
- 点击“修复转储文件”,选择刚才dump出来的dump.exe。
- ImportREC会生成一个修复后的文件,通常是dump_.exe。
关键点: 如果自动搜索IAT失败,可以手动指定IAT的起始地址和大小。这个地址怎么找?在OD中,找到OEP后,往上翻,通常能看到call dword ptr [xxxx]这样的指令,那个xxxx就是IAT中的地址。记下来,填到ImportREC里。
17.4.2 常见问题
| 问题 | 原因 | 解决办法 |
|---|---|---|
| 修复后程序无法运行 | OEP填错了,或者IAT扫描不完整 | 重新确认OEP,手动指定IAT范围 |
| 程序报“无法定位程序输入点” | 某些API被壳重定向了 | 用ImportREC的“追踪级别”功能,设为1或2 |
| 程序闪退 | 可能是重定位表没修复 | 用LordPE修复重定位表,或者用Relox工具 |
避坑指南: 我曾经修复一个UPX壳的程序,怎么修都报错。后来发现是OEP填错了——我填的是OD里显示的地址,但ImportREC需要的是RVA。记住:RVA = 地址 - 基址。这个坑我踩过两次,现在每次都会先算一遍。
17.5 知识体系流程图
下面这张图概括了手动脱壳的核心流程,我建议你把它记在脑子里。
17.6 总结
手动脱壳其实就三步:找OEP、Dump、修IAT。每一步都有对应的工具和技巧。
我个人建议,刚开始练习时,选一些简单的压缩壳,比如UPX、ASPack。这些壳的OEP特征非常明显,ESP定律几乎百发百中。等你熟练了,再去碰加密壳。
嗯,今天就先到这里。记住,脱壳是个手艺活,多练几次就顺手了。