标题:Armadillo V5.02+Code Splicing+ASPack 2.x双层壳笔记
链接:http://www.unpack.cn/viewthread.php?tid=17006
贴者:unppnu
日期:2007-9-3 13:15
一软件用PEiD查看为ASPack 2.x (without poly) -> Alexey Solodovnikov,用AspackDie脱壳失败。
习惯的打开OD载入文件,运行fly老师的Armadillo4.0-V4.44.Standard.Protection脚本,也跑飞。
看这个程序的EP,看来是伪装的,在新版本中又增加了vm,以前的脱壳方法看来有问题了
无奈,于是开始跟踪之,开始手动脱壳。
=========================================================================================================
清除所有*.udd、*.bak临时文件。OD载入文件,停在EP入口。
00D2FDC2 > E8 E3400000 call MQJSSV9.00D33EAA ; 伪装EP入口
00D2FDC7 ^ E9 16FEFFFF jmp MQJSSV9.00D2FBE2
00D2FDCC 6A 0C push 0C
00D2FDCE 68 B0E0D500 push MQJSSV9.00D5E0B0
00D2FDD3 E8 44150000 call MQJSSV9.00D3131C
00D2FDD8 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
00D2FDDB 33FF xor edi,edi
00D2FDDD 3BCF cmp ecx,edi
00D2FDDF 76 2E jbe short MQJSSV9.00D2FE0F
=========================================================================================================
1、转成单进程。
运行单进程脚本。
7C80EA1B > 8BFF mov edi,edi ; 脚本停在这里。
7C80EA1D 55 push ebp
7C80EA1E 8BEC mov ebp,esp
7C80EA20 51 push ecx
7C80EA21 51 push ecx
7C80EA22 837D 10 00 cmp dword ptr ss:[ebp+10],0
7C80EA26 56 push esi
7C80EA27 0F84 66530300 je kernel32.7C843D93
看堆栈中:
============================================================================
0012F720 00D1BDAA /CALL 到 OpenMutexA 来自 MQJSSV9.00D1BDA4
0012F724 001F0001 |Access = 1F0001
0012F728 00000000 |Inheritable = FALSE
0012F72C 0012FD7C \MutexName = "874:A5426C58F"
============================================================================
2、BP VirtualProtect。
Shift+F9
断在这里:
7C801AD0 > 8BFF mov edi,edi ; wl_hook.100524DC
7C801AD2 55 push ebp
7C801AD3 8BEC mov ebp,esp
7C801AD5 FF75 14 push dword ptr ss:[ebp+14]
7C801AD8 FF75 10 push dword ptr ss:[ebp+10]
7C801ADB FF75 0C push dword ptr ss:[ebp+C]
7C801ADE FF75 08 push dword ptr ss:[ebp+8]
7C801AE1 6A FF push -1
7C801AE3 E8 75FFFFFF call kernel32.VirtualProtectEx
7C801AE8 5D pop ebp
7C801AE9 C2 1000 retn 10
看堆栈中:
============================================================================
0012F464 10005CF4 /CALL 到 VirtualProtect 来自 wl_hook.10005CEE
0012F468 100524DC |Address = wl_hook.100524DC
0012F46C 0000000E |Size = E (14.)
0012F470 00000040 |NewProtect = PAGE_EXECUTE_READWRITE
0012F474 0012F47C \pOldProtect = 0012F47C
继续Shift+F9数次。
0012F648 00D1B8F7 /CALL 到 VirtualProtect 来自 MQJSSV9.00D1B8F1
0012F64C 01541000 |Address = 01541000
0012F650 0006C82C |Size = 6C82C (444460.)
0012F654 00000040 |NewProtect = PAGE_EXECUTE_READWRITE
0012F658 0012F67C \pOldProtect = 0012F67C
继续Shift+F9数次。
00129470 01589946 /CALL 到 VirtualProtect 来自 01589940
00129474 00401000 |Address = MQJSSV9.00401000
00129478 000E9000 |Size = E9000 (954368.)
0012947C 00000004 |NewProtect = PAGE_READWRITE
00129480 0012C164 \pOldProtect = 0012C164
继续Shift+F9,再Alt+F9返回查看代码。
00129470 0158A814 /CALL 到 VirtualProtect 来自 0158A80E
00129474 00CF4F5C |Address = MQJSSV9.00CF4F5C
00129478 00000010 |Size = 10 (16.)
0012947C 00000004 |NewProtect = PAGE_READWRITE
00129480 0012C028 \pOldProtect = 0012C028
Alt+F9返回查看代码,到了地方了。
0158A814 6A 14 push 14
0158A816 E8 FBCA0000 call 01597316
0158A81B 83C4 04 add esp,4
0158A81E 8985 84ABFFFF mov dword ptr ss:[ebp+FFFFAB84],eax
0158A824 83BD 84ABFFFF 00 cmp dword ptr ss:[ebp+FFFFAB84],0
0158A82B 74 59 je short 0158A886
特征码:
6A 14 E8 FB CA 00 00 83 C4 04 89 85 84 AB FF FF 83 BD 84 AB FF FF 00
清除全部断点。
---------------------------------------------------------------------------------------------------------
3、BP CreateThread
Shift+F9。
7C810637 > 8BFF mov edi,edi
7C810639 55 push ebp
7C81063A 8BEC mov ebp,esp
7C81063C FF75 1C push dword ptr ss:[ebp+1C]
7C81063F FF75 18 push dword ptr ss:[ebp+18]
7C810642 FF75 14 push dword ptr ss:[ebp+14]
7C810645 FF75 10 push dword ptr ss:[ebp+10]
7C810648 FF75 0C push dword ptr ss:[ebp+C]
7C81064B FF75 08 push dword ptr ss:[ebp+8]
7C81064E 6A FF push -1
7C810650 E8 D7FDFFFF call kernel32.CreateRemoteThread
7C810655 5D pop ebp
7C810656 C2 1800 retn 18
看堆栈中:
============================================================================
0012F6C8 0157364C /CALL 到 CreateThread 来自 01573646
0012F6CC 00000000 |pSecurity = NULL
0012F6D0 00000000 |StackSize = 0
0012F6D4 015745B0 |ThreadFunction = 015745B0
0012F6D8 00000000 |pThreadParm = NULL
0012F6DC 00000000 |CreationFlags = 0
0012F6E0 0012F6EC \pThreadId = 0012F6EC
============================================================================
取消断点,Alt+F9返回。
返回到这里,F8步进。
0157364C 50 push eax ; 返回到这里,F8步进。
0157364D FF15 84E25A01 call dword ptr ds:[15AE284] ; kernel32.CloseHandle
01573653 5E pop esi
01573654 5B pop ebx
01573655 8BE5 mov esp,ebp
01573657 5D pop ebp
01573658 C3 retn ; 返回。
0158F1EF 83C4 04 add esp,4 ; 返回到这里,F8步进。
0158F1F2 B9 B8B45B01 mov ecx,15BB4B8
0158F1F7 E8 B4BFFBFF call 0154B1B0
0158F1FC 0FB6D0 movzx edx,al
0158F1FF 85D2 test edx,edx
0158F201 74 0C je short 0158F20F
特征码:
83 C4 04 B9 B8 B4 D8 00 E8 04 C5 FB FF 0F B6 D0 85 D2
继续F8步进。
......
0158F2EA 8B42 0C mov eax,dword ptr ds:[edx+C] ; MQJSSV9.00400000
0158F2ED 50 push eax
0158F2EE 8B4D F4 mov ecx,dword ptr ss:[ebp-C]
0158F2F1 2B4D DC sub ecx,dword ptr ss:[ebp-24]
0158F2F4 FFD1 call ecx ; OEP就在里面,F7进入。
0158F2F6 8945 FC mov dword ptr ss:[ebp-4],eax
0158F2F9 8B45 FC mov eax,dword ptr ss:[ebp-4]
0158F2FC 5E pop esi
0158F2FD 8BE5 mov esp,ebp
0158F2FF 5D pop ebp
0158F300 C3 retn
F7进入。
00CF4001 60 pushad ; ASPack OEP!
00CF4002 E8 03000000 call MQJSSV9.00CF400A
00CF4007 - E9 EB045D45 jmp 462C44F7
00CF400C 55 push ebp
00CF400D C3 retn
ASPack OEP=00CF4001
---------------------------------------------------------------------------------------------------------
4、OEP
运行ASPack V2.12脚本。
停在这里:
0040727A - FF25 A0114000 jmp dword ptr ds:[4011A0]
00407280 - FF25 28114000 jmp dword ptr ds:[401128]
00407286 - FF25 80114000 jmp dword ptr ds:[401180]
0040728C - FF25 74124000 jmp dword ptr ds:[401274]
00407292 0000 add byte ptr ds:[eax],al
00407294 68 B4744000 push MQJSSV9.004074B4 ; This is the OEP! Found by fly
00407299 E8 EEFFFFFF call MQJSSV9.0040728C
0040729E 0000 add byte ptr ds:[eax],al
004072A0 0000 add byte ptr ds:[eax],al
004072A2 0000 add byte ptr ds:[eax],al
004072A4 3000 xor byte ptr ds:[eax],al
004072A6 0000 add byte ptr ds:[eax],al
004072A8 70 00 jo short MQJSSV9.004072AA
往上看,函数还没有释放,定位数据窗口Ctrl+G: 401000。
---------------------------------------------------------------------------------------------------------
5、修复IAT Elimination
定位数据窗口Ctrl+G: 00407294。
打开ArmInline,选择该进程,寻回IAT基址。
---------------------------------------------------------------------------------------------------------
6、转存、修复。
1、LordPE--->dump,保存。
2、打开ImportREC,OEP=00407294-00400000=00007294。
3、自动查找IAT,确定,获取输入表,剪切无效指针,修复转存文件Dumped_.exe。
运行脱壳文件Dumped_.exe,提示“不能更改执行文件的默认文件名,否则软件无法执行!”。
那就恢复执行文件的默认文件名,直接运行,OK。

|