【破解作者】 zmw1224
【作者邮箱】 zmw1224@yahoo.com.cn
【使用工具】 OD,PEiD
【破解平台】 Win9x/NT/2000/XP
【软件名称】 GreenBrowser 2.3(Build 1220)
【下载地址】 http://www.morequick.com/indexgb.htm
【软件简介】 GreenBrowser 是一个多窗口浏览器,它基于 IE,并且提供了更多的特色功能。 
收集器、鼠标手势、鼠标拖放、搜索引擎、页面背景色、工具栏皮肤、代理、标签栏、快捷键、自动滚屏、自动保存、自动填表、自动隐藏工具栏、启动模式、页内链接分析、群组、状态栏显示设定、特定的下载控制方案、搜索栏、扩展工具栏、运行脚本、下载管理器、页面缩放... 


【软件大小】 763KB
【加壳方式】 ASPack 2.12 -> Alexey Solodovnikov
【破解声明】 本笔记只用于学习交流,初学Crack,只是感兴趣技术,没有其他目的,如有不妥之处希望作者谅解。
--------------------------------------------------------------------------------
【破解内容】


GreenBrowser是个不错的浏览器,相信不少朋友用它,东东小,而且各方面也都不错。无意中发现,如果不是捐助用
户,无捐助码的话,就会显示“副本未捐助”,看上去不怎么舒服,所以就想把这个“未捐助”给解决掉。废话就不多说,开工。

ASPack 2.12 的壳,用脱壳机脱了它,脱出庐山真面目,Microsoft Visual C++ 6.0,OD载入后,查找字符串,没
找到什么有用信息,看来只能下断了,OD载入停在下面:
0048A835 >/$  55            PUSH EBP
0048A836  |.  8BEC          MOV EBP,ESP
0048A838  |.  6A FF         PUSH -1
0048A83A  |.  68 10274D00   PUSH Unpacked.004D2710
0048A83F  |.  68 F4E14800   PUSH Unpacked.0048E1F4                   ;  SE handler installation
0048A844  |.  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0048A84A  |.  50            PUSH EAX
0048A84B  |.  64:8925 00000>MOV DWORD PTR FS:[0],ESP
0048A852  |.  83EC 58       SUB ESP,58
0048A855  |.  53            PUSH EBX
0048A856  |.  56            PUSH ESI
0048A857  |.  57            PUSH EDI
0048A858  |.  8965 E8       MOV DWORD PTR SS:[EBP-18],ESP

跳过两次异常,Shift+F9后程序正常启动,输入相关信息:
用户名:zmw1224
捐助码:1234567
然后在命令窗口下断:bp GetWindowTextA(大部分VC的用这个断点,都能断下。),确定后马上被断停在下面:
堆栈的内容:
0012F4E4   0049D3CE  /CALL 到 GetWindowTextA 来自 Unpacked.0049D3C8
0012F4E8   001203A4  |hWnd = 001203A4 (class='Edit',parent=000C0356)
0012F4EC   00BAD2F8  |Buffer = 00BAD2F8
0012F4F0   00000008  \Count = 8
0012F4F4   0012FAB8
0012F4F8   004097B2  返回到 Unpacked.004097B2 来自 Unpacked.0049D3A3
0012F4FC   0012F508
0012F500   004C4948  Unpacked.004C4948
0012F504   004F0A70  Unpacked.004F0A70

Alt+F9返回领空停在下面:
0049D3BE  |.  50            PUSH EAX
0049D3BF  |.  E8 91340000   CALL Unpacked.004A0855
0049D3C4  |.  50            PUSH EAX                                 ; |Buffer
0049D3C5  |.  FF76 1C       PUSH DWORD PTR DS:[ESI+1C]               ; |hWnd
0049D3C8  |.  FF15 24354C00 CALL DWORD PTR DS:[<&USER32.GetWindowTex>; \GetWindowTextA
0049D3CE  |.  8B4C24 08     MOV ECX,DWORD PTR SS:[ESP+8]             返回后停在这。
0049D3D2  |.  6A FF         PUSH -1
0049D3D4  |.  E8 54340000   CALL Unpacked.004A082D
0049D3D9  |.  EB 0C         JMP SHORT Unpacked.0049D3E7
0049D3DB  |>  8B01          MOV EAX,DWORD PTR DS:[ECX]
0049D3DD  |.  FF7424 08     PUSH DWORD PTR SS:[ESP+8]
0049D3E1  |.  FF90 88000000 CALL DWORD PTR DS:[EAX+88]
0049D3E7  |>  5E            POP ESI
0049D3E8  \.  C2 0400       RETN 4




( 取消断点)RETN后停在这:
004097AD   .  E8 F13B0900   CALL Unpacked.0049D3A3
004097B2   .  8B4C24 08     MOV ECX,DWORD PTR SS:[ESP+8]    获取用户名
004097B6   .  8379 F8 01    CMP DWORD PTR DS:[ECX-8],1    判断用户名是否大于1,是就跳,不是就住下走,然后over.
004097BA   .  7D 0E         JGE SHORT Unpacked.004097CA
004097BC   .  6A FF         PUSH -1
004097BE   .  6A 00         PUSH 0
004097C0   .  68 4FEF0000   PUSH 0EF4F
004097C5   .  E9 A1000000   JMP Unpacked.0040986B
004097CA   >  8D5424 04     LEA EDX,DWORD PTR SS:[ESP+4]
004097CE   .  8D8E 98000000 LEA ECX,DWORD PTR DS:[ESI+98]
004097D4   .  52            PUSH EDX
004097D5   .  E8 C93B0900   CALL Unpacked.0049D3A3         这是获取捐助码
004097DA   .  8B4424 04     MOV EAX,DWORD PTR SS:[ESP+4]
004097DE   .  8378 F8 01    CMP DWORD PTR DS:[EAX-8],1      判断是否小于1,小就跳
004097E2   .  7E 7E         JLE SHORT Unpacked.00409862
004097E4   .  51            PUSH ECX
004097E5   .  8D5424 08     LEA EDX,DWORD PTR SS:[ESP+8]
004097E9   .  8BCC          MOV ECX,ESP
004097EB   .  896424 10     MOV DWORD PTR SS:[ESP+10],ESP
004097EF   .  52            PUSH EDX
004097F0   .  E8 2E690900   CALL Unpacked.004A0123
004097F5   .  E8 96BF0000   CALL Unpacked.00415790       这是关键CALL跟进
004097FA   .  83C4 04       ADD ESP,4
004097FD   .  85C0          TEST EAX,EAX
004097FF   .  74 56         JE SHORT Unpacked.00409857
00409801   .  E8 8E870A00   CALL Unpacked.004B1F94



关键CALL:
00415790  /$  6A FF         PUSH -1
00415792  |.  68 18884B00   PUSH Unpacked.004B8818                   ;  SE handler installation
00415797  |.  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0041579D  |.  50            PUSH EAX
0041579E  |.  64:8925 00000>MOV DWORD PTR FS:[0],ESP
004157A5  |.  83EC 38       SUB ESP,38
004157A8  |.  56            PUSH ESI
004157A9  |.  33F6          XOR ESI,ESI
004157AB  |.  8D4C24 4C     LEA ECX,DWORD PTR SS:[ESP+4C]
004157AF  |.  897424 44     MOV DWORD PTR SS:[ESP+44],ESI
004157B3  |.  E8 6B300800   CALL Unpacked.00498823           取捐助码
004157B8  |.  8D4C24 4C     LEA ECX,DWORD PTR SS:[ESP+4C]
004157BC  |.  E8 16300800   CALL Unpacked.004987D7
004157C1  |.  8B4424 4C     MOV EAX,DWORD PTR SS:[ESP+4C]  把捐助码1234567送到EAX,EAX=1234567
004157C5  |.  8B40 F8       MOV EAX,DWORD PTR DS:[EAX-8]   EAX=7
004157C8  |.  83F8 0A       CMP EAX,0A                     进行判断,捐助码是否等于10位,是就跳,不是就over了,没办法捐助码不合法,重新输入捐助码1234567890后重复上面工作,还来到这。
004157CB  |.  74 23         JE SHORT Unpacked.004157F0
004157CD  |.  8D4C24 4C     LEA ECX,DWORD PTR SS:[ESP+4C]
004157D1  |.  C74424 44 FFF>MOV DWORD PTR SS:[ESP+44],-1
004157D9  |.  E8 D0AB0800   CALL Unpacked.004A03AE
004157DE  |.  33C0          XOR EAX,EAX
004157E0  |.  5E            POP ESI
004157E1  |.  8B4C24 38     MOV ECX,DWORD PTR SS:[ESP+38]
004157E5  |.  64:890D 00000>MOV DWORD PTR FS:[0],ECX
004157EC  |.  83C4 44       ADD ESP,44

等于10位后就跳到下面:
004157F0  |> \A1 5C0A4F00   MOV EAX,DWORD PTR DS:[4F0A5C]
004157F5  |.  53            PUSH EBX
004157F6  |.  57            PUSH EDI
004157F7  |.  894424 0C     MOV DWORD PTR SS:[ESP+C],EAX
004157FB  |.  894424 10     MOV DWORD PTR SS:[ESP+10],EAX
004157FF  |.  8D4C24 14     LEA ECX,DWORD PTR SS:[ESP+14]
00415803  |.  6A 05         PUSH 5
00415805  |.  51            PUSH ECX
00415806  |.  8D4C24 5C     LEA ECX,DWORD PTR SS:[ESP+5C]
0041580A  |.  C64424 54 02  MOV BYTE PTR SS:[ESP+54],2
0041580F  |.  E8 D52B0800   CALL Unpacked.004983E9
00415814  |.  50            PUSH EAX
00415815  |.  8D4C24 10     LEA ECX,DWORD PTR SS:[ESP+10]
00415819  |.  C64424 50 03  MOV BYTE PTR SS:[ESP+50],3
0041581E  |.  E8 C4AC0800   CALL Unpacked.004A04E7
00415823  |.  8D4C24 14     LEA ECX,DWORD PTR SS:[ESP+14]
00415827  |.  C64424 4C 02  MOV BYTE PTR SS:[ESP+4C],2
0041582C  |.  E8 7DAB0800   CALL Unpacked.004A03AE
00415831  |.  8D5424 18     LEA EDX,DWORD PTR SS:[ESP+18]
00415835  |.  6A 05         PUSH 5
00415837  |.  52            PUSH EDX
00415838  |.  8D4C24 5C     LEA ECX,DWORD PTR SS:[ESP+5C]
0041583C  |.  E8 2C2B0800   CALL Unpacked.0049836D
00415841  |.  50            PUSH EAX
00415842  |.  8D4C24 14     LEA ECX,DWORD PTR SS:[ESP+14]     上面的CALL多,不用一个个跟,看堆栈内容分析得,分别取前5位和后5位
00415846  |.  C64424 50 04  MOV BYTE PTR SS:[ESP+50],4
0041584B  |.  E8 97AC0800   CALL Unpacked.004A04E7
00415850  |.  8D4C24 18     LEA ECX,DWORD PTR SS:[ESP+18]
00415854  |.  C64424 4C 02  MOV BYTE PTR SS:[ESP+4C],2
00415859  |.  E8 50AB0800   CALL Unpacked.004A03AE
0041585E  |.  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]
00415862  |.  E8 8DB00800   CALL Unpacked.004A08F4       这个取前5位,并按第五位、第四位、第三位、第二位、第一位的排列,我的就是54321   
00415867  |.  33C0          XOR EAX,EAX                  EAX清0,下面是赋初值,关键。
00415869  |.  C74424 1C 020>MOV DWORD PTR SS:[ESP+1C],2      把2存到内存单元中,[ESP+1C]=2
00415871  |.  894424 34     MOV DWORD PTR SS:[ESP+34],EAX
00415875  |.  C74424 20 060>MOV DWORD PTR SS:[ESP+20],6      把6存到内存单元中, [ESP+20]=6
0041587D  |.  894424 38     MOV DWORD PTR SS:[ESP+38],EAX
00415881  |.  C74424 24 F9F>MOV DWORD PTR SS:[ESP+24],-7     把-7存到内存单元中,[ESP+24]=-7
00415889  |.  894424 3C     MOV DWORD PTR SS:[ESP+3C],EAX
0041588D  |.  C74424 28 040>MOV DWORD PTR SS:[ESP+28],4      把4存到内存单元中,[ESP+28]=4
00415895  |.  C74424 2C FFF>MOV DWORD PTR SS:[ESP+2C],-1     把-1存到内存单元中,[ESP+2C]=-1
0041589D  |.  C74424 30 080>MOV DWORD PTR SS:[ESP+30],8      把8存到内存单元中,[ESP+30]=8
004158A5  |.  894424 40     MOV DWORD PTR SS:[ESP+40],EAX    下面要开始算法了,我见过最简单的算法。
004158A9  |.  8D7C24 1C     LEA EDI,DWORD PTR SS:[ESP+1C] 这是传第一个初值数的地址。
004158AD  |>  8B4C24 0C     /MOV ECX,DWORD PTR SS:[ESP+C] 把54321移到ECX,ECX=54321
004158B1  |.  8A17          |MOV DL,BYTE PTR DS:[EDI]     这是寄存器间接寻址,把2移到DL,DL=2
004158B3  |.  8A040E        |MOV AL,BYTE PTR DS:[ESI+ECX] 把第一个数5(35)移到AL里,AL=35
004158B6  |.  02C2          |ADD AL,DL                      AL=AL(35)+DL(2)=37
004158B8  |.  3C 30         |CMP AL,30                      判断是否大于30(即0)
004158BA  |.  884424 14     |MOV BYTE PTR SS:[ESP+14],AL    把AL的值存起来,[ESP+14]=AL=37
004158BE  |.  7D 06         |JGE SHORT Unpacked.004158C6    大于就跳,不大就往下走。
004158C0  |.  04 0A         |ADD AL,0A                      把不大于的值加A
004158C2  |.  884424 14     |MOV BYTE PTR SS:[ESP+14],AL    把AL的值存起来,[ESP+14]=AL
004158C6  |>  3C 39         |CMP AL,39                      判断AL的值,是否小于39(即,9),小于就跳
004158C8  |.  7E 06         |JLE SHORT Unpacked.004158D0
004158CA  |.  04 F6         |ADD AL,0F6                     不小于的话,AL=AL+0F6
004158CC  |.  884424 14     |MOV BYTE PTR SS:[ESP+14],AL    把AL存起来,[ESP+14]=AL
004158D0  |>  8B5424 14     |MOV EDX,DWORD PTR SS:[ESP+14]
004158D4  |.  8D4C24 0C     |LEA ECX,DWORD PTR SS:[ESP+C]
004158D8  |.  52            |PUSH EDX
004158D9  |.  56            |PUSH ESI
004158DA  |.  E8 27B00800   |CALL Unpacked.004A0906          这个CALL是把AL转化为相应ASCii字符,即37=7
004158DF  |.  46            |INC ESI
004158E0  |.  83C7 04       |ADD EDI,4                       这是移到下个初值的内存单元。
004158E3  |.  83FE 05       |CMP ESI,5                       判断是否取完5个数了?没有继续循环。
004158E6  |.^ 7C C5         \JL SHORT Unpacked.004158AD      后面4个数不加了,code[1]+2,code[2]+6,code[3]+F9,code[4]+4,code[5]+FF
004158E8  |.  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]     算完后EAX=70660
004158EC  |.  E8 03B00800   CALL Unpacked.004A08F4          这个CALL再把算好的注册码,再颠倒回去,EAX=06607,
004158F1  |.  8B7424 10     MOV ESI,DWORD PTR SS:[ESP+10]     取出计算后的值到ESI,ESI=06607
004158F5  |.  8B4424 0C     MOV EAX,DWORD PTR SS:[ESP+C]      EAX=67890
004158F9  |>  8A10          /MOV DL,BYTE PTR DS:[EAX]
004158FB  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]          后面是真假注册码,逐位比较,不等就OVER了。
004158FD  |.  8ACA          |MOV CL,DL
004158FF  |.  3AD3          |CMP DL,BL
00415901  |.  75 1E         |JNZ SHORT Unpacked.00415921
00415903  |.  84C9          |TEST CL,CL
00415905  |.  74 16         |JE SHORT Unpacked.0041591D
00415907  |.  8A50 01       |MOV DL,BYTE PTR DS:[EAX+1]
0041590A  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]
0041590D  |.  8ACA          |MOV CL,DL
0041590F  |.  3AD3          |CMP DL,BL
00415911  |.  75 0E         |JNZ SHORT Unpacked.00415921
00415913  |.  83C0 02       |ADD EAX,2
00415916  |.  83C6 02       |ADD ESI,2
00415919  |.  84C9          |TEST CL,CL
0041591B  |.^ 75 DC         \JNZ SHORT Unpacked.004158F9
0041591D  |>  33C0          XOR EAX,EAX
0041591F  |.  EB 05         JMP SHORT Unpacked.00415926

--------------------------------------------------------------------------------
【破解总结】


用户名和捐助码无关,捐助码必须等于10位,分别取5位4位3位2位1位进行运算。
后5位是经过前5位所算出来的。运算如下(运算过程中取的都是低位,这里容易出错):
CODE=code[1]code[2]code[3]code[4]code[5]SUM5SUM4SUM3SUM2SUM1(十位数,前5位取0-9,最好算)

SUM1=toascii(code[5])+2,(如果code[5]是“!、@、#、$、*等”SUM1=SUM1+A,如果SUM1大于39还要加F6。并取SUM1低位,转化成相应ASCii字符)

SUM2=toascii(code[4])+6,(,如果code[4]是“!、@、#、$、*等”SUM2=SUM2+A,如果SUM1大于39还要加F6。并取SUM2低位,转化成相应ASCii字符)


SUM3=toascii(code[3])]+F9,(code[3])+2,如果code[5]是“!、@、#、$、*等”SUM3=SUM3+A,如果SUM1大于39还要加F6。并取SUM3低位,转化成相应ASCii字符)


SUM4=toascii(code[2])+4,,如果code[2]是“!、@、#、$、*等”SUM4=SUM4+A,如果SUM1大于39还要加F6。并取SUM4低位,转化成相应ASCii字符)


SUM5=toascii(code[1])]+FF (c如果code[1]是“!、@、#、$、*等”SUM5=SUM5+A,如果SUM1大于39还要加F6。并取SUM5低位,转化成相应ASCii字符)

后话:这个算法比较简单,所以破文写的还是详细,难度还没有Crackme大,只要加上几个固定数转化下就出来了,
算法分析,汇编基本功很重要,七种寻址方式,N种算术逻辑运算,都要很好掌握,以后研究起算法来才不觉得吃力
写算法分析文章,就是我写的累,你看得也累,呵呵^_^,感谢你看完全文!


--------------------------------------------------------------------------------
【用户名、密码】


用户名:zmw1224
捐助码:1234506607(给个5发的码8888872140)


--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!