加壳技术最初是为了压缩可执行文件的大小而诞生的。
从软件开发的角度看,加壳的目的是为了保护软件,防止其被逆向分析或破解。可以将其简单理解为给软件加装了一个保护罩。程序运行时,首先执行“保险箱”的代码(即壳),进行环境验证、数据解密或内容解压,最后才将真正的“宝物”(原始程序)安全地呈现出来。从防御角度来看,这可以有效防止攻击者将软件直接拖入调试器进行分析,保护核心算法和商业利益。当然,这种保护并非绝对,程序仍然存在被“脱壳”的可能。
然而,在混沌的网络安全领域,加壳技术有了截然不同的应用。攻击者给恶意软件加壳,可以隐藏其关键特征码,从而绕过杀毒软件或端点检测与响应系统的静态查杀。
壳的主要类型
1. 压缩壳
这类壳对应其最初的概念,主要为压缩文件服务。其保护性很弱,容易被破解,用于免杀时也极易被查杀。但由于技术门槛相对较低,是新手常见的练手工具,很多常见的压缩软件就能实现基础功能。
2. 加密壳/保护壳
这是实现免杀最常见的一种方式,其底层原理是对代码或数据进行加密。保护性比压缩壳强,但通过深入分析仍有被脱壳的可能。
3. 虚拟机壳
这是保护壳中的重量级选手。它的核心原理是在指令集层面进行自定义,将原始代码的指令转换为一套只有壳内解释器才能理解的“虚拟指令”。想要逆向这样的程序,其难度相当于逆向一整个自定义的CPU,因此防护能力极强。
脱壳方法实践
对于逆向分析人员而言,掌握脱壳技术是基本技能。常见的调试工具如OllyDbg、Windbg等是进行渗透测试与分析的必要工具。以下是一些常见的脱壳思路与方法整理。
对于无加密的压缩壳(例如UPX),通常可以直接使用其自带命令进行脱壳:
upx -d target.exe
对于更复杂的壳,则需要借助调试器手动操作,以下是一些经典的脱壳方法:
1. 单步跟踪法
(1)使用OD载入程序,选择“不分析代码”。
(2)单步向下跟踪(F8),只实现向下的跳转,向上的跳转通过按F4(运行到所选)来跳过。
(3)遇到程序往回跳的(包括循环),在下一句代码处按F4。
(4)绿色线条表示跳转未实现,可忽略;红色线条表示跳转已实现。
(5)如果载入程序后附近就有CALL,建议按F7跟进,否则程序容易跑飞。
(6)在跟踪时,如果运行到某个CALL程序就执行了,则在这个CALL中按F7进入。
(7)通常遇到很大的跨段跳转(如 jmp XXXXXX 或 retn),可能很快就能到达程序的原始入口点。
2. ESP定律法
(1)开始后按F8,注意观察OD寄存器窗口中的ESP值是否突然变红。
(2)在命令行下输入:dd XXXXXXXX(指当前ESP地址)或 hr XXXXXXXX,按回车。
(3)在数据窗口选中该地址,设置断点 -> 硬件访问 -> Word断点。
(4)按一下F9运行程序,通常会停在跳转处,再按F8即可到达OEP。
3. 内存镜像法
(1)用OD打开程序。
(2)点击选项 -> 调试选项 -> 异常,勾选所有忽略异常选项,然后按Ctrl+F2重载程序。
(3)按ALT+M打开内存镜像,找到程序的第一个 .rsrc 节,按F2下断点。
(4)按SHIFT+F9运行到该断点。
(5)再次按ALT+M,找到 .rsrc 节上方的 .code 节(通常是00401000处),按F2下断点。
(6)按SHIFT+F9或F9,即可直接到达程序的OEP。
4. 一步到达OEP法
(1)载入程序后,按Ctrl+F搜索 popad 指令(此方法适用于UPX、ASPACK等少数壳)。
(2)在找到的 popad 处按F2下断点,然后按F9运行到此处。
(3)接下来通常会出现一个大的跳转指令,按F8跟随即可到达OEP。
5. 最后一次异常法
(1)用OD打开程序,在调试选项中取消所有异常勾选。
(2)按Ctrl+F2重载程序,程序开头通常是一个跳转。
(3)连续按SHIFT+F9,直到程序正常运行,记下按键次数 m。
(4)再次重载程序,按SHIFT+F9共 m-1 次。
(5)观察OD右下角的“SE句柄”,按Ctrl+G,输入句柄前的地址。
(6)按F2下断点,然后按SHIFT+F9来到断点处。
(7)取消断点,按F8向下跟踪,即可到达OEP。
6. 模拟跟踪法
(1)先试运行,跟踪程序,检查是否有SEH暗桩。
(2)按ALT+M打开内存镜像,找到包含“SFX, imports, relocations”等描述的模块。
(3)若其地址为 00xxxxxx,在命令行输入 tc eip < 00xxxxxx,回车开始跟踪。
7. SFX法
(1)设置OD,在异常选项卡中勾选所有异常忽略选项。
(2)切换到SFX选项卡,选择“字节模式跟踪实际入口(速度非常慢)”,确定。
(3)重载程序(如果弹出“压缩代码?”的提示,选择“否”),OD可能会直接到达OEP。
本文部分方法参考自技术社区分享。