• 标 题:ASProtect V1.3b 脱壳——Magic NetTrace V2.1.3
  • 作 者:fly
  • 时 间:004-10-08,13:18
  • 链 接:http://bbs.pediy.com

下载页面:  http://bbs.pediy.com/showthread.php?s=&threadid=5311&perpage=10&pagenumber=7 
软件大小:  1.32 M
软件语言:  英文
软件类别:  国外软件 / 共享版 / 网络辅助
应用平台:  Win9x/NT/2000/XP
加入时间:  2003-12
推荐等级:  ****
软件介绍:  这个程序结合 ping,WHOIS 和 traceroute 功能。

【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

【调试环境】:WinXP、Ollydbg、PEiD、LordPE、ImportREC

————————————————————————————————— 
【脱壳过程】:
          
         
jingulong说起这个程序,我脱壳时使用了壳代码来修复。
Thanks: VolX、jingulong、lipton
—————————————————————————————————
一、壳代码解压
             
             
设置Ollydbg忽略所有的异常选项。老规矩:用IsDebug V1.4插件去掉Ollydbg的调试器标志。

00401000     68 01505A00         push mTrace.005A5001
//进入OD后停在这
00401005     E8 01000000         call mTrace.0040100B
0040100A     C3                  retn

下断:BP GetModuleHandleA
Shift+F9,中断2次后,就可以取消断点,Alt+F9返回。
直接F4至下面的popad处

00B834A6     FF95 EC314400       call dword ptr ss:[ebp+4431EC]
00B834AC     85C0                test eax,eax                        ; kernel32.77E40000
00B834AE     75 07               jnz short 00B834B7
00B834B0     53                  push ebx
00B834B1     FF95 F0314400       call dword ptr ss:[ebp+4431F0]
00B834B7     8985 4D294400       mov dword ptr ss:[ebp+44294D],eax
00B834BD     C785 51294400 00000>mov dword ptr ss:[ebp+442951],0
00B834C7     8B95 D8304400       mov edx,dword ptr ss:[ebp+4430D8]
00B834CD     8B06                mov eax,dword ptr ds:[esi]
00B834CF     85C0                test eax,eax
00B834D1     75 03               jnz short 00B834D6
00B834D3     8B46 10             mov eax,dword ptr ds:[esi+10]
00B834D6     03C2                add eax,edx
00B834D8     0385 51294400       add eax,dword ptr ss:[ebp+442951]
00B834DE     8B18                mov ebx,dword ptr ds:[eax]
00B834E0     8B7E 10             mov edi,dword ptr ds:[esi+10]
00B834E3     03FA                add edi,edx
00B834E5     03BD 51294400       add edi,dword ptr ss:[ebp+442951]
00B834EB     85DB                test ebx,ebx
00B834ED     0F84 A2000000       je 00B83595
00B834F3     F7C3 00000080       test ebx,80000000
00B834F9     75 04               jnz short 00B834FF
00B834FB     03DA                add ebx,edx
00B834FD     43                  inc ebx
00B834FE     43                  inc ebx
00B834FF     53                  push ebx
00B83500     81E3 FFFFFF7F       and ebx,7FFFFFFF
00B83506     53                  push ebx
00B83507     FFB5 4D294400       push dword ptr ss:[ebp+44294D]
00B8350D     FF95 E8314400       call dword ptr ss:[ebp+4431E8]
00B83513     85C0                test eax,eax
00B83515     5B                  pop ebx
00B83516     75 6F               jnz short 00B83587
00B83518     F7C3 00000080       test ebx,80000000
00B8351E     75 19               jnz short 00B83539
00B83520     57                  push edi
00B83521     8B46 0C             mov eax,dword ptr ds:[esi+C]
00B83524     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8]
00B8352A     50                  push eax
00B8352B     53                  push ebx
00B8352C     8D85 53314400       lea eax,dword ptr ss:[ebp+443153]
00B83532     50                  push eax
00B83533     57                  push edi
00B83534     E9 99000000         jmp 00B835D2
00B83539     81E3 FFFFFF7F       and ebx,7FFFFFFF
00B8353F     8B85 DC304400       mov eax,dword ptr ss:[ebp+4430DC]
00B83545     3985 4D294400       cmp dword ptr ss:[ebp+44294D],eax
00B8354B     75 24               jnz short 00B83571
00B8354D     57                  push edi
00B8354E     8BD3                mov edx,ebx
00B83550     4A                  dec edx
00B83551     C1E2 02             shl edx,2
00B83554     8B9D 4D294400       mov ebx,dword ptr ss:[ebp+44294D]
00B8355A     8B7B 3C             mov edi,dword ptr ds:[ebx+3C]
00B8355D     8B7C3B 78           mov edi,dword ptr ds:[ebx+edi+78]
00B83561     035C3B 1C           add ebx,dword ptr ds:[ebx+edi+1C]
00B83565     8B0413              mov eax,dword ptr ds:[ebx+edx]
00B83568     0385 4D294400       add eax,dword ptr ss:[ebp+44294D]
00B8356E     5F                  pop edi
00B8356F     EB 16               jmp short 00B83587
00B83571     57                  push edi
00B83572     8B46 0C             mov eax,dword ptr ds:[esi+C]
00B83575     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8]
00B8357B     50                  push eax
00B8357C     53                  push ebx
00B8357D     8D85 A4314400       lea eax,dword ptr ss:[ebp+4431A4]
00B83583     50                  push eax
00B83584     57                  push edi
00B83585     EB 4B               jmp short 00B835D2
00B83587     8907                mov dword ptr ds:[edi],eax
00B83589     8385 51294400 04    add dword ptr ss:[ebp+442951],4
00B83590     E9 32FFFFFF         jmp 00B834C7
00B83595     8906                mov dword ptr ds:[esi],eax
00B83597     8946 0C             mov dword ptr ds:[esi+C],eax
00B8359A     8946 10             mov dword ptr ds:[esi+10],eax
00B8359D     83C6 14             add esi,14
00B835A0     8B95 D8304400       mov edx,dword ptr ss:[ebp+4430D8]
00B835A6     E9 EBFEFFFF         jmp 00B83496
00B835AB     8B85 652A4400       mov eax,dword ptr ss:[ebp+442A65]
00B835B1     50                  push eax
00B835B2     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8]
00B835B8     5B                  pop ebx
00B835B9     0BDB                or ebx,ebx
00B835BB     8985 112F4400       mov dword ptr ss:[ebp+442F11],eax
00B835C1     61                  popad
//直接F4到这里
00B835C2     75 08               jnz short 00B835CC
00B835C4     B8 01000000         mov eax,1
00B835C9     C2 0C00             retn 0C
00B835CC     68 24BEB700         push 0B7BE24
00B835D1     C3                  retn
//壳代码解压完毕


—————————————————————————————————
二、处理输入表,避开加密
           
           
壳代码已经解压完毕,可以开始处理输入表了,手动Patch,避开输入表的加密。
           
Ctrl+S 在“整个段块”搜索命令序列:
add esp,44
pop ebp
pop edi
pop esi
pop ebx
retn
找到在00B779F3处。上面就是输入表的处理代码段。
下面是分析过程。可以在搜索到地址后直接修改了,免得检验出错。

00B775E0     8B07                mov eax,dword ptr ds:[edi]
00B775E2     8B18                mov ebx,dword ptr ds:[eax]
00B775E4     8307 04             add dword ptr ds:[edi],4
00B775E7     8B07                mov eax,dword ptr ds:[edi]
00B775E9     8A00                mov al,byte ptr ds:[eax]
00B775EB     884424 1E           mov byte ptr ss:[esp+1E],al
00B775EF     FF07                inc dword ptr ds:[edi]
00B775F1     85DB                test ebx,ebx
//这里下断,Shift+F9中断后就可以开始处理了
00B775F3     0F85 99000000       jnz 00B77692
00B775F9     EB 01               jmp short 00B775FC
//IAT处理完毕则自这里跳转

00B7769E     8B07                mov eax,dword ptr ds:[edi]
00B776A0     8A00                mov al,byte ptr ds:[eax]
00B776A2     FF07                inc dword ptr ds:[edi]
00B776A4     33D2                xor edx,edx
00B776A6     8AD0                mov dl,al
00B776A8     8B4424 2C           mov eax,dword ptr ss:[esp+2C]
00B776AC     E8 E3F3FFFF         call 00B76A94
00B776B1     894424 30           mov dword ptr ss:[esp+30],eax
00B776B5     8B07                mov eax,dword ptr ds:[edi]
00B776B7     8A00                mov al,byte ptr ds:[eax]
00B776B9     FF07                inc dword ptr ds:[edi]
00B776BB     84C0                test al,al
00B776BD     75 44               jnz short 00B77703
//下面根据AL值分别进行处理
00B776BF     EB 01               jmp short 00B776C2


————————————————————————
1、AL=1 时的处理


00B7784E     3C 01               cmp al,1
//AL=1   ?
00B77850     0F85 9C000000       jnz 00B778F2
00B77856     EB 01               jmp short 00B77859
00B77859     895C24 18           mov dword ptr ss:[esp+18],ebx
00B7785D     8B07                mov eax,dword ptr ds:[edi]
00B7785F     8B28                mov ebp,dword ptr ds:[eax]
00B77861     8307 04             add dword ptr ds:[edi],4
00B77864     8BC5                mov eax,ebp
00B77866     FF5424 04           call dword ptr ss:[esp+4]
00B7786A     8BE8                mov ebp,eax
00B7786C     8B07                mov eax,dword ptr ds:[edi]
00B7786E     8A00                mov al,byte ptr ds:[eax]
00B77870     884424 1D           mov byte ptr ss:[esp+1D],al
00B77874     FF07                inc dword ptr ds:[edi]
00B77876     807C24 3C 00        cmp byte ptr ss:[esp+3C],0
00B7787B     74 11               je short 00B7788E
00B7787D     A1 64E7B700         mov eax,dword ptr ds:[B7E764]
00B77882     A3 68E7B700         mov dword ptr ds:[B7E768],eax
00B77887     C64424 3C 00        mov byte ptr ss:[esp+3C],0
00B7788C     EB 0B               jmp short 00B77899
00B7788E     8B4424 34           mov eax,dword ptr ss:[esp+34]
00B77892     8B00                mov eax,dword ptr ds:[eax]
00B77894     A3 68E7B700         mov dword ptr ds:[B7E768],eax
00B77899     8B0D 68E7B700       mov ecx,dword ptr ds:[B7E768]
00B7789F     8A5424 1D           mov dl,byte ptr ss:[esp+1D]
00B778A3     8B07                mov eax,dword ptr ds:[edi]
00B778A5     E8 1AD5FFFF         call 00B74DC4
00B778AA     8B4424 24           mov eax,dword ptr ss:[esp+24]
00B778AE     E8 91ACFEFF         call 00B62544
00B778B3     8BF0                mov esi,eax
00B778B5     8B07                mov eax,dword ptr ds:[edi]
00B778B7     50                  push eax
00B778B8     8B4424 34           mov eax,dword ptr ss:[esp+34]
00B778BC     50                  push eax
00B778BD     A1 1CC6B700         mov eax,dword ptr ds:[B7C61C]
00B778C2     8B00                mov eax,dword ptr ds:[eax]
00B778C4     FFD0                call eax
//GetProcAddress        ★
00B778C6     894424 38           mov dword ptr ss:[esp+38],eax
00B778CA     6A 00               push 0
00B778CC     8D5424 38           lea edx,dword ptr ss:[esp+38]
00B778D0     8D4424 3C           lea eax,dword ptr ss:[esp+3C]
00B778D4     8BCD                mov ecx,ebp
00B778D6     E8 EDF8FFFF         call 00B771C8
//加密CALL!进入修改 ★
00B778DB     0305 B8C4B700       add eax,dword ptr ds:[B7C4B8]
00B778E1     8906                mov dword ptr ds:[esi],eax
00B778E3     8933                mov dword ptr ds:[ebx],esi
//加密地址写入程序!NOP掉 ★
00B778E5     33C0                xor eax,eax
00B778E7     8A4424 1D           mov al,byte ptr ss:[esp+1D]
00B778EB     0107                add dword ptr ds:[edi],eax
00B778ED     E9 EEFCFFFF         jmp 00B775E0
//循环

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
★ Patch 处理①&② ★ :
          
00B771C8     55                  push ebp
00B771C9     8BEC                mov ebp,esp
00B771CB     81C4 50FDFFFF       add esp,-2B0
00B771D1     53                  push ebx
00B771D2     56                  push esi
00B771D3     57                  push edi
00B771D4     894D F8             mov dword ptr ss:[ebp-8],ecx
00B771D7     8955 FC             mov dword ptr ss:[ebp-4],edx
00B771DA     8BF8                mov edi,eax
00B771DC     33C0                xor eax,eax
//此时[EDI]=正确的函数地址 ★
00B771DE     8D95 93FDFFFF       lea edx,dword ptr ss:[ebp-26D]
00B771E4     8955 EC             mov dword ptr ss:[ebp-14],edx
00B771E7     33F6                xor esi,esi
//修改①:jmp 00B83908    ★   跳到Patch部分
00B771E9     33DB                xor ebx,ebx
00B771EB     8B17                mov edx,dword ptr ds:[edi]
00B771ED     8955 E4             mov dword ptr ss:[ebp-1C],edx
00B771F0     33D2                xor edx,edx
00B771F2     8955 F0             mov dword ptr ss:[ebp-10],edx
00B771F5     833F 00             cmp dword ptr ds:[edi],0
00B771F8     0F84 01020000       je 00B773FF
00B771FE     E8 C9C9FFFF         call 00B73BCC
00B77203     EB 17               jmp short 00B7721C


在程序下面找快空地,写入Patch 代码。00B83908下面都是空地,就这里吧
提前在[B84ED0]处写入现在DLL的基址,在[B84EE0]处写入准备放输入表的地址:00563000

00B83908     51                  push ecx
00B83909     52                  push edx
00B8390A     3E:8B9424 00030000  mov edx,dword ptr ds:[esp+300]; kernel32.77E40000
//[esp+300]=0012FF2C 此处保存的是处理的DLL基址 ★
00B83912     3B15 D04EB800       cmp edx,dword ptr ds:[B84ED0] ; kernel32.77E40000
//在[B84ED0]处提前写入现在处理的DLL的基址:77E40000
00B83918     74 0D               je short 00B83927
//判断与上次DLL是否相同 ★
00B8391A     8915 D04EB800       mov dword ptr ds:[B84ED0],edx
00B83920     8305 E04EB800 04    add dword ptr ds:[B84EE0],4
//不同则地址+4 ★
00B83927     8B0D E04EB800       mov ecx,dword ptr ds:[B84EE0] ; 00563008
//提前在[B84EE0]处写入准备放输入表的地址:00563000
00B8392D     8B17                mov edx,dword ptr ds:[edi]    ; kernel32.GetFileType
00B8392F     8B0A                mov ecx,dword ptr ds:[edx]
//正确的函数写入
00B83931     8B19                mov ebx,dword ptr ds:[ecx]
//取代原先入壳的跳转地址
00B83933     C643 FF 25          mov byte ptr ds:[ebx-1],25
//把[ebx-2]处的FF15修改成FF25
00B83937     8305 E04EB800 04    add dword ptr ds:[B84EE0],4
00B8393E     5A                  pop edx
00B8393F     59                  pop ecx
00B83940     33F6                xor esi,esi
//原先00B771E7处代码挪到这里来运行
00B83942     33DB                xor ebx,ebx
00B83944     8B17                mov edx,dword ptr ds:[edi]
00B83946     E9 A238FFFF         jmp 00B771ED
//跳回去继续流程


————————————————————————
2、AL=2 时的处理


00B77703     3C 02               cmp al,2
//AL=2   ?
00B77705     0F85 43010000       jnz 00B7784E
00B7770B     EB 01               jmp short 00B7770E
00B7770E     33ED                xor ebp,ebp
00B77710     8B07                mov eax,dword ptr ds:[edi]
00B77712     8A00                mov al,byte ptr ds:[eax]
00B77714     FF07                inc dword ptr ds:[edi]
00B77716     2C 01               sub al,1
00B77718     73 30               jnb short 00B7774A
00B7771A     8B07                mov eax,dword ptr ds:[edi]
00B7771C     8A00                mov al,byte ptr ds:[eax]
00B7771E     FF07                inc dword ptr ds:[edi]
00B77720     8B17                mov edx,dword ptr ds:[edi]
00B77722     8B12                mov edx,dword ptr ds:[edx]
00B77724     8307 04             add dword ptr ds:[edi],4
00B77727     807C24 1E 01        cmp byte ptr ss:[esp+1E],1
00B7772C     75 0F               jnz short 00B7773D
00B7772E     6A 01               push 1
00B77730     8D4C24 44           lea ecx,dword ptr ss:[esp+44]
00B77734     E8 EFFCFFFF         call 00B77428
00B77739     8BE8                mov ebp,eax
00B7773B     EB 0D               jmp short 00B7774A
00B7773D     6A 00               push 0
00B7773F     8D4C24 44           lea ecx,dword ptr ss:[esp+44]
00B77743     E8 E0FCFFFF         call 00B77428
00B77748     8BE8                mov ebp,eax
00B7774A     8B07                mov eax,dword ptr ds:[edi]
00B7774C     8B00                mov eax,dword ptr ds:[eax]
00B7774E     894424 10           mov dword ptr ss:[esp+10],eax
00B77752     8307 04             add dword ptr ds:[edi],4
00B77755     8B4424 24           mov eax,dword ptr ss:[esp+24]
00B77759     E8 E6ADFEFF         call 00B62544
00B7775E     8BF0                mov esi,eax
00B77760     8B5424 10           mov edx,dword ptr ss:[esp+10]
00B77764     8B4424 30           mov eax,dword ptr ss:[esp+30]
00B77768     E8 AFF0FFFF         call 00B7681C
00B7776D     894424 38           mov dword ptr ss:[esp+38],eax
00B77771     EB 01               jmp short 00B77774
00B77774     85ED                test ebp,ebp
00B77776     0F85 9B000000       jnz 00B77817
00B7777C     6A 01               push 1
00B7777E     8D5424 38           lea edx,dword ptr ss:[esp+38]
00B77782     8D4424 3C           lea eax,dword ptr ss:[esp+3C]
00B77786     33C9                xor ecx,ecx
00B77788     E8 3BFAFFFF         call 00B771C8
00B7778D     2B05 B8C4B700       sub eax,dword ptr ds:[B7C4B8]
00B77793     8906                mov dword ptr ds:[esi],eax
00B77795     807C24 1E 01        cmp byte ptr ss:[esp+1E],1
00B7779A     0F85 A7000000       jnz 00B77847
00B777A0     8B4424 24           mov eax,dword ptr ss:[esp+24]
00B777A4     83C0 32             add eax,32
00B777A7     E8 98ADFEFF         call 00B62544
00B777AC     8BE8                mov ebp,eax
00B777AE     55                  push ebp
00B777AF     A1 5CE7B700         mov eax,dword ptr ds:[B7E75C]
00B777B4     50                  push eax
00B777B5     E8 76C8FFFF         call 00B74030
00B777BA     A1 5CE7B700         mov eax,dword ptr ds:[B7E75C]
00B777BF     50                  push eax
00B777C0     E8 7FD4FFFF         call 00B74C44
00B777C5     A1 5CE7B700         mov eax,dword ptr ds:[B7E75C]
00B777CA     E8 81C8FFFF         call 00B74050
00B777CF     03C5                add eax,ebp
00B777D1     894424 28           mov dword ptr ss:[esp+28],eax
00B777D5     B8 02000000         mov eax,2
00B777DA     E8 E5AFFEFF         call 00B627C4
00B777DF     48                  dec eax
00B777E0     75 17               jnz short 00B777F9
00B777E2     8B16                mov edx,dword ptr ds:[esi]
00B777E4     2B5424 28           sub edx,dword ptr ss:[esp+28]
00B777E8     83EA 05             sub edx,5
00B777EB     8B4424 28           mov eax,dword ptr ss:[esp+28]
00B777EF     E8 2CEBFFFF         call 00B76320
00B777F4     EB 1D               jmp short 00B77813
00B77817     892E                mov dword ptr ds:[esi],ebp
00B77819     8BC5                mov eax,ebp
00B7781B     034424 40           add eax,dword ptr ss:[esp+40]
00B7781F     C600 68             mov byte ptr ds:[eax],68
00B77822     6A 01               push 1
00B77824     8D5424 38           lea edx,dword ptr ss:[esp+38]
00B77828     8D4424 3C           lea eax,dword ptr ss:[esp+3C]
00B7782C     33C9                xor ecx,ecx
00B7782E     E8 95F9FFFF         call 00B771C8
//同样的加密CALL!进入修改 ★   Patch处理②方法同Patch处理①
00B77833     8BD5                mov edx,ebp
00B77835     035424 40           add edx,dword ptr ss:[esp+40]
00B77839     42                  inc edx
00B7783A     8902                mov dword ptr ds:[edx],eax
00B7783C     036C24 40           add ebp,dword ptr ss:[esp+40]
00B77840     83C5 05             add ebp,5
00B77843     C645 00 C3          mov byte ptr ss:[ebp],0C3
00B77847     8933                mov dword ptr ds:[ebx],esi
//加密地址写入程序!NOP掉 ★
00B77849     E9 92FDFFFF         jmp 00B775E0
//循环


————————————————————————
3、AL=3 时的处理
          
          
处理特殊函数:GetProcAddress和FindResourceA

00B77952     3C 03               cmp al,3
//AL=3   ?
00B77954     75 7D               jnz short 00B779D3
00B77956     EB 01               jmp short 00B77959
00B77959     8B07                mov eax,dword ptr ds:[edi]
00B7795B     8A00                mov al,byte ptr ds:[eax]
00B7795D     FF07                inc dword ptr ds:[edi]
00B7795F     FEC8                dec al
00B77961     74 09               je short 00B7796C
00B77963     FEC8                dec al
00B77965     74 30               je short 00B77997
00B77967     E9 74FCFFFF         jmp 00B775E0
00B7796C     8B07                mov eax,dword ptr ds:[edi]
00B7796E     8A00                mov al,byte ptr ds:[eax]
00B77970     884424 1C           mov byte ptr ss:[esp+1C],al
00B77974     FF07                inc dword ptr ds:[edi]
00B77976     8B4424 24           mov eax,dword ptr ss:[esp+24]
00B7797A     E8 C5ABFEFF         call 00B62544
00B7797F     8BF0                mov esi,eax
//修改③:jmp 00B8398C   ★   跳到Patch部分
00B77981     8933                mov dword ptr ds:[ebx],esi
00B77983     8A4C24 1C           mov cl,byte ptr ss:[esp+1C]
00B77987     8B5424 30           mov edx,dword ptr ss:[esp+30]
00B7798B     8BC6                mov eax,esi
00B7798D     E8 B2F4FFFF         call 00B76E44
00B77992     E9 49FCFFFF         jmp 00B775E0
//循环
00B77997     8B07                mov eax,dword ptr ds:[edi]
00B77999     8B30                mov esi,dword ptr ds:[eax]
00B7799B     8307 04             add dword ptr ds:[edi],4
00B7799E     8BC6                mov eax,esi
00B779A0     E8 9FABFEFF         call 00B62544
00B779A5     894424 20           mov dword ptr ss:[esp+20],eax
00B779A9     8BCE                mov ecx,esi
00B779AB     8B17                mov edx,dword ptr ds:[edi]
00B779AD     8B4424 20           mov eax,dword ptr ss:[esp+20]
00B779B1     E8 76DCFEFF         call 00B6562C
00B779B6     0137                add dword ptr ds:[edi],esi
00B779B8     8B4424 24           mov eax,dword ptr ss:[esp+24]
00B779BC     E8 83ABFEFF         call 00B62544
00B779C1     8BF0                mov esi,eax
00B779C3     8B4424 20           mov eax,dword ptr ss:[esp+20]
00B779C7     8906                mov dword ptr ds:[esi],eax
00B779C9     8933                mov dword ptr ds:[ebx],esi
00B779CB     E9 10FCFFFF         jmp 00B775E0
00B779D3     BA FC79B700         mov edx,0B779FC ; ASCII "43"
00B779D8     A1 28C6B700         mov eax,dword ptr ds:[B7C628]
00B779DD     8B00                mov eax,dword ptr ds:[eax]
00B779DF     E8 48F0FFFF         call 00B76A2C
//Game Over
00B779E4     E9 F7FBFFFF         jmp 00B775E0


☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
★ Patch 处理③ ★ :

00B8398C     3E:8B4424 30        mov eax,dword ptr ds:[esp+30]
00B83991     3B05 D04EB800       cmp eax,dword ptr ds:[B84ED0]
00B83997     74 0C               je short 00B839A5
00B83999     A3 D04EB800         mov dword ptr ds:[B84ED0],eax
00B8399E     8305 E04EB800 04    add dword ptr ds:[B84EE0],4
00B839A5     A1 E04EB800         mov eax,dword ptr ds:[B84EE0]
//放入我们程序中的地址
00B839AA     8BF0                mov esi,eax
//00B7797F处代码挪到这里执行
00B839AC     8933                mov dword ptr ds:[ebx],esi
00B839AE     8A4C24 1C           mov cl,byte ptr ss:[esp+1C]
00B839B2     8305 E04EB800 04    add dword ptr ds:[B84EE0],4
00B839B9     E9 C93FFFFF         jmp 00B77987

————————————————————————
4、AL=4 时的处理


00B778F2     3C 04               cmp al,4
//AL=4   ?
00B778F4     75 5C               jnz short 00B77952
00B778F6     EB 01               jmp short 00B778F9
00B778F9     8B07                mov eax,dword ptr ds:[edi]
00B778FB     8B28                mov ebp,dword ptr ds:[eax]
00B778FD     8307 04             add dword ptr ds:[edi],4
00B77900     8B07                mov eax,dword ptr ds:[edi]
00B77902     8A00                mov al,byte ptr ds:[eax]
00B77904     884424 1D           mov byte ptr ss:[esp+1D],al
00B77908     FF07                inc dword ptr ds:[edi]
00B7790A     8BCD                mov ecx,ebp
00B7790C     8A5424 1D           mov dl,byte ptr ss:[esp+1D]
00B77910     8B07                mov eax,dword ptr ds:[edi]
00B77912     E8 ADD4FFFF         call 00B74DC4
00B77917     8B4424 24           mov eax,dword ptr ss:[esp+24]
00B7791B     E8 24ACFEFF         call 00B62544
00B77920     8BF0                mov esi,eax
00B77922     8B07                mov eax,dword ptr ds:[edi]
00B77924     50                  push eax
00B77925     8B4424 34           mov eax,dword ptr ss:[esp+34]
00B77929     50                  push eax
00B7792A     A1 1CC6B700         mov eax,dword ptr ds:[B7C61C]
00B7792F     8B00                mov eax,dword ptr ds:[eax]
00B77931     FFD0                call eax
00B77933     894424 38           mov dword ptr ss:[esp+38],eax
00B77937     8B4424 38           mov eax,dword ptr ss:[esp+38]
00B7793B     2B05 B8C4B700       sub eax,dword ptr ds:[B7C4B8]
00B77941     8906                mov dword ptr ds:[esi],eax
00B77943     8933                mov dword ptr ds:[ebx],esi
//修改④:jmp 00B839C2   ★   跳到Patch部分
00B77945     33C0                xor eax,eax
00B77947     8A4424 1D           mov al,byte ptr ss:[esp+1D]
00B7794B     0107                add dword ptr ds:[edi],eax
00B7794D     E9 8EFCFFFF         jmp 00B775E0

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
★ Patch 处理④ ★ :

00B839C2     52                  push edx
00B839C3     3E:8B5424 34        mov edx,dword ptr ds:[esp+34]
00B839C8     3B15 D04EB800       cmp edx,dword ptr ds:[B84ED0]
00B839CE     74 0D               je short 00B839DD
00B839D0     8915 D04EB800       mov dword ptr ds:[B84ED0],edx
00B839D6     8305 E04EB800 04    add dword ptr ds:[B84EE0],4
00B839DD     8B35 E04EB800       mov esi,dword ptr ds:[B84EE0]
00B839E3     8906                mov dword ptr ds:[esi],eax
00B839E5     8933                mov dword ptr ds:[ebx],esi
//取代原先入壳的跳转地址
00B839E7     8305 E04EB800 04    add dword ptr ds:[B84EE0],4
00B839EE     5A                  pop edx
00B839EF     33C0                xor eax,eax
//00B77945处代码挪到这里执行
00B839F1     8A4424 1D           mov al,byte ptr ss:[esp+1D]
00B839F5     E9 513FFFFF         jmp 00B7794B


—————————————————————————————————
三、壳自校验


修改完以上部分后在00B775FC处下断,Shift+F9中断

00B775FC     837C24 2C 00        cmp dword ptr ss:[esp+2C],0
//此处下断,IAT处理完毕,开始检验部分
00B77601     74 0C               je short 00B7760F
00B77603     8B4424 2C           mov eax,dword ptr ss:[esp+2C]
00B77607     E8 50AFFEFF         call 00B6255C
00B7760C     EB 01               jmp short 00B7760F
00B7760F     BA 047AB700         mov edx,0B77A04
00B77614     BB 886FB700         mov ebx,0B76F88
00B77619     2BD3                sub edx,ebx
00B7761B     83EA 04             sub edx,4
00B7761E     8BC3                mov eax,ebx
00B77620     E8 13F9FFFF         call 00B76F38
00B77625     3B05 40E7B700       cmp eax,dword ptr ds:[B7E740]
//不等就Over啦  ★
00B7762B     74 12               je short 00B7763F
//改标志位Z=1使这里跳转!
00B7762D     A1 BCC5B700         mov eax,dword ptr ds:[B7C5BC]
00B77632     C600 36             mov byte ptr ds:[eax],36
00B77635     8B4424 2C           mov eax,dword ptr ss:[esp+2C]
00B77639     0105 B8C4B700       add dword ptr ds:[B7C4B8],eax
00B7763F     A1 5CE7B700         mov eax,dword ptr ds:[B7E75C]
00B77644     E8 5FB4FEFF         call 00B62AA8
00B77649     EB 01               jmp short 00B7764C

取消以前的所有断点,开始第五步操作。


—————————————————————————————————
四、附注:看看AL=3的00B76E44处几个分支处理


00B76E44     53                  push ebx
00B76E45     56                  push esi
00B76E46     8BF2                mov esi,edx
00B76E48     8BD8                mov ebx,eax
00B76E4A     33C0                xor eax,eax
00B76E4C     8AC1                mov al,cl
00B76E4E     83F8 05             cmp eax,5
00B76E51     0F87 9D000000       ja 00B76EF4
00B76E57     FF2485 5E6EB700     jmp dword ptr ds:[eax*4+B76E5E]
//根据EAX值进行分支处理,这个程序用了2个分支处理

————————————————————————
1、EAX=1     0B75200是GetProcAddres


00B76E76     B8 0052B700         mov eax,0B75200
//EAX=1跳到这里  0B75200
00B76E7B     8903                mov dword ptr ds:[ebx],eax
00B76E7D     5E                  pop esi
00B76E7E     5B                  pop ebx
00B76E7F     C3                  retn

00B75200     55                  push ebp
00B75201     8BEC                mov ebp,esp
00B75203     8B55 0C             mov edx,dword ptr ss:[ebp+C]
00B75206     8B45 08             mov eax,dword ptr ss:[ebp+8]
00B75209     8B0D 1CC5B700       mov ecx,dword ptr ds:[B7C51C]
00B7520F     8B09                mov ecx,dword ptr ds:[ecx]
00B75211     3BC8                cmp ecx,eax
00B75213     75 09               jnz short 00B7521E
00B75215     8B0495 68C4B700     mov eax,dword ptr ds:[edx*4+B7C468]
00B7521C     EB 07               jmp short 00B75225
00B7521E     52                  push edx
00B7521F     50                  push eax
00B75220     E8 2F03FFFF         call 00B65554 ; jmp to kernel32.GetProcAddress
//这里! ★
00B75225     5D                  pop ebp
00B75226     C2 0800             retn 8

————————————————————————
2、EAX=5     0B76DE8是FindResourceA


00B76EDD     A1 1CC6B700         mov eax,dword ptr ds:[B7C61C]
//EAX=5跳到这里
00B76EE2     8B40 0C             mov eax,dword ptr ds:[eax+C]
00B76EE5     A3 50E7B700         mov dword ptr ds:[B7E750],eax
00B76EEA     B8 E86DB700         mov eax,0B76DE8
//0B76DE8
00B76EEF     8903                mov dword ptr ds:[ebx],eax
00B76EF1     5E                  pop esi
00B76EF2     5B                  pop ebx
00B76EF3     C3                  retn

00B76DE8     FF35 50E7B700       push dword ptr ds:[B7E750]
00B76DEE     53                  push ebx
00B76DEF     56                  push esi
00B76DF0     57                  push edi
00B76DF1     EB 01               jmp short 00B76DF4

00B76DF4     89E3                mov ebx,esp
00B76DF6     53                  push ebx
00B76DF7     E8 10FEFFFF         call 00B76C0C
00B76DFC     EB 01               jmp short 00B76DFF
00B76DFF     5F                  pop edi
00B76E00     5E                  pop esi
00B76E01     5B                  pop ebx
00B76E02     C3                  retn

00B99F7C     6A 20               push 20
00B99F7E     68 D814E677         push 77E614D8
//FindResourceA 函数的前2条指令
00B99F83     65:EB 01            jmp short 00B99F87
00B99F87     68 96CAE477         push 77E4CA96
00B99F8B     EB 01               jmp short 00B99F8E
00B99F8E     68 86BBE777         push 77E7BB86
00B99F93     64:A1 00000000      mov eax,dword ptr fs:[0]
00B99F99     50                  push eax
00B99F9A     64:8925 00000000    mov dword ptr fs:[0],esp
00B99FA1     8B4424 10           mov eax,dword ptr ss:[esp+10]
00B99FA5     896C24 10           mov dword ptr ss:[esp+10],ebp
00B99FA9     8D6C24 10           lea ebp,dword ptr ss:[esp+10]
00B99FAD     2BE0                sub esp,eax
00B99FAF     53                  push ebx
00B99FB0     56                  push esi
00B99FB1     57                  push edi
00B99FB2     8B45 F8             mov eax,dword ptr ss:[ebp-8]
00B99FB5     8965 E8             mov dword ptr ss:[ebp-18],esp
00B99FB8     50                  push eax
00B99FB9     8B45 FC             mov eax,dword ptr ss:[ebp-4]
00B99FBC     C745 FC FFFFFFFF    mov dword ptr ss:[ebp-4],-1
00B99FC3     8945 F8             mov dword ptr ss:[ebp-8],eax
//把CALL call kernel32.77E574E1放在这里执行
00B99FC6     F2:                 prefix repne:
00B99FC7     EB 01               jmp short 00B99FCA

00B99FCA     68 1975E577         push 77E57519
00B99FCF     C3                  retn

77E4CA8A     6A 20               push 20
//FindResourceA 
77E4CA8C     68 D814E677         push kernel32.77E614D8
77E4CA91     E8 4BAA0000         call kernel32.77E574E1
77E4CA96     33F6                xor esi,esi  ; mTrace.00400000
//返回这里

————————————————————————
3、未知


00B76EA1     68 106FB700         push 0B76F10 ; ASCII "_except_handler2"
00B76EA6     56                  push esi
00B76EA7     A1 1CC6B700         mov eax,dword ptr ds:[B7C61C]
00B76EAC     8B00                mov eax,dword ptr ds:[eax]
00B76EAE     FFD0                call eax
00B76EB0     A3 44E7B700         mov dword ptr ds:[B7E744],eax
00B76EB5     B8 086EB700         mov eax,0B76E08
00B76EBA     8903                mov dword ptr ds:[ebx],eax
00B76EBC     5E                  pop esi
00B76EBD     5B                  pop ebx
00B76EBE     C3                  retn
00B76EBF     68 246FB700         push 0B76F24 ; ASCII "_except_handler3"
00B76EC4     56                  push esi
00B76EC5     A1 1CC6B700         mov eax,dword ptr ds:[B7C61C]
00B76ECA     8B00                mov eax,dword ptr ds:[eax]
00B76ECC     FFD0                call eax
00B76ECE     A3 48E7B700         mov dword ptr ds:[B7E748],eax
00B76ED3     B8 246EB700         mov eax,0B76E24
00B76ED8     8903                mov dword ptr ds:[ebx],eax
00B76EDA     5E                  pop esi
00B76EDB     5B                  pop ebx
00B76EDC     C3                  retn


—————————————————————————————————
五、Pre-Dip:用自己的名字注册


00B7AC61     3100                xor dword ptr ds:[eax],eax
//异常,第2次看见硬盘指纹

0012FF2C   0012FF34   指针到下一个 SEH 记录
0012FF30   00B7AC18   SE 句柄
0012FF34   0012FF40   指针到下一个 SEH 记录
0012FF38   00B7B236   SE 句柄
0012FF3C   0012FF90
0012FF40   0012FFE0   指针到下一个 SEH 记录
0012FF44   00B7B25B   SE 句柄
0012FF48   0012FF90
0012FF4C   00B60000
0012FF50   00B30000
0012FF54   00B7A684   ASCII "U嬱岴鴭"
0012FF58   00000000
0012FF5C   00BEC1A4   ASCII "8wh3JAAQjOI="//硬盘指纹

Alt+M打开内存查看窗口,在00401000段下 内存访问断点,Shift+F9通过异常,断下

0052FE20     55                  push ebp
//中断在这里
0052FE21     8BEC                mov ebp,esp
0052FE23     8B45 08             mov eax,dword ptr ss:[ebp+8]
0052FE26     A3 E05D5400         mov dword ptr ds:[545DE0],eax
//保存注册名地址
0052FE2B     5D                  pop ebp
0052FE2C     C2 0400             retn 4

过了0052FE26 之后,[545DE0]处应该是保存的注册用户名,找一段空地,在00563880处写入:fly  [CUG],然后把[545DE0]处的值改为00563880。OK,这个Pre-Dip处理完毕。


—————————————————————————————————
六、以壳解壳——ASProtect V1.3壳的Stolen Code简便解决方案


取消以前的所有断点。继续Shift+F9 运行,直至中断在最后一次典型异常。

00B79CB5     3100                xor dword ptr ds:[eax],eax
//ASProtect V1.3B最后1次典型异常,和V1.23RC4是一样的
00B79CB7     64:8F05 00000000    pop dword ptr fs:[0]
00B79CBE     58                  pop eax
00B79CBF     833D C4E7B700 00    cmp dword ptr ds:[B7E7C4],0
00B79CC6     74 14               je short 00B79CDC
00B79CC8     6A 0C               push 0C
00B79CCA     B9 C4E7B700         mov ecx,0B7E7C4
00B79CCF     8D45 F8             lea eax,dword ptr ss:[ebp-8]
00B79CD2     BA 04000000         mov edx,4
00B79CD7     E8 6075FFFF         call 00B7123C
00B79CDC     FF75 FC             push dword ptr ss:[ebp-4]
00B79CDF     FF75 F8             push dword ptr ss:[ebp-8]
00B79CE2     8B45 F4             mov eax,dword ptr ss:[ebp-C]
00B79CE5     8338 00             cmp dword ptr ds:[eax],0
00B79CE8     74 02               je short 00B79CEC
00B79CEA     FF30                push dword ptr ds:[eax]
00B79CEC     FF75 F0             push dword ptr ss:[ebp-10]
00B79CEF     FF75 EC             push dword ptr ss:[ebp-14]
00B79CF2     C3                  retn
//此处下断,Shift+F9断下

看看堆栈:
0012FF38   00BA0004
0012FF3C   00400000   ASCII "MZP"
0012FF40   59C79F56
0012FF44   0012FFA4

0012FF44=0012FFA4,下断:HR 0012FF44。F9运行,中断下来

00BA00D1     EB 44               jmp short 00BA0117
//中断在这

00BA0117     03C3                add eax,ebx
00BA0119     BB 08060000         mov ebx,608
//从这里可以使用“以壳解壳”来处理Stolen Code ★
//在这儿用PETools完全DUMP这个进程
00BA011E     0BDB                or ebx,ebx
00BA0120     75 07               jnz short dumped_.00BA0129
00BA0122     894424 1C           mov dword ptr ss:[esp+1C],eax
00BA0126     61                  popad
00BA0127     50                  push eax
00BA0128     C3                  retn
00BA0129     E8 00000000         call 00BA012E
00BA012E     5D                  pop ebp
00BA012F     81ED D9B54B00       sub ebp,dumped_.004BB5D9
00BA0135     8D85 7EB54B00       lea eax,dword ptr ss:[ebp+4BB57E]
00BA013B     8D8D 20B64B00       lea ecx,dword ptr ss:[ebp+4BB620]
00BA0141     03CB                add ecx,ebx
00BA0143     8941 01             mov dword ptr ds:[ecx+1],eax
00BA0146     8D85 C2B54B00       lea eax,dword ptr ss:[ebp+4BB5C2]
00BA014C     8D8D 86B54B00       lea ecx,dword ptr ss:[ebp+4BB586]
00BA0152     8901                mov dword ptr ds:[ecx],eax
00BA0154     B8 5E280000         mov eax,285E
00BA0159     8D8D 8BB54B00       lea ecx,dword ptr ss:[ebp+4BB58B]
00BA015F     8901                mov dword ptr ds:[ecx],eax
00BA0161     8D8D 20B64B00       lea ecx,dword ptr ss:[ebp+4BB620]
00BA0167     8D85 20DB4B00       lea eax,dword ptr ss:[ebp+4BDB20]
00BA016D     51                  push ecx
00BA016E     50                  push eax
00BA016F     E8 76FFFFFF         call 00BA00EA
00BA0174     61                  popad
00BA0175     EB 01               jmp short 00BA0178


—————————————————————————————————
七、Dump、修复输入表


仅仅区域脱壳出上面的处理Stolen Code壳代码部分是不行的。
为了修复CALL EAX和FindResourceA的问题,所以共区域脱壳出以下部分壳代码:
00B60000-00B85000.dmp
00B90000-00B94000.dmp
00B98000-00B9C000.dmp
00BA0000-00BA4000.dmp
00BC0000-00BF0000.dmp
“组装”一下dumped.exe,从磁盘载入刚才部分脱壳的五部分。
减去基址后分别修改其虚拟地址为00760000、00790000、00798000、009A0000、009C0000
只保留PETools的“验证PE文件”选项,重建PE。


运行ImportREC,填入RVA=00163000、Size=0000083C
获取输入表,会发现有2个无效指针
00163078  ?  0000  00B75200//GetProcAddress
0016319C  ?  0000  00B76DE8//FindResourceA
001631E0  ?  0000  00B75200//GetProcAddress
通过AL=3的分析,我们知道应该把00B75200修复为GetProcAddress,把00B76DE8修复为FindResourceA
修改OEP=007A0000,FixDump!

FindResourceA这个部分有问题,借用壳代码来处理吧。
00407478     FF25 9C315600       jmp dword ptr ds:[56319C]; FindResourceA
把OEP处修改为:
00BA0000     C705 9C315600 E86DB>mov dword ptr ds:[56319C],00B76DE8
//用原来的壳代码来处理
00BA000A     E9 0A010000         jmp 00BA0119


—————————————————————————————————
八、暗桩修复


0040218F     803D 30745400 00    cmp byte ptr ds:[547430],0
//把54E430处的01修改为00,  ★    让其重新申请内存
00402196     75 13               jnz short dumped_.004021AB
00402198     E8 13F9FFFF         call dumped_.00401AB0
0040219D     84C0                test al,al
0040219F     75 0A               jnz short dumped_.004021AB
004021A1     33C0                xor eax,eax
004021A3     8945 FC             mov dword ptr ss:[ebp-4],eax
004021A6     E9 54010000         jmp dumped_.004022FF
004021AB     33C9                xor ecx,ecx
004021AD     55                  push ebp
004021AE     68 F8224000         push dumped_.004022F8
004021B3     64:FF31             push dword ptr fs:[ecx]
004021B6     64:8921             mov dword ptr fs:[ecx],esp
004021B9     803D 49705400 00    cmp byte ptr ds:[547049],0
004021C0     74 0A               je short dumped_.004021CC
004021C2     68 38745400         push dumped_.00547438
004021C7     E8 40F2FFFF         call <jmp.&kernel32.EnterCriticalSection>
004021CC     83C3 07             add ebx,7
004021CF     83E3 FC             and ebx,FFFFFFFC
004021D2     83FB 0C             cmp ebx,0C
004021D5     7D 05               jge short dumped_.004021DC
004021D7     BB 0C000000         mov ebx,0C
004021DC     81FB 00100000       cmp ebx,1000
004021E2     0F8F 93000000       jg dumped_.0040227B
004021E8     8BC3                mov eax,ebx
004021EA     85C0                test eax,eax
004021EC     79 03               jns short dumped_.004021F1
004021EE     83C0 03             add eax,3
004021F1     C1F8 02             sar eax,2
004021F4     8B15 90745400       mov edx,dword ptr ds:[547490]
004021FA     8B5482 F4           mov edx,dword ptr ds:[edx+eax*4-C]
//异常 ①
004021FE     85D2                test edx,edx
00402200     74 79               je short dumped_.0040227B


00401426     BE 54745400         mov esi,dumped_.00547454
0040142B     833E 00             cmp dword ptr ds:[esi],0
//把[00547454]处的0014EDA4修改为00000000  ★
0040142E     75 3A               jnz short dumped_.0040146A
00401430     68 44060000         push 644
00401435     6A 00               push 0
00401437     E8 A8FFFFFF         call <jmp.&kernel32.LocalAlloc>
0040143C     8BC8                mov ecx,eax
0040143E     85C9                test ecx,ecx
00401440     75 05               jnz short dumped_.00401447
00401442     33C0                xor eax,eax
00401444     5E                  pop esi
00401445     5B                  pop ebx
00401446     C3                  retn
00401447     A1 50745400         mov eax,dword ptr ds:[547450]
0040144C     8901                mov dword ptr ds:[ecx],eax
0040144E     890D 50745400       mov dword ptr ds:[547450],ecx
00401454     33D2                xor edx,edx
00401456     8BC2                mov eax,edx
00401458     03C0                add eax,eax
0040145A     8D44C1 04           lea eax,dword ptr ds:[ecx+eax*8+4]
0040145E     8B1E                mov ebx,dword ptr ds:[esi]
00401460     8918                mov dword ptr ds:[eax],ebx
00401462     8906                mov dword ptr ds:[esi],eax
00401464     42                  inc edx
00401465     83FA 64             cmp edx,64
00401468     75 EC               jnz short dumped_.00401456
0040146A     8B06                mov eax,dword ptr ds:[esi]
0040146C     8B10                mov edx,dword ptr ds:[eax]
//异常 ②
0040146E     8916                mov dword ptr ds:[esi],edx
00401470     5E                  pop esi
00401471     5B                  pop ebx
00401472     C3                  retn


—————————————————————————————————
         ,     _/ 
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名 
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂
 `~ _( ,_..--\ (     ,;'' /    ~--   /._`\ 
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""
   
              UnPacked By :  fly
               2004-10-07 02:00