脱壳技术(二):使用工具脱壳
上一章我们聊了手动脱壳的原理,说白了就是找OEP、修IAT那一套。但说实话,在真实项目中,我们很少每次都手撸汇编。效率太低了。今天我就带你看看,怎么用工具把壳扒干净。
我个人习惯是:能自动就自动,自动不行再手动。UPX这种标准壳,工具一把梭就完事了。但遇到变种壳或者自定义壳,就得OllyDump加ImportREC组合拳了。
UPX -d:最简单的脱壳方式
UPX是最常见的压缩壳。它自带脱壳功能,命令行一行搞定。
upx -d target.exe -o unpacked.exe
就这么简单。但注意,-d是解压,不是删除。我见过有人用-d把源文件搞没了,嗯,血的教训。
为什么会失效?因为UPX在加壳时会在文件头写一些标记。如果攻击者改了这些标记,UPX就不认了。我在分析一个恶意样本时就遇到过,对方把"UPX0"改成了"UPX1",结果upx -d直接报错。
OllyDump:手动脱壳的利器
当UPX -d失效时,我们就得请出OllyDump了。它是OllyDbg的一个插件,专门用来转储进程内存。
基本流程是这样的:
- 用OllyDbg加载加壳程序
- 停在OEP处(怎么找OEP?上一章讲过了)
- 右键 → 插件 → OllyDump → Dump debugged process
- 设置起始地址和大小,点Dump
这里有个坑:OllyDump默认只dump代码段。如果你的程序有多个节区,比如.data、.rdata,你得手动把它们都勾上。我曾经漏掉了一个资源节,结果脱出来的程序界面全乱了。
ImportREC:修复IAT的终极武器
OllyDump出来的程序,十有八九跑不起来。为什么?因为IAT(导入地址表)被壳破坏了。这时候就需要ImportREC出马。
ImportREC的工作原理很简单:它扫描程序用到的所有DLL和API,然后重建一个干净的IAT。
操作步骤:
- 打开ImportREC,选择你dump出来的程序
- 在OEP字段里填上原始入口点(RVA,不是VA)
- 点"自动搜索IAT"
- 如果搜到了,点"获取输入表"
- 最后点"修复转储文件",选择你的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应该能正常运行了。
常见问题与避坑
- OllyDump出来的程序体积巨大:正常,因为dump的是整个内存镜像,包含了很多未初始化的数据。你可以用PE工具手动裁剪。
- ImportREC搜不到IAT:可能是OEP填错了,或者壳把IAT加密了。试试手动指定IAT的起始地址。
- 修复后程序闪退:多半是IAT修复不完整。用Process Monitor看看它加载了哪些DLL,缺什么补什么。
我曾经遇到一个壳,它把IAT分成了三块,分散在不同的节区里。ImportREC只找到了第一块,结果程序启动就崩。后来我手动把三块IAT的地址都填进去,才搞定。
知识体系图
下面这张图总结了脱壳工具的核心流程:
这张图把整个流程串起来了。核心就三步:找OEP → 转储内存 → 修复IAT。工具只是辅助,理解原理才是根本。
我的建议:刚开始学脱壳,别急着用工具。先手动脱几个标准壳,把流程走一遍。等熟练了,再用工具提速。这样遇到非标准壳时,你才知道怎么手动处理。
好了,脱壳工具的使用就讲到这里。记住,工具是死的,人是活的。遇到问题多想想原理,别死磕工具参数。
公众号:蓝海资料掘金营,微信deep3321