ASProtect 1.23 RC4 – 1.3.08.24 -> Alexey Solodovnikov 脱壳Stolen code 修复

程序的壳子:ASProtect 1.23 RC4 – 1.3.08.24 -> Alexey Solodovnikov
用od载入程序,忽略除内存以外的所有异常,如下图。



载入后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次?smile)。

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就能修复了。

You may also like

发表评论

电子邮件地址不会被公开。 必填项已用*标注