Armadillo加壳某DLL脱壳问题探讨
用PEID检测为Armadillo 2.51 - 3.xx DLL Stub -> Silicon Realms Toolworks壳。
这个壳和别的Armadillo壳不一样,到壳入口时IAT已经处理完毕。所以到壳入口后再bp GetModuleHandleA+5 无法找到返回时机。
用OD载入,来到壳入口:
10037405 t>/$ 55 push ebp///壳入口。
10037406 |. 8BEC mov ebp,esp
10037408 |. 53 push ebx
10037409 |. 8B5D 08 mov ebx,dword ptr ss:[ebp+8]
1003740C |. 56 push esi
1003740D |. 8B75 0C mov esi,dword ptr ss:[ebp+C]
10037410 |. 57 push edi
10037411 |. 8B7D 10 mov edi,dword ptr ss:[ebp+10]
10037414 |. 85F6 test esi,esi
10037416 |. 75 09 jnz short 10037421 ; 10037421
到壳入口时IAT已经被加密:
1001E000 9A 22 DA 77 34 95 97 00 ?邝4?.
1001E008 B1 63 DB 77 74 91 97 00 便埙t?.
1001E010 8D 5E 97 00 3D 51 31 77 ??=Q1w
1001E018 B1 38 31 77 A0 5E 97 00 ?1w_^?
1001E020 6C 3C 19 7E D7 1C 19 7E l<~?~
1001E028 82 1D 19 7E A7 50 19 7E ?~?~
设置OD载入时断在系统断点,然后重新载入DLL,接着bp GetModuleHandleA+5,断下时观察堆栈:
0006D848 00974E83 返回到 00974E83 来自 kernel32.GetModuleHandleA
0006D84C 0006D984 ASCII "advapi32.dll"///注意出现这个时,再F9一下就到返回时机了。
0006D850 0B497BF8
0006D9B0 009756BA 返回到 009756BA 来自 kernel32.GetModuleHandleA///到返回时机了。
返回:
009756BA 3945 08 cmp dword ptr ss:[ebp+8],eax ; LOADDLL.00400000
009756BD 75 07 jnz short 009756C6
009756BF B9 E0539900 mov ecx,9953E0
009756C4 EB 52 jmp short 00975718
009756C6 393D D8599900 cmp dword ptr ds:[9959D8],edi
009756CC B9 D8599900 mov ecx,9959D8
009756D1 0F84 93000000 je 0097576A ///改为JMP可以避开IAT加密。
009756D7 8B35 00B89900 mov esi,dword ptr ds:[99B800]
009756DD A1 80F89900 mov eax,dword ptr ds:[99F880]
009756E2 F641 08 01 test byte ptr ds:[ecx+8],1
009756E6 74 0E je short 009756F6
009756E8 8B50 5C mov edx,dword ptr ds:[eax+5C]
009756EB 3350 48 xor edx,dword ptr ds:[eax+48]
009756EE 3350 1C xor edx,dword ptr ds:[eax+1C]
009756F1 F6C2 80 test dl,80
重定位表处理:
0098878D 90 nop
0098878E 90 nop
0098878F 8B15 84F89900 mov edx,dword ptr ds:[99F884]
00988795 8B02 mov eax,dword ptr ds:[edx]///eax=2f000 不知这个是不是重定位地址?
00988797 03D7 add edx,edi
00988799 8915 84F89900 mov dword ptr ds:[99F884],edx
0098879F 8B0A mov ecx,dword ptr ds:[edx]///ecx=25f4 不知这个是不是重定位表大小?
009887A1 03D7 add edx,edi
009887A3 3BC3 cmp eax,ebx
009887A5 8915 84F89900 mov dword ptr ds:[99F884],edx
009887AB 74 38 je short 009887E5
009887AD 3BCB cmp ecx,ebx
009887AF 74 34 je short 009887E5
009887B1 8B55 C0 mov edx,dword ptr ss:[ebp-40]
009887B4 8B75 E8 mov esi,dword ptr ss:[ebp-18]
009887B7 8B52 34 mov edx,dword ptr ds:[edx+34]
009887BA 3BF2 cmp esi,edx
009887BC 74 2A je short 009887E8
009887BE 03C6 add eax,esi
009887C0 51 push ecx
009887C1 50 push eax
009887C2 52 push edx
009887C3 56 push esi
009887C4 E8 A70B0000 call 00989370
009887C9 83C4 10 add esp,10
009887CC 84C0 test al,al
009887CE 75 18 jnz short 009887E8
009887D0 8B45 08 mov eax,dword ptr ss:[ebp+8]
009887D3 68 74709900 push 997074 ; ASCII "Location CPG"
009887D8 8B08 mov ecx,dword ptr ds:[eax]
009887DA C701 07000000 mov dword ptr ds:[ecx],7
009887E0 ^ E9 1BECFFFF jmp 00987400
009887E5 8B75 E8 mov esi,dword ptr ss:[ebp-18]
009887E8 A1 80F89900 mov eax,dword ptr ds:[99F880]
009887ED 8B48 5C mov ecx,dword ptr ds:[eax+5C]
009887F0 3348 1C xor ecx,dword ptr ds:[eax+1C]
009887F3 890D 88F89900 mov dword ptr ds:[99F888],ecx
009887F9 8B48 30 mov ecx,dword ptr ds:[eax+30]
009887FC 3348 14 xor ecx,dword ptr ds:[eax+14]
009887FF 3348 1C xor ecx,dword ptr ds:[eax+1C]
00988802 51 push ecx
00988803 FF35 84F89900 push dword ptr ds:[99F884] ; Ls_do.100A2660
用ALT+M,找到内存镜像,在10001000段下内存访问断点,F9后直接停在入口处:
10009B2E 55 push ebp///入口处。
10009B2F 8BEC mov ebp,esp
10009B31 53 push ebx
10009B32 8B5D 08 mov ebx,dword ptr ss:[ebp+8]
10009B35 56 push esi
10009B36 8B75 0C mov esi,dword ptr ss:[ebp+C]
10009B39 57 push edi
10009B3A 8B7D 10 mov edi,dword ptr ss:[ebp+10]
10009B3D 85F6 test esi,esi
10009B3F 75 09 jnz short 10009B4A ; 10009B4A
10009B41 833D 40980210 00 cmp dword ptr ds:[10029840],0
这时观察IAT:
1001E000 9A 22 DA 77 D6 27 DA 77 ?邝?邝
1001E008 B1 63 DB 77 D8 17 DA 77 便埙?邝
1001E010 8D 5E 97 00 3D 51 31 77 ??=Q1w
1001E018 B1 38 31 77 A0 5E 97 00 ?1w_^?
......
1001E428 3E BF A2 71 E3 95 A2 71 >竣q?Ⅰ
1001E430 6A 5E 97 00 88 1B 32 76 j^??2v
1001E438 A0 5E 97 00 00 00 00 00 _^?....
1001E440 10 EF 01 10 48 E4 01 10 ?H?
到入口后DUMP下来,然后用ImportREC修复。修改重定位信息rva=2f000 size=25f4.
修复后用OD载入可以到入口,F9后就出错。不知问题出在哪儿,请各位指点。
附件:test.rar
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!