Armadillo V5.02+Code Splicing+ASPack 2.x双层壳笔记
 

标题: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。

上一篇   下一篇