程序的壳子:ASProtect 1.23 RC4 – 1.3.08.24 -> Alexey Solodovnikov
用od载入程序,忽略除内存以外的所有异常,如下图。
00401000 > 68 01804B00 push 004B8001
00401005 E8 01000000 call 0040100B
0040100A C3 retn
0040100B C3 retn
0040100C 9E sahf
0040100D 6D ins dword ptr es:[edi], dx
0040100E 1963 CD sbb dword ptr [ebx-33], esp
00401011 B1 4C mov cl, 4C
00401013 FF73 EB push dword ptr [ebx-15]
00401016 03D4 add edx, esp
00401018 E7 48 out 48, eax
0040101A DA11 ficom dword ptr [ecx]
0040101C B3 E7 mov bl, 0E7
0040101E 66:339D 49B2BC9>xor bx, word ptr [ebp+9EBCB249]
00401025 A7 cmps dword ptr [esi], dword ptr es:[e>
00401026 0B49 9E or ecx, dword ptr [ecx-62]
00401029 43 inc ebx
Hideod,否则程序会直接异常退出,不过有的插件隐藏之后会有问题,不知道什么原因。
shift+F9直接运行,注意观察堆栈窗口,出现硬盘指纹(”oBb/DABgLOI=”)的时候就快到最
后一次异常了,当硬盘指纹消失的时候就到达最后一次异常了(据说是26次,不过不知道是
怎么数的我怎么感觉是27次?:))。
0012FF04 0012FF0C 指向下一个 SEH 记录的指针
0012FF08 00254307 SE处理程序
0012FF0C 0012FFC4 指向下一个 SEH 记录的指针
0012FF10 00254C49 SE处理程序
0012FF14 0012FF58
0012FF18 00240000
0012FF1C 00200000
0012FF20 00254138
0012FF24 01AC4EF8 ASCII “oBb/DABgLOI=”
0012FF28 00000001
最后一次异常会到达下面的地方,注意观察格式会发现类似于:
je xxxxxxxxxx;
……
je yyyyyyyyyy;
……
retn
的这么一个东西,在最后的retn上下f2断点,shift+F9运行,中断后删掉那个F2断点。
002539EC 3100 xor dword ptr [eax], eax
002539EE 64:8F05 0000000>pop dword ptr fs:[0]
002539F5 58 pop eax
002539F6 833D B07E2500 0>cmp dword ptr [257EB0], 0
002539FD 74 14 je short 00253A13
002539FF 6A 0C push 0C
00253A01 B9 B07E2500 mov ecx, 257EB0
00253A06 8D45 F8 lea eax, dword ptr [ebp-8]
00253A09 BA 04000000 mov edx, 4
00253A0E E8 2DD1FFFF call 00250B40
00253A13 FF75 FC push dword ptr [ebp-4]
00253A16 FF75 F8 push dword ptr [ebp-8]
00253A19 8B45 F4 mov eax, dword ptr [ebp-C]
00253A1C 8338 00 cmp dword ptr [eax], 0
00253A1F 74 02 je short 00253A23
00253A21 FF30 push dword ptr [eax]
00253A23 FF75 F0 push dword ptr [ebp-10]
00253A26 FF75 EC push dword ptr [ebp-14]
00253A29 C3 retn ;此处F2断点,shift+F9中断后删除
此时注意观察堆栈窗口:
0012FF24 01AC7228
0012FF28 00400000 iconmake.00400000
0012FF2C A7E1C923
0012FF30 0012FF6C
0012FF34 00240000
0012FF38 00200000
下硬件断点:hr 0012FF30 后直接F9运行会中断到如下的地址处:
01AC7348 /EB 44 jmp short 01AC738E ; F8单步
01AC734A |EB 01 jmp short 01AC734D
01AC734C |9A 51579CFC BF0>call far 00BF:FC9C5751
01AC7353 |0000 add byte ptr [eax], al
01AC7355 |00B9 00000000 add byte ptr [ecx], bh
01AC735B |F3:AA rep stos byte ptr es:[edi]
01AC735D |9D popfd
01AC735E |5F pop edi
01AC735F |59 pop ecx
01AC7360 |C3 retn
01AC7361 |55 push ebp
01AC7362 |8BEC mov ebp, esp
01AC7364 |53 push ebx
01AC7365 |56 push esi
01AC7366 |8B75 0C mov esi, dword ptr [ebp+C]
01AC7369 |8B5D 08 mov ebx, dword ptr [ebp+8]
01AC736C |EB 11 jmp short 01AC737F
01AC736E |0FB703 movzx eax, word ptr [ebx]
01AC7371 |03C6 add eax, esi
01AC7373 |83C3 02 add ebx, 2
01AC7376 |8BD0 mov edx, eax
01AC7378 |8BC6 mov eax, esi
01AC737A |E8 0C000000 call 01AC738B
01AC737F |66:833B 00 cmp word ptr [ebx], 0
01AC7383 ^|75 E9 jnz short 01AC736E
01AC7385 |5E pop esi
01AC7386 |5B pop ebx
01AC7387 |5D pop ebp
01AC7388 |C2 0800 retn 8
01AC738B |0102 add dword ptr [edx], eax
01AC738D |C3 retn
01AC738E \03C3 add eax, ebx ; F8单步
01AC7390 BB A9000000 mov ebx, 0A9
01AC7395 0BDB or ebx, ebx
01AC7397 75 07 jnz short 01AC73A0
01AC7399 894424 1C mov dword ptr [esp+1C], eax
01AC739D 61 popad
01AC739E 50 push eax
01AC739F C3 retn
01AC73A0 E8 00000000 call 01AC73A5
01AC73A5 5D pop ebp
01AC73A6 81ED 4DE14B00 sub ebp, 4BE14D
01AC73AC 8D85 F2E04B00 lea eax, dword ptr [ebp+4BE0F2]
01AC73B2 8D8D 94E14B00 lea ecx, dword ptr [ebp+4BE194]
01AC73B8 03CB add ecx, ebx
01AC73BA 8941 01 mov dword ptr [ecx+1], eax
01AC73BD 8D85 36E14B00 lea eax, dword ptr [ebp+4BE136]
01AC73C3 8D8D FAE04B00 lea ecx, dword ptr [ebp+4BE0FA]
01AC73C9 8901 mov dword ptr [ecx], eax
01AC73CB B8 5E140000 mov eax, 145E
01AC73D0 8D8D FFE04B00 lea ecx, dword ptr [ebp+4BE0FF]
01AC73D6 8901 mov dword ptr [ecx], eax
01AC73D8 8D8D 94E14B00 lea ecx, dword ptr [ebp+4BE194]
01AC73DE 8D85 94F34B00 lea eax, dword ptr [ebp+4BF394]
01AC73E4 51 push ecx
01AC73E5 50 push eax
01AC73E6 E8 76FFFFFF call 01AC7361
01AC73EB 61 popad
01AC73EC EB 02 jmp short 01AC73F0
01AC73EE CD20 26EB02CD vxdjump CD02EB26
01AC73F4 20EB and bl, ch
01AC73F6 02CD add cl, ch
01AC73F8 208D 6434DD2B and byte ptr [ebp+2BDD3464], cl
01AC73FE E6 83 out 83, al
01AC7400 C41F les ebx, fword ptr [edi]
01AC7402 F2: prefix repne: ; 此处F7跟
入
01AC7403 EB 01 jmp short 01AC7406
01AC7405 6989 74240065 E>imul ecx, dword ptr [ecx+65002474], 8>
01AC740F C6 ??? ; 未知命令
01AC7410 14 FA adc al, 0FA
01AC7412 2869 F2 sub byte ptr [ecx-E], ch
01AC7415 EB 01 jmp short 01AC7418
01AC7417 E8 BE060000 call 01AC7ADA
直到出现下面的代码停止跟入:
01AC744B 55 push ebp
01AC744C 8BEC mov ebp, esp
01AC744E 6A FF push -1
01AC7450 68 881F4700 push 471F88
01AC7455 68 8A624300 push 43628A
01AC745A 64:A1 00000000 mov eax, dword ptr fs:[0]
01AC7460 EB 02 jmp short 01AC7464
01AC7462 CD20 50648925 vxdcall 25896450
01AC7468 0000 add byte ptr [eax], al
01AC746A 0000 add byte ptr [eax], al
01AC746C 83EC 68 sub esp, 68
01AC746F EB 02 jmp short 01AC7473
01AC7471 CD20 53EB02CD vxdjump CD02EB53
01AC7477 2056 EB and byte ptr [esi-15], dl
01AC747A 02CD add cl, ch
01AC747C 2057 89 and byte ptr [edi-77], dl
01AC747F 65:E8 33DB895D call 5F364FB8
01AC7485 FC cld
01AC7486 6A 02 push 2
01AC7488 EB 02 jmp short 01AC748C
01AC748A CD20 F2EB010F vxdjump F01EBF2
01AC7490 68 8F604300 push 43608F
01AC7495 68 4A73AC01 push 1AC734A
01AC749A C3 retn
复制01AC7460 EB 02 jmp short 01AC7464这一行上面的代码的2进制模
式,如下(stolencode的一部分):
55 8B EC 6A FF 68 88 1F 47 00 68 8A 62 43 00 64 A1 00 00 00 00
继续F7,复制下面代码到jmp跳转前的二进制模式:
01AC7464 50 push eax
01AC7465 64:8925 0000000>mov dword ptr fs:[0], esp
01AC746C 83EC 68 sub esp, 68
二进制:
50 64 89 25 00 00 00 00 83 EC 68
重复上述操作:
01AC7473 53 push ebx
二进制:53
01AC7478 56 push esi
二进制:56
继续F7,复制下面的代码:
01AC747D 57 push edi
01AC747E 8965 E8 mov dword ptr [ebp-18], esp
01AC7481 33DB xor ebx, ebx
01AC7483 895D FC mov dword ptr [ebp-4], ebx
01AC7486 6A 02 push 2
二进制:
57 89 65 E8 33 DB 89 5D FC 6A 02
最后F7到如下的代码处时,开始F8单步往下:
01AC734D 51 push ecx;开始F8单步
01AC734E 57 push edi
01AC734F 9C pushfd
01AC7350 FC cld
01AC7351 BF 8E73AC01 mov edi, 1AC738E
01AC7356 B9 5E140000 mov ecx, 145E
01AC735B F3:AA rep stos byte ptr es:[edi]
01AC735D 9D popfd
01AC735E 5F pop edi
01AC735F 59 pop ecx
01AC7360 C3 retn
一直往下知道跟踪到最近的一个call停止跟踪:
0043608F FF15 7CD94600 call dword ptr [46D97C] ; F8到此处
msvcrt.__set_app_type
00436095 59 pop ecx
00436096 830D 90A84900 F>or dword ptr [49A890], FFFFFFFF
0043609D 830D 94A84900 F>or dword ptr [49A894], FFFFFFFF
004360A4 FF15 78D94600 call dword ptr [46D978] ;
msvcrt.__p__fmode
此时网上找就会找到一片零区域,将上面的二进制代码结合到一块最后就是下面的形式:
55 8B EC 6A FF 68 88 1F 47 00 68 8A 62 43 00 64 A1 00 00 00 00 50 64 89 25 00 00
00 00 83 EC 68 53 56 57 89 65 E8 33 DB 89 5D FC 6A 02
将代码以二进制形式粘贴,在代码开始处新建EIP
00436062 55 push ebp;此处新建EIP
00436063 8BEC mov ebp, esp
00436065 6A FF push -1
00436067 68 881F4700 push 00471F88
0043606C 68 8A624300 push 0043628A ; jmp 到
msvcrt._except_handler3
00436071 64:A1 00000000 mov eax, dword ptr fs:[0]
00436077 50 push eax
00436078 64:8925 0000000>mov dword ptr fs:[0], esp
0043607F 83EC 68 sub esp, 68
00436082 53 push ebx
00436083 56 push esi
00436084 57 push edi
00436085 8965 E8 mov dword ptr [ebp-18], esp
00436088 33DB xor ebx, ebx
0043608A 895D FC mov dword ptr [ebp-4], ebx
0043608D 6A 00 push 0
0043608F FF15 7CD94600 call dword ptr [46D97C] ;
msvcrt.__set_app_type
00436095 59 pop ecx
00436096 830D 90A84900 F>or dword ptr [49A890], FFFFFFFF
0043609D 830D 94A84900 F>or dword ptr [49A894], FFFFFFFF
004360A4 FF15 78D94600 call dword ptr [46D978] ;
msvcrt.__p__fmode
004360AA 8B0D 64A54900 mov ecx, dword ptr [49A564]
004360B0 8908 mov dword ptr [eax], ecx
004360B2 FF15 74D94600 call dword ptr [46D974] ;
msvcrt.__p__commode
最后剩下的就是修复工作了,脱壳最好在xp下进行,因为测试的时候在win7下虽然能够脱壳
,但是修复出来的文件是有问题的,不能正常晕新。~还是xp兼容性好啊!如果有不能识别
的api可以用ASProtect 1.22 插件进行修复,一般的用level 1就能修复了。