【文章标题】: 炒冷饭之穿山甲的传说1
【文章作者】: eJamse
【目标程序】: GameJack5042
【加壳方式】: Armadillo
【下载地址】: 见附件
【使用工具】: OD PEID ExeinfoPE LordPE ImportRec ArmInline0.96
【操作平台】: Win7 sp1实环境(Win7下函数前记得要加库名,譬如kernel32.)
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这一篇是学习chasgone大侠《armadillo中code splicing的几种处理方法》的心得,所不同的是我这里是“一鱼三吃”。对穿山甲采用爆菊法不利的时候,就要拿出集武功之大成的玄门正宗功夫来对付它,以便双杀锁定胜局。谨以此文献给那些跟我一样摸爬滚打、颠簸在路上的新手们,并在此向chasgone大侠致敬!
下面开始:
1、用PEID查壳为:
Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks
Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 用ExeinfoPE查壳,显示为:
Armadillo 4.4x ~ 4.62..5.0~7.0 32bit - www.siliconrealms.com (60e8)
Armadillo 4.4x ~ 4.62..5.0~7.0 32bit - www.siliconrealms.com (60e8) 2、试运行,显示为单进程,有试用提示窗体;
3、OD载入目标GameJack.exe,忽略所有异常,隐藏OD,下HE kernel32.GetModuleHandleA硬件断点,并Shift+F9运行,两次弹窗点OK,断下来后看堆栈:
00129270 00916AFD /CALL 到 GetModuleHandleA 来自 00916AF7
00129274 0092BD6C \pModule = "kernel32.dll"
00129278 0092DDAC ASCII "VirtualAlloc"
00129270 00916AFD /CALL 到 GetModuleHandleA 来自 00916AF7
00129274 0092BD6C \pModule = "kernel32.dll"
00129278 0092DDAC ASCII "VirtualAlloc" 继续F9看堆栈:
00129270 00916B1A /CALL 到 GetModuleHandleA 来自 00916B14
00129274 0092BD6C \pModule = "kernel32.dll"
00129278 0092DDA0 ASCII "VirtualFree"
00129270 00916B1A /CALL 到 GetModuleHandleA 来自 00916B14
00129274 0092BD6C \pModule = "kernel32.dll"
00129278 0092DDA0 ASCII "VirtualFree" 继续F9看堆栈:
00128FD4 00905A49 /CALL 到 GetModuleHandleA 来自 00905A43
00128FD8 00129124 \pModule = "kernel32.dll"
00128FD4 00905A49 /CALL 到 GetModuleHandleA 来自 00905A43
00128FD8 00129124 \pModule = "kernel32.dll" 4、此时到达最佳返回时机,删除断点alt+f9返回,找到魔法跳
......
00905A63 FF15 B8629200 call dword ptr ds:[9262B8] ; kernel32.LoadLibraryA
......
00905A7A 0F84 2F010000 je 00905BAF;魔法跳
......
00905A63 FF15 B8629200 call dword ptr ds:[9262B8] ; kernel32.LoadLibraryA
......
00905A7A 0F84 2F010000 je 00905BAF;魔法跳 5、改魔法跳为jmp:
00905A7A /E9 30010000 jmp 00905BAF
00905A7F |90 nop
00905A7A /E9 30010000 jmp 00905BAF
00905A7F |90 nop 跟随jmp往下找到:
00905BBE ^\0F85 49FEFFFF jnz 00905A0D
00905BC4 EB 03 jmp short 00905BC9
00905BBE ^\0F85 49FEFFFF jnz 00905A0D
00905BC4 EB 03 jmp short 00905BC9 点00905BC4这一行F4,再回头撤销魔法跳的更改;
方法一:先发制人----移花接木法
6、下断HE kernel32.VirtualAlloc并F9运行,断下后alt+f9返回,注意观察EAX的值,若为0则继续F9并alt+f9返回,当第一次出现EAX=03460000(不是定值),打开M镜像观察还没有03460000段,表示壳要开辟新空间03460000了,此时继续F9并alt+f9返回,马上观察M镜像已经有了03460000段,双击它显示全为0,说明火候到了,此时将EAX的值改为.adata段的起始值004F8000,删除断点
7、下断HE kernel32.SetProcessWorkingSetSize并F9运行,4次弹窗都点OK,先不取消断点,再下断点:HE kernel32.GetCurrentThreadId并F9运行,断下后alt+f9返回,
00325E54 50 push eax
00325E55 FF75 FC push dword ptr ss:[ebp-4]
00325E58 E8 05000000 call 00325E62
00325E5D 83C4 0C add esp,0C
00325E60 C9 leave
00325E61 C3 retn
00325E54 50 push eax
00325E55 FF75 FC push dword ptr ss:[ebp-4]
00325E58 E8 05000000 call 00325E62
00325E5D 83C4 0C add esp,0C
00325E60 C9 leave
00325E61 C3 retn 8、删除两个断点,单步F8直到返回在
向下找到
0034039B FFD1 call ecx;段尾最近的CALL
0034039D 8945 FC mov dword ptr ss:[ebp-4],eax
003403A0 8B45 FC mov eax,dword ptr ss:[ebp-4]
003403A3 5F pop edi
003403A4 5E pop esi
003403A5 C9 leave
003403A6 C3 retn
0034039B FFD1 call ecx;段尾最近的CALL
0034039D 8945 FC mov dword ptr ss:[ebp-4],eax
003403A0 8B45 FC mov eax,dword ptr ss:[ebp-4]
003403A3 5F pop edi
003403A4 5E pop esi
003403A5 C9 leave
003403A6 C3 retn 9、点0034039B这一行F4,再F7跟入到达OEP=0046F114,此时用LordPE(修正大小)来Dump为dumped.exe,填入OEP:6F114,ImportREC自动方式获取API,剪切多余项,转存为dumped_.exe;
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: