【破解作者】 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)
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)