【破文标题】:QQ聊天霸王 V2.06 脱壳破解一条龙

【破文作者】:KuNgBiM[DFCG]

【作者邮箱】:gb_1227@163.com

【软件名称】:QQ聊天霸王 V2.06

【加密保护】:ASProtect 1.22 - 1.23 Beta 21 -> Alexey Solodovnikov

【编译语言】:Microsoft Visual Basic 5.0 / 6.0

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

【破解日期】:2005-08-15

【破解目的】:推广使用Ollydbg手动脱壳

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

—————————————————————————————————
【脱壳过程】: 

一、脱壳


侦壳脱壳:用PEiD查壳,ASProtect 1.22 - 1.23 Beta 21 -> Alexey Solodovnikov 加壳。

设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。

Ollydbg载入主程序:
          
00401000 >  68 01E04100         push QQ聊天霸.0041E001           // OD载入后停在这里
00401005    E8 01000000         call QQ聊天霸.0040100B
0040100A    C3                  retn
0040100B    C3                  retn
0040100C    DE4F A4             fimul word ptr ds:[edi-5C]
0040100F    BB D5CE976E         mov ebx,6E97CED5
00401014    E7 BB               out 0BB,eax

F9运行,程序会中断在异常处,Shift+F9通过异常:

00D8311C    3100                xor dword ptr ds:[eax],eax       // 第一次异常,Shift+F9
00D8311E    EB 01               jmp short 00D83121
00D83120    68 648F0500         push 58F64
00D83125    0000                add byte ptr ds:[eax],al
00D83127    00EB                add bl,ch
00D83129    02E8                add ch,al
00D8312B    0158 68             add dword ptr ds:[eax+68],ebx
00D8312E    AC                  lods byte ptr ds:[esi]
00D8312F    A9 D7006858         test eax,586800D7
00D83134    31D8                xor eax,ebx
00D83136    0068 5C             add byte ptr ds:[eax+5C],ch
00D83139    27                  daa
00D8313A    D800                fadd dword ptr ds:[eax]
00D8313C    68 5824D800         push 0D82458
00D83141    68 501ED800         push 0D81E50
00D83146    68 6018D800         push 0D81860
00D8314B    68 042BD800         push 0D82B04
00D83150    C3                  retn
00D83151    5D                  pop ebp
00D83152    C2 0400             retn 4

00D82B79    3100                xor dword ptr ds:[eax],eax       // 第二次异常,Shift+F9
00D82B7B    EB 01               jmp short 00D82B7E
00D82B7D    68 648F0500         push 58F64
00D82B82    0000                add byte ptr ds:[eax],al
00D82B84    00EB                add bl,ch
00D82B86    02E8                add ch,al
00D82B88    0158 E8             add dword ptr ds:[eax-18],ebx
00D82B8B  ^ 71 E4               jno short 00D82B71
00D82B8D    FFFF                ???                                               ; 未知命令
00D82B8F    E8 25000000         call 00D82BB9
00D82B94    8B4424 0C           mov eax,dword ptr ss:[esp+C]
00D82B98    8380 B8000000 02    add dword ptr ds:[eax+B8],2
00D82B9F    51                  push ecx
00D82BA0    31C9                xor ecx,ecx
00D82BA2    8948 04             mov dword ptr ds:[eax+4],ecx
00D82BA5    8948 08             mov dword ptr ds:[eax+8],ecx
00D82BA8    8948 0C             mov dword ptr ds:[eax+C],ecx
00D82BAB    8948 10             mov dword ptr ds:[eax+10],ecx
00D82BAE    C740 18 55010000    mov dword ptr ds:[eax+18],155
00D82BB5    59                  pop ecx
00D82BB6    31C0                xor eax,eax
00D82BB8    C3                  retn

00D82BC1    3100                xor dword ptr ds:[eax],eax       // 第三次异常,Shift+F9
00D82BC3    64:8F05 00000000    pop dword ptr fs:[0]
00D82BCA    58                  pop eax
00D82BCB    E8 88FAFEFF         call 00D72658
00D82BD0    A1 6C55D800         mov eax,dword ptr ds:[D8556C]
00D82BD5    8B00                mov eax,dword ptr ds:[eax]
00D82BD7    83E8 0D             sub eax,0D
00D82BDA    8B15 6C55D800       mov edx,dword ptr ds:[D8556C]
00D82BE0    8B12                mov edx,dword ptr ds:[edx]
00D82BE2    8B12                mov edx,dword ptr ds:[edx]

00D82EBE    3100                xor dword ptr ds:[eax],eax       // 第四次异常,Shift+F9
00D82EC0    EB 01               jmp short 00D82EC3
00D82EC2    68 648F0500         push 58F64
00D82EC7    0000                add byte ptr ds:[eax],al
00D82EC9    00EB                add bl,ch
00D82ECB    02E8                add ch,al
00D82ECD    0158 E8             add dword ptr ds:[eax-18],ebx
00D82ED0  ^ E0 E7               loopdne short 00D82EB9
00D82ED2    FFFF                ???                                               ; 未知命令
00D82ED4    33C0                xor eax,eax
00D82ED6    5A                  pop edx
00D82ED7    59                  pop ecx
00D82ED8    59                  pop ecx
00D82ED9    64:8910             mov dword ptr fs:[eax],edx
00D82EDC    68 F42ED800         push 0D82EF4
00D82EE1    8D85 F8FEFFFF       lea eax,dword ptr ss:[ebp-108]
00D82EE7    E8 5405FFFF         call 00D73440
00D82EEC    C3                  retn

00D818EA    3100                xor dword ptr ds:[eax],eax       // 第五次异常,Shift+F9
00D818EC    EB 01               jmp short 00D818EF
00D818EE    68 648F0500         push 58F64
00D818F3    0000                add byte ptr ds:[eax],al
00D818F5    00EB                add bl,ch
00D818F7    02E8                add ch,al
00D818F9    0158 A1             add dword ptr ds:[eax-5F],ebx
00D818FC    6C                  ins byte ptr es:[edi],dx
00D818FD    55                  push ebp
00D818FE    D800                fadd dword ptr ds:[eax]
00D81900    8B00                mov eax,dword ptr ds:[eax]
00D81902    8D70 24             lea esi,dword ptr ds:[eax+24]
00D81905    B2 01               mov dl,1
00D81907    A1 3CBCD700         mov eax,dword ptr ds:[D7BC3C]
00D8190C    E8 F710FFFF         call 00D72A08
00D81911    8BD8                mov ebx,eax
00D81913    EB 51               jmp short 00D81966

00D819C1    3100                xor dword ptr ds:[eax],eax       // 第六次异常,Shift+F9
00D819C3    EB 01               jmp short 00D819C6
00D819C5    68 648F0500         push 58F64
00D819CA    0000                add byte ptr ds:[eax],al
00D819CC    00EB                add bl,ch
00D819CE    02E8                add ch,al
00D819D0    0158 5A             add dword ptr ds:[eax+5A],ebx
00D819D3    5D                  pop ebp
00D819D4    5F                  pop edi
00D819D5    5E                  pop esi
00D819D6    5B                  pop ebx
00D819D7    C3                  retn

00D81EDB    3100                xor dword ptr ds:[eax],eax       // 第七次异常,Shift+F9
00D81EDD    EB 01               jmp short 00D81EE0
00D81EDF    68 648F0500         push 58F64
00D81EE4    0000                add byte ptr ds:[eax],al
00D81EE6    00EB                add bl,ch
00D81EE8    02E8                add ch,al
00D81EEA    0158 EB             add dword ptr ds:[eax-15],ebx
00D81EED    6A E8               push -18
00D81EEF    1906                sbb dword ptr ds:[esi],eax
00D81EF1    FFFF                ???                                               ; 未知命令
00D81EF3    8BF0                mov esi,eax
00D81EF5    8B03                mov eax,dword ptr ds:[ebx]
00D81EF7    0345 EC             add eax,dword ptr ss:[ebp-14]
00D81EFA    8945 FC             mov dword ptr ss:[ebp-4],eax
00D81EFD    8B4B 04             mov ecx,dword ptr ds:[ebx+4]

00D81FBB    3100                xor dword ptr ds:[eax],eax       // 第八次异常,Shift+F9
00D81FBD    EB 01               jmp short 00D81FC0
00D81FBF    68 648F0500         push 58F64
00D81FC4    0000                add byte ptr ds:[eax],al
00D81FC6    00EB                add bl,ch
00D81FC8    02E8                add ch,al
00D81FCA    0158 5F             add dword ptr ds:[eax+5F],ebx
00D81FCD    5E                  pop esi
00D81FCE    5B                  pop ebx
00D81FCF    8BE5                mov esp,ebp
00D81FD1    5D                  pop ebp
00D81FD2    C3                  retn
00D81FD3    00FF                add bh,bh
00D81FD5    FFFF                ???                                               ; 未知命令

00D824AE    3100                xor dword ptr ds:[eax],eax       // 第九次异常,Shift+F9
00D824B0    EB 01               jmp short 00D824B3
00D824B2    68 648F0500         push 58F64
00D824B7    0000                add byte ptr ds:[eax],al
00D824B9    00EB                add bl,ch
00D824BB    02E8                add ch,al
00D824BD    0158 A1             add dword ptr ds:[eax-5F],ebx
00D824C0    6C                  ins byte ptr es:[edi],dx
00D824C1    55                  push ebp
00D824C2    D800                fadd dword ptr ds:[eax]
00D824C4    8B00                mov eax,dword ptr ds:[eax]
00D824C6    8B00                mov eax,dword ptr ds:[eax]
00D824C8    8B15 6055D800       mov edx,dword ptr ds:[D85560]
00D824CE    8902                mov dword ptr ds:[edx],eax
00D824D0    B2 01               mov dl,1
00D824D2    A1 E812D800         mov eax,dword ptr ds:[D812E8]

00D82684    3100                xor dword ptr ds:[eax],eax       // 第十次异常,Shift+F9
00D82686    EB 01               jmp short 00D82689
00D82688    68 648F0500         push 58F64
00D8268D    0000                add byte ptr ds:[eax],al
00D8268F    00EB                add bl,ch
00D82691    02E8                add ch,al
00D82693    0158 8B             add dword ptr ds:[eax-75],ebx
00D82696    5D                  pop ebp
00D82697    E4 85               in al,85
00D82699    DB                  ???                                               ; 未知命令
00D8269A    75 09               jnz short 00D826A5
00D8269C    33C0                xor eax,eax
00D8269E    A3 786DD800         mov dword ptr ds:[D86D78],eax
00D826A3    EB 3C               jmp short 00D826E1
00D826A5    A1 6C55D800         mov eax,dword ptr ds:[D8556C]

00D831D4    3100                xor dword ptr ds:[eax],eax       // 第十一次异常,Shift+F9
00D831D6    EB 01               jmp short 00D831D9
00D831D8    68 648F0500         push 58F64
00D831DD    0000                add byte ptr ds:[eax],al
00D831DF    00EB                add bl,ch
00D831E1    02E8                add ch,al
00D831E3    0158 8D             add dword ptr ds:[eax-73],ebx
00D831E6    45                  inc ebp
00D831E7    F8                  clc
00D831E8    E8 0BE5FFFF         call 00D816F8
00D831ED    8B45 F8             mov eax,dword ptr ss:[ebp-8]
00D831F0    E8 A304FFFF         call 00D73698
00D831F5    50                  push eax
00D831F6    8B45 F8             mov eax,dword ptr ss:[ebp-8]
00D831F9    E8 5E06FFFF         call 00D7385C

00D83262    3100                xor dword ptr ds:[eax],eax       // 第十二次异常,Shift+F9
00D83264    EB 01               jmp short 00D83267
00D83266    68 648F0500         push 58F64
00D8326B    0000                add byte ptr ds:[eax],al
00D8326D    00EB                add bl,ch
00D8326F    02E8                add ch,al
00D83271    0158 B2             add dword ptr ds:[eax-4E],ebx
00D83274    01A1 E812D800       add dword ptr ds:[ecx+D812E8],esp
00D8327A    E8 C5E0FFFF         call 00D81344
00D8327F    8945 FC             mov dword ptr ss:[ebp-4],eax

00D83542    3100                xor dword ptr ds:[eax],eax       // 第十三次异常,Shift+F9
00D83544    EB 01               jmp short 00D83547
00D83546    68 648F0500         push 58F64
00D8354B    0000                add byte ptr ds:[eax],al
00D8354D    00EB                add bl,ch
00D8354F    02E8                add ch,al
00D83551    0158 A1             add dword ptr ds:[eax-5F],ebx
00D83554    44                  inc esp
00D83555    54                  push esp
00D83556    D800                fadd dword ptr ds:[eax]
00D83558    8038 00             cmp byte ptr ds:[eax],0
00D8355B    0F84 18010000       je 00D83679
00D83561    33C0                xor eax,eax

00D83812    3100                xor dword ptr ds:[eax],eax       // 第十四次异常,Shift+F9
00D83814    EB 01               jmp short 00D83817
00D83816    68 648F0500         push 58F64
00D8381B    0000                add byte ptr ds:[eax],al
00D8381D    00EB                add bl,ch
00D8381F    02E8                add ch,al
00D83821    0158 A1             add dword ptr ds:[eax-5F],ebx
00D83824    D054D8 00           rcl byte ptr ds:[eax+ebx*8],1
00D83828    8078 30 00          cmp byte ptr ds:[eax+30],0
00D8382C    75 0B               jnz short 00D83839
00D8382E    A1 D054D800         mov eax,dword ptr ds:[D854D0]
00D83833    8078 31 00          cmp byte ptr ds:[eax+31],0
00D83837    74 20               je short 00D83859
00D83839    A1 CC55D800         mov eax,dword ptr ds:[D855CC]
00D8383E    8378 24 00          cmp dword ptr ds:[eax+24],0

00D838CD    3100                xor dword ptr ds:[eax],eax       // 第十五次异常,Shift+F9
00D838CF    EB 01               jmp short 00D838D2
00D838D1    68 648F0500         push 58F64
00D838D6    0000                add byte ptr ds:[eax],al
00D838D8    00EB                add bl,ch
00D838DA    02E8                add ch,al
00D838DC    0158 33             add dword ptr ds:[eax+33],ebx
00D838DF    C05A 59 59          rcr byte ptr ds:[edx+59],59
00D838E3    64:8910             mov dword ptr fs:[eax],edx
00D838E6    68 0339D800         push 0D83903
00D838EB    8D45 EC             lea eax,dword ptr ss:[ebp-14]
00D838EE    E8 4DFBFEFF         call 00D73440
00D838F3    8D45 F8             lea eax,dword ptr ss:[ebp-8]
00D838F6    E8 45FBFEFF         call 00D73440
00D838FB    C3                  retn

00D82AA6    3100                xor dword ptr ds:[eax],eax       // 最后一次异常
00D82AA8    64:8F05 00000000    pop dword ptr fs:[0]
00D82AAF    58                  pop eax
00D82AB0    833D 786DD800 00    cmp dword ptr ds:[D86D78],0
00D82AB7    74 14               je short 00D82ACD
00D82AB9    6A 0C               push 0C
00D82ABB    B9 786DD800         mov ecx,0D86D78
00D82AC0    8D45 F8             lea eax,dword ptr ss:[ebp-8]
00D82AC3    BA 04000000         mov edx,4
00D82AC8    E8 63E1FFFF         call 00D80C30
00D82ACD    FF75 FC             push dword ptr ss:[ebp-4]
00D82AD0    FF75 F8             push dword ptr ss:[ebp-8]
00D82AD3    8B45 F4             mov eax,dword ptr ss:[ebp-C]
00D82AD6    8338 00             cmp dword ptr ds:[eax],0
00D82AD9    74 02               je short 00D82ADD
00D82ADB    FF30                push dword ptr ds:[eax]
00D82ADD    FF75 F0             push dword ptr ss:[ebp-10]
00D82AE0    FF75 EC             push dword ptr ss:[ebp-14]
00D82AE3    C3                  retn                            // F2直接在这下断! Shift+F9

中断后取消断点,F7返回到:

00D91CCC   /E9 54080000         jmp 00D92525                    // 返回到这里,Alt + M 打开内存映射
00D91CD1   |DA71 97             fidiv dword ptr ds:[ecx-69]
00D91CD4   |BE 0708F3C5         mov esi,C5F30807
00D91CD9   |71 51               jno short 00D91D2C
00D91CDB   |6BBD 2EBEC2B4 A2    imul edi,dword ptr ss:[ebp+B4C2BE2E],-5E
00D91CE2   |8ACC                mov cl,ah
00D91CE4   |C3                  retn
00D91CE5   |DAB0 F1112243       fidiv dword ptr ds:[eax+432211F1]
00D91CEB   |8562 94             test dword ptr ds:[edx-6C],esp
00D91CEE   |E5 AE               in eax,0AE
00D91CF0   |7B A9               jpo short 00D91C9B
00D91CF2   |2C A8               sub al,0A8
00D91CF4   |8826                mov byte ptr ds:[esi],ah
00D91CF6   |D9ED                fldln2
00D91CF8   |0A7488 1F           or dh,byte ptr ds:[eax+ecx*4+1F]
00D91CFC   |AB                  stos dword ptr es:[edi]
00D91CFD   |2E:C1A0 4CB7E3D9 23 shl dword ptr cs:[eax+D9E3B74C],23
00D91D05   |E7 B4               out 0B4,eax
00D91D07  ^|79 B4               jns short 00D91CBD
00D91D09   |003406              add byte ptr ds:[esi+eax],dh

———————————————————————————————————
内存映射,项目 21
 地址=00401000             // 在此处F2设置访问中断,F9运行,直达OEP!
 大小=0001A000 (106496.)
 物主=QQ聊天霸 00400000
 区段=
 包含=code
 类型=Imag 01001002
 访问=R
 初始访问=RWE
———————————————————————————————————

00401630    68 101D4000         push QQ聊天霸.00401D10          // 中断在此!在这儿用LordPE纠正ImageSize后完全DUMP这个进程
00401635    E8 EEFFFFFF         call QQ聊天霸.00401628
0040163A    0000                add byte ptr ds:[eax],al
0040163C    0000                add byte ptr ds:[eax],al
0040163E    0000                add byte ptr ds:[eax],al
00401640    3000                xor byte ptr ds:[eax],al
00401642    0000                add byte ptr ds:[eax],al
00401644    40                  inc eax
00401645    0000                add byte ptr ds:[eax],al
00401647    0000                add byte ptr ds:[eax],al
00401649    0000                add byte ptr ds:[eax],al
0040164B    006CBF E7           add byte ptr ds:[edi+edi*4-19],ch
0040164F    43                  inc ebx
00401650    C9                  leave
00401651    47                  inc edi
00401652    D911                fst dword ptr ds:[ecx]
00401654    889400 E04C3D87     mov byte ptr ds:[eax+eax+873D4CE0],dl

运行ImportREC 1.6,选择这个进程。把OEP改为00001630,点击“IAT AutoSearch”,然后点击“Get Imports”,函数指针无效。
再点“Show Invalid”,在无效函数上,鼠标右键选择“Trace Level 1(Disasm)”自动检测修复,这下指针有效了,Fix Dump !!
正常运行!看来这次ASProtect对这个输入表没有动太多的手脚。Microsoft Visual Basic 5.0 / 6.0 编写。

用LordPE删除data、adata共2个区段,然后再用LordPE“重建PE”,程序就精简了不少。93.5 KB -> 188 KB -> 113 KB

————————————————————————————————— 
二、破解 


脱壳后的程序在启动时还是有“延时NAG提示框”,去掉NAG岂不很顺眼?

分析一下,这个NAG应该是程序的注册验证所致,所以。。。“直捣黄龙”

下断:bpx __vbaStrCmp

F9运行,断下:

00417B08    FF15 BCE04200       call dword ptr ds:[<&msvbvm60.#406>]        // 这里中断,F8单步  ; msvbvm60.__vbaStrCmp
00417B0E    85C0                test eax,eax                                // eax为0则跳
00417B10    0F84 08070000       je dumped_.0041821E                         // 不能条,所以 nop 掉!★验证爆破点★
00417B16    8D95 C4FEFFFF       lea edx,dword ptr ss:[ebp-13C]

代码修改完后保存文件,运行!OK,启动注册框没了,主要的功能限制也“烟消云散”了!破解成功!

————————————————————————————————— 
三、总结


其实遇到 ASProtect 这类世界名壳来说,也不必畏惧,只要你有耐心,一定会和我们一样,做得更好!

【完美爆破点】

00417B10    0F84 08070000       je dumped_.0041821E           // nop 掉!

------------------------------------------------------------------

★★★★★★ 纪念中华人民共和国 抗日战争胜利60周年 ★★★★★★

--------------------------------------------------------------------------

版权所有(C)2005 KuNgBiM[DFCG]         Copyright (C) 2005 KuNgBiM[DFCG]

--------------------------------------------------------------------------
          UnPacked_Cracked By KuNgBiM[DFCG]

                     2005-08-15   

                     15:10:15 PM