手动脱壳入门教程第四篇:Aspack 2.11 实战脱壳详解
手动脱壳其实并不神秘,只要备好工具、理清思路,再辅以耐心与细心,就能逐步掌握。今天我们将以 Aspack 2.11 为例进行实战演练,深入了解这款经典加壳工具的运行机制。
先说说工具准备:PEiD 用于查壳识别,OllyDbg 用于手动跟踪调试。平台建议使用 Windows 2000 或 Windows XP,Win9x 系统不太推荐。用 OllyDbg 载入目标程序后,会看到一个入口警告——提示程序已被加壳,选择“不继续分析”即可。
载入后,程序停在这里:
0040D001 60 pushad ; Aspack 壳的入口第一句,记住这个特征
0040D002 E9 3D040000 jmp NOTEPAD.0040D444 ; 直接跳走,结构与 Aspack 1.08 完全不同
继续往下跟踪:
0040D444 81DD 719D255>sbb ebp, 55259D71 ; 到这里
0040D44A E8 14000000 call NOTEPAD.0040D463 ; 这是一个比较近的 Call,F7 单步跟进,F8 会跑飞
这段代码之后是一系列花指令和运算,直到出现一个往回跳的循环:
0040D527 ^ 0F85 C4FFFFFjnz NOTEPAD.0040D4F1 ; 往回跳
0040D52D 66:8BD5 mov dx, bp ; F4 到这里
0040D530 81D9 4192AA9 sbb ecx, 90AA9241
0040D536 ^ E9 00FFFFFF jmp NOTEPAD.0040D43B ; 又往回跳
这里遇到了问题。如果在 0040D52D 处使用 F4,程序会直接跑飞,说明我们无法直接到达下一句。那只能让程序自行往回跳:
0040D43B ^\E9 C7FBFFFF jmp NOTEPAD.0040D007 ; 又跳回入口附近
到这里就会发现,程序实际上绕了一个大圈,又回到了入口处的第三条代码:
0040D001 > 60 pushad
0040D002 E9 3D040000 jmp NOTEPAD.0040D444
0040D007 E8 24040000 call NOTEPAD.0040D430 ; 跳到这里,这不是入口处的第三条代码吗?
从 0040D007 开始,程序进入真正的解压缩流程:
0040D038 8D85 044A440 lea eax, dword ptr ss:[ebp 444A0>
0040D03F FF95 004B440 call dword ptr ss:[ebp 444B00] ; 注意: kernel32.GetModuleHandleA
0040D055 FF95 FC4A440 call dword ptr ss:[ebp 444AFC] ; 注意: kernel32.GetProcAddress
这里连续调用了 GetModuleHandleA 和 GetProcAddress,用于获取 API 函数地址。随后进入一段循环,处理一系列数据:
0040D143 ^ EB EB jmp short NOTEPAD.0040D130 ; 往回跳
0040D145 8B06 mov eax, dword ptr ds:[esi] ; F4 过
0040D149 803E 00 cmp byte ptr ds:[esi], 0
0040D14C ^ 75 F3 jnz short NOTEPAD.0040D141 ; 往回跳
0040D14E 24 00 and al, 0 ; F4 过
0040D160 ^ EB CE jmp short NOTEPAD.0040D130 ; 往回跳
逐步使用 F8 单步跟踪,直到看到一个明显的变化:
0040D3AA 61 popad ; 看到这个,入口就在附近
0040D3B5 68 CC104000 push NOTEPAD.004010CC ; 这个就是 OEP 的值:0x4010CC
0040D3BA C3 retn
到达 OEP 后,程序跨段,并且出现了 Popad 指令。此时可直接使用 OllyDbg 的 Dump 插件进行脱壳:
004010CC 55 push ebp
004010CD 8BEC mov ebp, esp
004010CF 83EC 44 sub esp, 44
004010D2 56 push esi
004010D3 FF15 E463400 call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA
关于重建输入表:OllyDbg 的 Dump 插件提供了两种重建方式。
+ Method2 重建输入表速度很快,但运气不佳时程序可能无法运行。
+ Method1 重建输入表较慢,但成功率更高,更稳定。
对于这个程序,Method2 重建后无法正常运行,而 Method1 重建后可直接运行,无任何问题。
小总结:Aspack 2.11 的壳结构并不复杂,但花指令较多、循环嵌套频繁,手动跟踪时务必保持耐心。关键技巧是:遇到循环时,尽量让程序向前运行,避免其反复往回跳——想办法跳出循环圈。另外,不要完全依赖 PEiD 的入口点分析,只有通过单步跟踪才能真正锻炼寻找 OEP 的能力。
