脱壳技术(二):使用工具脱壳

上一章我们聊了手动脱壳的原理,说白了就是找OEP、修IAT那一套。但说实话,在真实项目中,我们很少每次都手撸汇编。效率太低了。今天我就带你看看,怎么用工具把壳扒干净。

我个人习惯是:能自动就自动,自动不行再手动。UPX这种标准壳,工具一把梭就完事了。但遇到变种壳或者自定义壳,就得OllyDump加ImportREC组合拳了。

UPX -d:最简单的脱壳方式

UPX是最常见的压缩壳。它自带脱壳功能,命令行一行搞定。

upx -d target.exe -o unpacked.exe

就这么简单。但注意,-d是解压,不是删除。我见过有人用-d把源文件搞没了,嗯,血的教训。

警告:UPX -d 只对标准UPX壳有效。如果程序被修改过(比如改过UPX标识),这招就废了。

为什么会失效?因为UPX在加壳时会在文件头写一些标记。如果攻击者改了这些标记,UPX就不认了。我在分析一个恶意样本时就遇到过,对方把"UPX0"改成了"UPX1",结果upx -d直接报错。

OllyDump:手动脱壳的利器

当UPX -d失效时,我们就得请出OllyDump了。它是OllyDbg的一个插件,专门用来转储进程内存。

基本流程是这样的:

  1. 用OllyDbg加载加壳程序
  2. 停在OEP处(怎么找OEP?上一章讲过了)
  3. 右键 → 插件 → OllyDump → Dump debugged process
  4. 设置起始地址和大小,点Dump

这里有个坑:OllyDump默认只dump代码段。如果你的程序有多个节区,比如.data、.rdata,你得手动把它们都勾上。我曾经漏掉了一个资源节,结果脱出来的程序界面全乱了。

小技巧:在OllyDump里,把"Rebuild Import"选项勾上。它会自动修复一部分导入表,省得你后面再折腾。

ImportREC:修复IAT的终极武器

OllyDump出来的程序,十有八九跑不起来。为什么?因为IAT(导入地址表)被壳破坏了。这时候就需要ImportREC出马。

ImportREC的工作原理很简单:它扫描程序用到的所有DLL和API,然后重建一个干净的IAT。

操作步骤:

  1. 打开ImportREC,选择你dump出来的程序
  2. 在OEP字段里填上原始入口点(RVA,不是VA)
  3. 点"自动搜索IAT"
  4. 如果搜到了,点"获取输入表"
  5. 最后点"修复转储文件",选择你的dump文件

嗯,这里要注意:OEP必须填RVA。我见过有人直接填VA,结果ImportREC找不到IAT,修复出来的程序直接崩。

核心要点:ImportREC的OEP字段,填的是OEP相对于基址的偏移。比如OEP在0x00401000,基址是0x00400000,那RVA就是0x1000。

实战:脱一个UPX壳

光说不练假把式。我们拿一个实际的UPX加壳程序来演示。

假设目标程序叫packed.exe,OEP是0x00401000。

第一步:用OllyDbg找到OEP

加载程序后,F9运行,看到pushad/popad对。在popad后下断点,F9跑到OEP。

第二步:OllyDump转储

右键 → OllyDump → 设置起始地址0x00401000,大小选整个代码段。点Dump,保存为dump.exe

第三步:ImportREC修复

打开ImportREC,加载dump.exe。OEP填0x1000。点"自动搜索IAT",看到一堆API被识别出来。点"获取输入表",再点"修复转储文件",选择dump.exe

搞定。现在dump.exe应该能正常运行了。

注意:如果修复后程序还是报错,检查一下有没有被反调试。有些壳会在OEP前做反调试检测,你得先绕过它。

常见问题与避坑

  • OllyDump出来的程序体积巨大:正常,因为dump的是整个内存镜像,包含了很多未初始化的数据。你可以用PE工具手动裁剪。
  • ImportREC搜不到IAT:可能是OEP填错了,或者壳把IAT加密了。试试手动指定IAT的起始地址。
  • 修复后程序闪退:多半是IAT修复不完整。用Process Monitor看看它加载了哪些DLL,缺什么补什么。

我曾经遇到一个壳,它把IAT分成了三块,分散在不同的节区里。ImportREC只找到了第一块,结果程序启动就崩。后来我手动把三块IAT的地址都填进去,才搞定。

知识体系图

下面这张图总结了脱壳工具的核心流程:

脱壳工具核心流程 加壳程序 (packed.exe) 是UPX标准壳? (检查UPX标识) UPX -d 脱壳 命令行一键搞定 手动脱壳流程 OllyDbg + OllyDump 手动脱壳步骤 1. 找OEP (popad后) 2. OllyDump转储内存 3. 保存为 dump.exe ImportREC 修复IAT 脱壳完成 ✅

这张图把整个流程串起来了。核心就三步:找OEP → 转储内存 → 修复IAT。工具只是辅助,理解原理才是根本。

我的建议:刚开始学脱壳,别急着用工具。先手动脱几个标准壳,把流程走一遍。等熟练了,再用工具提速。这样遇到非标准壳时,你才知道怎么手动处理。

好了,脱壳工具的使用就讲到这里。记住,工具是死的,人是活的。遇到问题多想想原理,别死磕工具参数。


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