// 发现加密算法简单,而且IAT并未被加密了,CALL调用被拿掉了,比较麻烦些~!我觉得这个壳完全可以硬解码
//
// 从入口直接F4这里,上面就是VirtualAlloc获得数据空间,解密代码:
// 停在这里后,已经解密完成.
0040D22E 2B7C24 28 sub edi, dword ptr [esp+28]
0040D232 897C24 1C mov dword ptr [esp+1C], edi
0040D236 61 popad
0040D237 C2 0800 retn 8
// 实际早就觉得这个地方是JMP的关键,果真:
0040D183 50 push eax
0040D184 53 push ebx
0040D185 E8 05000000 call 0040D18F
0040D18A 5A pop edx
0040D18B 52 push edx
0040D18C 55 push ebp
0040D18D - FFE2 jmp edx //跟进去吧~!
// 出现异常
00390090 AD lods dword ptr [esi]
00390091 CD20 33F6E810 vxdjump 10E8F633
00390097 0000 add byte ptr [eax], al
// 重新载入,直接F4,再F7
00390000 E8 16000000 call 0039001B
00390005 8B5C24 0C mov ebx, dword ptr [esp+C]
00390009 8BA3 C4000000 mov esp, dword ptr [ebx+C4]
0039000F 64:8F05 0000000>pop dword ptr fs:[0]
00390016 83C4 04 add esp, 4
00390019 EB 14 jmp short 0039002F
0039001B 64:FF35 0000000>push dword ptr fs:[0]
00390022 64:8925 0000000>mov dword ptr fs:[0], esp
00390029 33C9 xor ecx, ecx
0039002B 99 cdq
0039002C F7F1 div ecx ;这里会有个除法异常
0039002E E9 E8030000 jmp 0039041B
// 那来这么多异常撒~~!
// 忽略全部异常,在代码段下写入异常,F9段下,发现代码段已经完全解密,发现CALL调用
// 已经被修改了。可能需要还在前面来处理.
// 取消写入断点,按F7就来到了,F8会飞了的.
0040D18F 60 pushad
0040D190 8B7424 24 mov esi, dword ptr [esp+24]
0040D194 8B7C24 28 mov edi, dword ptr [esp+28]
0040D198 FC cld
0040D199 B2 80 mov dl, 80
0040D19B 33DB xor ebx, ebx
0040D19D A4 movs byte ptr es:[edi], byte ptr [esi>
0040D19E B3 02 mov bl, 2
// 第一次解密的是代码段,第二次解密的是数据段,看明白了
// GO ON~~!按流程是到了解密IAT的时候,果真:
00392845 AA stos byte ptr es:[edi]
00392846 61 popad
00392847 8D95 26070000 lea edx, dword ptr [ebp+726]
0039284D 52 push edx
0039284E 56 push esi
0039284F FF95 73060000 call dword ptr [ebp+673] //获得IAT表
00392855 8907 mov dword ptr [edi], eax //EDI为IAT地址
00392857 5A pop edx
00392858 0FB642 FF movzx eax, byte ptr [edx-1]
0039285C 03D0 add edx, eax
0039285E 42 inc edx
0039285F 83C7 04 add edi, 4
00392862 59 pop ecx
00392863 ^ E2 A9 loopd short 0039280E
00392865 ^ E9 63FFFFFF jmp 003927CD //F2 断点,继续下一个DLL
// IAT表解密完成,004062DC - 0040652C
004062DC 00 00 00 00 00 00 00 00 BB 7A DD 77 27 6C DD 77 ........粃輜'l輜
004062EC E7 EA DD 77 C8 EF DD 77 F3 BC DF 77 00 00 00 00 珀輜蕊輜蠹遷....
004062FC 25 8D F1 77 71 5A F1 77 CE EC F1 77 70 5B F1 77 %嶑wqZ駑戊駑p[駑
0040630C D2 4C F4 77 F1 DE F2 77 5F 6E F1 77 9E F4 F2 77 襆魒褶騱_n駑烎騱
0040631C 79 5E F4 77 61 DC F2 77 FF DC F1 77 00 BF F3 77 y^魒a茯w荞w.矿w
0040632C F2 4D F4 77 DB 5E F1 77 1F 94 F1 77 45 DF F1 77 騇魒踍駑旕wE唏w
// 下面应该怎么到OEP了:
// 有点眼熟~!
003928DB 8B07 mov eax, dword ptr [edi] ;unpackme.00401A5C
003928DD 0BC0 or eax, eax
// 这里没有找OEP,而是逐一替换地址
// EDI表的格式为 地址 KEY
003928D5 8DB5 6D050000 lea esi, dword ptr [ebp+56D]
003928DB 8B07 mov eax, dword ptr [edi] ;EDI这里有个表
003928DD 0BC0 or eax, eax
003928DF 75 02 jnz short 003928E3
003928E1 EB 1D jmp short 00392900
003928E3 25 FFFFFF7F and eax, 7FFFFFFF
003928E8 0385 83060000 add eax, dword ptr [ebp+683]
003928EE 2B85 8F060000 sub eax, dword ptr [ebp+68F]
003928F4 8BDE mov ebx, esi
003928F6 2BD8 sub ebx, eax
003928F8 8958 FC mov dword ptr [eax-4], ebx
003928FB 83C7 08 add edi, 8
003928FE ^ EB DB jmp short 003928DB
// 替换完地址就是应该OEP了吧
// ^o^还真是去了OEP了
00392947 89AD A7050000 mov dword ptr [ebp+5A7], ebp
0039294D 8B85 B3060000 mov eax, dword ptr [ebp+6B3]
00392953 0385 83060000 add eax, dword ptr [ebp+683]
00392959 8BF8 mov edi, eax ;
unpackme.004010CC
// 飞向光明之颠~~!
00392987 5D pop ebp
00392988 5B pop ebx
00392989 59 pop ecx
0039298A 5A pop edx
0039298B 5E pop esi
0039298C - FFE0 jmp eax ;
unpackme.004010CC
// 比较简单的脱壳方法就是DUMP了
// 修复比较麻烦,
// 跑了一圈发现了关键所在,不知道大家明白了吗?
// bp VirtualAlloc:
// 第一次断下是00390000,这个是解密程序,GO ON~!
// 第二次断下是003D0000,这个是代码段,看看原始加密的代码段是否完好~!
//
// ESI -EDI就是将代码段的内容拷贝到003D0000
0040D190 8B7424 24 mov esi, dword ptr [esp+24]
0040D194 8B7C24 28 mov edi, dword ptr [esp+28]
0040D198 FC cld
0040D199 B2 80 mov dl, 80
0040D19B 33DB xor ebx, ebx
0040D19D A4 movs byte ptr es:[edi], byte ptr [esi>
0040D19E B3 02 mov bl, 2
// 发现这个加密算法并不多难,数据段和代码段都是同一个算法,完全硬解码也不是多困难
//
// 主要是这个函数:
0040D212 02D2 add dl, dl ;关键,累加
0040D214 75 05 jnz short 0040D21B
0040D216 8A16 mov dl, byte ptr [esi]
0040D218 46 inc esi
0040D219 12D2 adc dl, dl ;关键
0040D21B C3 retn
// 代码已经解密出来了,哎~~!本以为原始代码没动过,结果还是动了.
003D00E1 56 push esi
003D00E2 90 nop
003D00E3 E8 00000000 call 003D00E8 ;这里默认指下一条指令
003D00E8 8BF0 mov esi, eax
003D00EA 8A00 mov al, byte ptr [eax]
003D00EC 84C0 test al, al
003D00EE 74 04 je short 003D00F4
003D00F0 3C 22 cmp al, 22
003D00F2 ^ 75 ED jnz short 003D00E1
003D00F4 803E 22 cmp byte ptr [esi], 22
003D00F7 75 15 jnz short 003D010E
003D00F9 46 inc esi
003D00FA EB 12 jmp short 003D010E
// 无意思了~~~~~~~~~~!