刚刚弄了一下,原来是该病毒有采取anti-dump技术,通过绕过Anti-Dump顺利脱壳,现在分享下我脱壳的过程:
首先用PEID查看该EXE,如下图所示,虽然无法查出是具体哪种壳,但是从它的节名可以推出应该是UPX
接着打开OD加载该EXE,开始的时候,使用快捷键ATL+M打开内存窗口,在该EXE的第一个节处按下F2设置内存断点,如下图所示:
按下SHIFT+F9运行,断点停留在地址00A90747处,仔细一查看,这部分主要是循环解压内存的每个字节数据,bl每次存储的就是被解压的数据
00A90743 /76 0B jbe short 00A90750
00A90745 |8A1A mov bl, byte ptr [edx]
[COLOR="Red"]00A90747 |8818 mov byte ptr [eax], bl[/COLOR]
00A90749 |40 inc eax
00A9074A |42 inc edx
00A9074B |49 dec ecx
00A9074C |85C9 test ecx, ecx
00A9074E ^|77 F5 ja short 00A90745
完成解压后,继续单步执行,直到返回CALL函数的空间,如下所示,仔细对比前后的代码,可以知道这是循环解压各个节数据
00A904DB 8B45 C0 mov eax, dword ptr [ebp-40]
00A904DE 8B50 0C mov edx, dword ptr [eax+C]
00A904E1 0355 DC add edx, dword ptr [ebp-24]
00A904E4 8B48 14 mov ecx, dword ptr [eax+14]
00A904E7 03CE add ecx, esi
00A904E9 894D B4 mov dword ptr [ebp-4C], ecx
00A904EC 8B40 10 mov eax, dword ptr [eax+10]
00A904EF 50 push eax
00A904F0 8B45 B4 mov eax, dword ptr [ebp-4C]
00A904F3 50 push eax
00A904F4 52 push edx
[COLOR="red"]00A904F5 FF53 57 call dword ptr [ebx+57][/COLOR]
00A904F8 8345 C0 28 add dword ptr [ebp-40], 28
00A904FC 4F dec edi
00A904FD 85FF test edi, edi
00A904FF ^ 77 DA ja short 00A904DB
继续单步运行,到了如下代码:两个CALL函数,分别是LoadLibraryA和GetProcAddress,这里主要是完成IAT的填充
0051426D . 037E 04 add edi, dword ptr [esi+4]
00514270 ? 83C6 0C add esi, 0C
00514273 . 57 push edi
[COLOR="red"]00514274 ? FF95 65FAFFFF call dword ptr [ebp-59B][/COLOR]
0051427A ? 5F pop edi
0051427B . 5A pop edx
0051427C ? 5B pop ebx
0051427D . 83F8 00 cmp eax, 0
00514280 ? 74 59 je short 005142DB
00514282 ? 8985 D1F9FFFF mov dword ptr [ebp-62F], eax
00514288 ? 033E add edi, dword ptr [esi]
0051428A ? 83C6 04 add esi, 4
0051428D . 33C9 xor ecx, ecx
0051428F . 8A0E mov cl, byte ptr [esi]
00514291 . 83F9 00 cmp ecx, 0
00514294 ? 75 03 jnz short 00514299
00514296 ? 46 inc esi
00514297 .^ EB B3 jmp short 0051424C
00514299 . 8BC7 mov eax, edi
0051429B . 03F9 add edi, ecx
0051429D . 52 push edx
0051429E ? 53 push ebx
0051429F . 50 push eax
005142A0 ? 8038 FF cmp byte ptr [eax], 0FF
005142A3 . 75 08 jnz short 005142AD
005142A5 . 40 inc eax
005142A6 ? 8B00 mov eax, dword ptr [eax]
005142A8 ? 25 FFFFFF7F and eax, 7FFFFFFF
005142AD . 8A0F mov cl, byte ptr [edi]
005142AF . C607 00 mov byte ptr [edi], 0
005142B2 ? 51 push ecx
005142B3 . 50 push eax
005142B4 ? FFB5 D1F9FFFF push dword ptr [ebp-62F]
[COLOR="red"]005142BA ? FF95 69FAFFFF call dword ptr [ebp-597][/COLOR]
005142C0 ? 59 pop ecx
005142C1 . 5A pop edx
005142C2 ? 5B pop ebx
005142C3 . 5A pop edx
005142C4 ? 83F8 00 cmp eax, 0
005142C7 . 74 12 je short 005142DB
005142C9 . 880F mov byte ptr [edi], cl
005142CB . 8946 FC mov dword ptr [esi-4], eax
005142CE ? FF76 FC push dword ptr [esi-4]
005142D1 . 8F03 pop dword ptr [ebx]
005142D3 . 83C3 04 add ebx, 4
005142D6 ? 46 inc esi
005142D7 .^ EB B4 jmp short 0051428D
然后继续单步运行:
遇到一条跳转指令JMP 404B54,跟踪过去后,可以推断出这里就是OEP了
接着用LoadPE在该EXE的进程的右键菜单先点击执行“correct ImageSize"(这里就是为什么之前我脱不了壳的原因,anti-dump),然后在dump full
最后重建输入表,使用ImportREC工具很简单方便,如下图所示,填写正确的OEP,和IAT表的RVA和SIZE后点击“Get Imports”,很幸运,都是正确的函数信息,那么最后直接Fix Dump到刚才DUMP下来的文件
至此,该病毒的脱壳成功!!!