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 实战步骤

  1. 用OD加载加壳程序。停在入口点,通常是pushad指令(保存所有寄存器)。
  2. 记录当前ESP的值。比如ESP = 0012FFC4。
  3. 在命令行输入: hr 0012FFC4(hr = hardware breakpoint on read/write)。
  4. 按F9运行。程序会断在某个地方,通常是popad或retn附近。
  5. 单步(F8)几次,直到看到类似push ebpmov ebp, esp这样的代码——这就是典型的OEP特征。

小技巧: 我曾经遇到一个壳,ESP定律断下来后,直接就是一个jmp跳转。跳过去就是OEP。这种情况很常见,别慌。

17.3 Dump进程:把内存中的程序抓出来

找到OEP之后,程序已经在内存中完全解密了。这时候我们需要把它的“完整形态”从内存中抓出来,保存成文件。

我推荐使用OD的插件OllyDump,或者用LordPE。这里我用OllyDump演示。

17.3.1 使用OllyDump

  1. 在OEP处停下(不要运行到OEP里面去)。
  2. 右键 → 插件 → OllyDump → Dump debugged process。
  3. 弹窗里会显示当前模块的基址和大小。一般不用改。
  4. 点击“Dump”,保存为dump.exe。

注意: 这时候dump出来的程序还不能运行。因为导入表(IAT)还是被壳处理过的状态,指向的是壳的跳转表,而不是真正的系统API。这就是我们下一步要修复的东西。

17.4 修复导入表:让程序“活过来”

导入表修复,是脱壳中最容易翻车的一步。我刚开始学的时候,经常卡在这里。

工具用ImportREC,它专门干这个活。

17.4.1 操作步骤

  1. 打开ImportREC,在“进程”下拉框里选择我们正在OD中调试的进程。
  2. 填入OEP的RVA(相对虚拟地址)。比如OEP在00401000,基址是00400000,那么RVA = 01000。
  3. 点击“自动搜索IAT”。ImportREC会尝试扫描导入表。
  4. 如果扫描成功,会列出所有DLL和函数。点击“获取输入表”。
  5. 点击“修复转储文件”,选择刚才dump出来的dump.exe。
  6. 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 知识体系流程图

下面这张图概括了手动脱壳的核心流程,我建议你把它记在脑子里。

手动脱壳核心流程 1. 寻找OEP ESP定律 / 单步跟踪 找到push ebp / mov ebp,esp 记录OEP地址 2. Dump进程 OllyDump 插件 保存为 dump.exe 此时还不能运行 3. 修复导入表 ImportREC 打开进程 填入OEP的RVA 自动搜索IAT并修复 ✅ 得到可独立运行的脱壳程序

17.6 总结

手动脱壳其实就三步:找OEP、Dump、修IAT。每一步都有对应的工具和技巧。

我个人建议,刚开始练习时,选一些简单的压缩壳,比如UPX、ASPack。这些壳的OEP特征非常明显,ESP定律几乎百发百中。等你熟练了,再去碰加密壳。

嗯,今天就先到这里。记住,脱壳是个手艺活,多练几次就顺手了。

公众号:蓝海资料掘金营,微信deep3321