不脱壳破解Graph ZX V1.2
破解作者
yzez[DFCG][BCG][FCG]
破解工具
PEID、OLLYDBG1.09
软件介绍
Graph ZX V1.2
软件大小: 2166 KB
软件语言: 英文
软件类别: 国外软件 / 共享版 / 媒体制作
应用平台: Win9x/NT/2000/XP
界面预览: 无
加入时间: 2003-11-02 15:56:13
下载次数: 38
推荐等级:
一款可以快速将图片加入到网页或幻灯片中的工具,包括多种图形,如ASP的动态3D图形、条状图、
饼图、线等等,可以生成SWF动画文件,并将其发布到Flash、PowerPoint或网页上。
下载地址:
http://www.skycn.com/soft/14418.html
破解目的
不为破解而破解,只为技术而破解,只为交流技术,请不要用于商业目的.
破解过程
1、很感谢lordor的美文《破解我从不脱壳》,是这一篇文章的指导,我完成了这个破解。用PEID查壳是:
Shrinker 3.4 的壳,找OEP找不到,我倒!手动脱,我是超级大菜鸟,所以学习lordor不脱壳来破,先运行
Graph ZX V1.2程序,出现注册信息,输入任意注册信息,我输入,用户名:yzez,用户单位:[DFCG][BCG][FCG],
生成的机器码是:2088-7970-8446.试验码:1234-5678-9009,打开OD,用附加功能,载入程序,按F9运行,
按下注册,出现出错信息框,不要管,回到OD的主界面,按F12键,程序被断,在左上窗口,右键单击,选:
Search for----Name in all modules,又会弹出一个信息框里,在这个信息框里,查找:GetWindowTextA,有几处,
一个个试,要找到能到程序领空或者最接近程序领空的,找到后,按F8往下走,很快就到程序的关键处,记下地址,
退出OD,然后再次附加,在关键点设断。看下面:
004909FB CALL ZXGraph.0044BA50***********我们在这里设下断点!
00490A00 CMP DWORD PTR SS:[EBP-1F8], 0**取得输入试验码的位数,测试是否输入注册码!
00490A07 JE ZXGraph.00490DCA***********没有输入就跳走,失败!
00490A0D LEA EAX, DWORD PTR SS:[EBP-10]
00490A10 CALL ZXGraph.00404DC4
00490A15 LEA EDX, DWORD PTR SS:[EBP-1FC]
00490A1B MOV EAX, DWORD PTR DS:[EDI+308]
00490A21 CALL ZXGraph.0044BA50
00490A26 MOV EAX, DWORD PTR SS:[EBP-1FC]****机器码移入EAX,我的机器码是2088-7970-8446
00490A2C LEA EDX, DWORD PTR SS:[EBP-1C]
00490A2F E8 5C86F7FF CALL ZXGraph.00409090
***************************************************************************************
中间有一大段代码对机器码进行处理,处理的结果就是把机器码中间的“-”去掉,变成:208879708446
这个过程没有必要详细说明,所以省略一大段代码!我们继续往下看!
00490ABA INC EBX***************************EBX+1,EBX控制循环的次数!
00490ABB DEC ESI***************************ESI-1,ESI存放机器码的位数:E(十进制值是15)
00490ABC ^ JNZ SHORT ZXGraph.00490A46*********就是这个循环控制对机器码的处理,一共循环15次
00490ABE MOV EAX, DWORD PTR SS:[EBP-10]****处理完后的机器码208879708446移入EAX
00490AC1 CALL ZXGraph.00405084**************取得转换后的机器码的位数:12(十六进制值是C)
00490AC6 CMP EAX, 0C***********************把位数C移入EAX,比较位数是否是0C位!
00490AC9 JNZ ZXGraph.00490DCA**************不是就跳走,失败!这里是12位,不跳!
00490ACF LEA EAX, DWORD PTR SS:[EBP-4]*****赋EAX地址值!
00490AD2 PUSH EAX
00490AD3 MOV ECX, 4************************常数4送ECX
00490AD8 MOV EDX, 1************************赋EDX的初始值为1,即把第一位机器码加进去!
00490ADD MOV EAX, DWORD PTR SS:[EBP-10]****变换后的机器码入EAX
00490AE0 CALL ZXGraph.004052E4**************再次变形机器码加上第一位机器码,变成2208879708446
**************************************************然后取前4位:2208
00490AE5 LEA EAX, DWORD PTR SS:[EBP-8]*****赋EAX地址值
00490AE8 PUSH EAX
00490AE9 MOV ECX, 4************************常数4送ECX
00490AEE MOV EDX, 5************************把常数5赋EDX
00490AF3 MOV EAX, DWORD PTR SS:[EBP-10]****变换后的机器码入EAX
00490AF6 CALL ZXGraph.004052E4**************从第5位开始取机器码的中间四位:8797
00490AFB LEA EAX, DWORD PTR SS:[EBP-C]
00490AFE PUSH EAX
00490AFF MOV ECX, 4************************常数4送ECX
00490B04 MOV EDX, 9************************把常数9赋EDX
00490B09 MOV EAX, DWORD PTR SS:[EBP-10]
00490B0C CALL ZXGraph.004052E4**************从第9位取四位:0844
00490B11 LEA EAX, DWORD PTR SS:[EBP-20C]
00490B17 PUSH EAX
00490B18 MOV ECX, 1************************常数1送ECX
00490B1D MOV EDX, 1************************把常数1赋EDX
00490B22 MOV EAX, DWORD PTR SS:[EBP-4]*****取出的第一组的变形机器码:2208入EAX
00490B25 CALL ZXGraph.004052E4**************取第一位2保存到内存地址:00B00C78处
00490B2A PUSH DWORD PTR SS:[EBP-20C]
00490B30 LEA EAX, DWORD PTR SS:[EBP-210]
00490B36 PUSH EAX
00490B37 MOV ECX, 1************************赋ECX的值1
00490B3C MOV EDX, 3************************赋EDX的值3
00490B41 MOV EAX, DWORD PTR SS:[EBP-4]*****2208入EAX
00490B44 CALL ZXGraph.004052E4**************取第三位0
00490B49 PUSH DWORD PTR SS:[EBP-210]
00490B4F LEA EAX, DWORD PTR SS:[EBP-214]
00490B55 PUSH EAX
00490B56 MOV ECX, 1
00490B5B MOV EDX, 1
00490B60 MOV EAX, DWORD PTR SS:[EBP-8]
00490B63 CALL ZXGraph.004052E4*************取第二组:8797的第一位:8
00490B68 PUSH DWORD PTR SS:[EBP-214]
00490B6E LEA EAX, DWORD PTR SS:[EBP-218]
00490B74 PUSH EAX
00490B75 MOV ECX, 1
00490B7A MOV EDX, 3
00490B7F MOV EAX, DWORD PTR SS:[EBP-8]
00490B82 CALL ZXGraph.004052E4*************取第二组:8797的第三位:9
00490B87 PUSH DWORD PTR SS:[EBP-218]
00490B8D LEA EAX, DWORD PTR SS:[EBP-21C]
00490B93 PUSH EAX
00490B94 MOV ECX, 1
00490B99 MOV EDX, 1
00490B9E MOV EAX, DWORD PTR SS:[EBP-C]
00490BA1 CALL ZXGraph.004052E4*************取第三组:0844的第一位:0
00490BA6 PUSH DWORD PTR SS:[EBP-21C]
00490BAC LEA EAX, DWORD PTR SS:[EBP-220]
00490BB2 PUSH EAX
00490BB3 MOV ECX, 1
00490BB8 MOV EDX, 3
00490BBD MOV EAX, DWORD PTR SS:[EBP-C]
00490BC0 CALL ZXGraph.004052E4*************取第三组:0844的第三位:4
00490BC5 PUSH DWORD PTR SS:[EBP-220]
00490BCB LEA EAX, DWORD PTR SS:[EBP-224]
00490BD1 PUSH EAX
00490BD2 MOV ECX, 1
00490BD7 MOV EDX, 2
00490BDC MOV EAX, DWORD PTR SS:[EBP-4]
00490BDF CALL ZXGraph.004052E4*************取第一组:2208的第二位:2
00490BE4 PUSH DWORD PTR SS:[EBP-224]
00490BEA LEA EAX, DWORD PTR SS:[EBP-18]
00490BED MOV EDX, 7**********************取完了7位吗?
00490BF2 CALL ZXGraph.00405144************这个CALL把取出的7位连接起来,就是:2089042
00490BF7 PUSH 0
00490BF9 PUSH 867D
00490BFE MOV EAX, DWORD PTR SS:[EBP-18]**2089042移入EAX中
00490C01 CALL ZXGraph.004094D8************关键CALL,按F7跟进!
00490C06 CALL ZXGraph.00405C40************算法CALL(3),按F7跟进!调用算法CALL(2),不列代码
****只说明过程:1FE052*867D=10BEFB740A,把这个值保存到EAX中
00490C0B ADD EAX, 3**********************EAX=EAX+3=10BEFB740D
00490C0E ADC EDX, 0**********************高位放EDX,即把10入EDX
00490C11 MOV DWORD PTR SS:[EBP-28], EAX**保存低位BEFB740D
00490C14 MOV DWORD PTR SS:[EBP-24], EDX**保存高位10
00490C17 PUSH DWORD PTR SS:[EBP-24]*******高位入栈
00490C1A PUSH DWORD PTR SS:[EBP-28]*******低位入栈
00490C1D LEA EAX, DWORD PTR SS:[EBP-14]
00490C20 CALL ZXGraph.004093E4***********把10BEFB740D转化成十进制值就是:71923627021
00490C25 MOV EAX, DWORD PTR SS:[EBP-14]
00490C28 CALL ZXGraph.00405084
00490C2D CMP EAX, 0C*******************比较得到的结果是:C位吗?上面的结果是:11位(0B位)
00490C30 JGE SHORT ZXGraph.00490C42****大于就跳
00490C32 LEA EAX, DWORD PTR SS:[EBP-14]
00490C35 MOV ECX, DWORD PTR SS:[EBP-14]********把上述结果71923627021移入ECX
00490C38 MOV EDX, ZXGraph.00490E54
00490C3D CALL ZXGraph.004050D0*******************此CALL补足注册码12位,补的过程是这样,第一位用0补足
00490C42 LEA EAX, DWORD PTR SS:[EBP-228]
00490C48 PUSH EAX
00490C49 MOV ECX, 4******************************这里是把注册码组起来,每次取四位,后面省略了!
00490C4E MOV EDX, 1******************************取第一组注册码!从第一位取起
00490C53 MOV EAX, DWORD PTR SS:[EBP-14]**********把处理过的注册码071923627021移入EAX
00490C56 CALL ZXGraph.004052E4********************取出第一组注册码,取前四位,即:0719
00490C5B PUSH DWORD PTR SS:[EBP-228]
00490C61 PUSH ZXGraph.00490E3C
00490C66 LEA EAX, DWORD PTR SS:[EBP-22C]
00490C6C PUSH EAX
00490C6D MOV ECX, 4******************************再取四位注册码,组成第二组
00490C72 MOV EDX, 5******************************赋EDX的值为5,即从第五位取起
00490C77 MOV EAX, DWORD PTR SS:[EBP-14]**********把处理过的注册码071923627021移入EAX
00490C7A CALL ZXGraph.004052E4********************从第5位取起,取出第二组注册码:2362
00490C7F PUSH DWORD PTR SS:[EBP-22C]
00490C85 PUSH ZXGraph.00490E3C
00490C8A LEA EAX, DWORD PTR SS:[EBP-230]
00490C90 PUSH EAX
00490C91 MOV ECX, 4*****************************赋ECX的值4,再取四位组成第三组注册码
00490C96 MOV EDX, 9*****************************赋EDX的值9,即从第9位取起
00490C9B MOV EAX, DWORD PTR SS:[EBP-14]**********把处理过的注册码071923627021移入EAX
00490C9E CALL ZXGraph.004052E4********************从第9位取,取第三组注册码:7021
00490CA3 PUSH DWORD PTR SS:[EBP-230]
00490CA9 LEA EAX, DWORD PTR SS:[EBP-14]
00490CAC MOV EDX, 5
00490CB1 CALL ZXGraph.00405144
00490CB6 LEA EDX, DWORD PTR SS:[EBP-234]
00490CBC MOV EAX, DWORD PTR DS:[EDI+304]
00490CC2 CALL ZXGraph.0044BA50
00490CC7 MOV EDX, DWORD PTR SS:[EBP-234]**试验码1234-5678-9009入EDX
00490CCD MOV EAX, DWORD PTR SS:[EBP-14]***真码0719-2362-7021入EAX
00490CD0 CALL ZXGraph.004051D0*************关键比较
00490CD5 JNZ SHORT ZXGraph.00490D03*******不相等就跳!
00490CD7 LEA EAX, DWORD PTR SS:[EBP-238]***不跳往下
0049******************省略一部分代码!*******************************************
00490D66 MOV DL, 2
00490D68 MOV EAX, ZXGraph.00490E78**Application successfully registered. Thank you for your support.
********************************************这是注册成功信息!你看成功了吧!
00490D6D CALL ZXGraph.0042E828
00490DB2 MOV DL, 1
00490DB4 MOV EAX, ZXGraph.00490EC4**Error. Unable to confirm registration. Please contact support
*******************************************出错了!
-------------------------------------------------------------------------------------------
关键CALL的代码:
004094D8 PUSH EBX***********************跟进关键CALL后,我们在这里!
004094D9 ADD ESP, -14
004094DC MOV EBX, EAX
004094DE LEA EDX, DWORD PTR SS:[ESP+8]
004094E2 MOV EAX, EBX
004094E4 CALL ZXGraph.00405CE0***********算法CALL(1),按F7跟进!
004094E9 MOV DWORD PTR SS:[ESP], EAX
004094EC MOV DWORD PTR SS:[ESP+4], EDX
004094F0 CMP DWORD PTR SS:[ESP+8], 0
004094F5 JE SHORT ZXGraph.00409510
004094F7 MOV DWORD PTR SS:[ESP+C], EBX
004094FB MOV BYTE PTR SS:[ESP+10], 0B
00409500 LEA EDX, DWORD PTR SS:[ESP+C]
00409504 MOV EAX, DWORD PTR DS:[4A7454]
00409509 XOR ECX, ECX
0040950B CALL ZXGraph.00408D4C
00409510 MOV EAX, DWORD PTR SS:[ESP]
00409513 MOV EDX, DWORD PTR SS:[ESP+4]
00409517 ADD ESP, 14
0040951A POP EBX
0040951B RETN
--------------------------------------------------------------------------------------
算法CALL(1)的代码:
00405CE0 PUSH EBX
00405CE1 PUSH ESI
00405CE2 PUSH EDI
00405CE3 PUSH EBP
00405CE4 ADD ESP, -14
00405CE7 MOV DWORD PTR SS:[ESP], EDX
00405CEA MOV ESI, EAX
00405CEC MOV EBP, 1
00405CF1 XOR EDI, EDI
00405CF3 MOV DWORD PTR SS:[ESP+8], 0
00405CFB MOV DWORD PTR SS:[ESP+C], 0
00405D03 TEST ESI, ESI
00405D05 JNZ SHORT ZXGraph.00405D12
00405D07 MOV EAX, DWORD PTR SS:[ESP]
00405D0A MOV DWORD PTR DS:[EAX], EBP
00405D0C JMP ZXGraph.00405EFF
00405D11 INC EBP
00405D12 CMP BYTE PTR DS:[ESI+EBP-1], 20************取出第一位:2(32)与20比较
00405D17 ^ JE SHORT ZXGraph.00405D11*****************相等就跳!
00405D19 MOV BYTE PTR SS:[ESP+10], 0
00405D1E MOV AL, BYTE PTR DS:[ESI+EBP-1]*************2的ASCII码值32入AL
00405D22 CMP AL, 2D**********************************与2D比较
00405D24 JNZ SHORT ZXGraph.00405D2E******************不相等就跳走
00405D26 MOV BYTE PTR SS:[ESP+10], 1
00405D2B INC EBP
00405D2C JMP SHORT ZXGraph.00405D33
00405D2E CMP AL, 2B**********************************跳到这里,与2B比较
00405D30 JNZ SHORT ZXGraph.00405D33******************不相等就跳走
00405D32 INC EBP
00405D33 MOV BL, 1***********************************跳到这里,赋BL的值为1
00405D35 CMP BYTE PTR DS:[ESI+EBP-1], 24*************再与24比较
00405D3A JE SHORT ZXGraph.00405D64******************相等就跳
00405D3C MOV AL, BYTE PTR DS:[ESI+EBP-1]*************32送入AL
00405D40 CALL ZXGraph.00402B30
00405D45 CMP AL, 58**********************************32与58比较
00405D47 JE SHORT ZXGraph.00405D64******************相等就跳
00405D49 CMP BYTE PTR DS:[ESI+EBP-1], 30*************与30比较
00405D4E JNZ ZXGraph.00405E2E************************不相等就跳
00405D54 MOV AL, BYTE PTR DS:[ESI+EBP]
00405D57 CALL ZXGraph.00402B30
**************省略一部分代码!***************************************************************************
00405E1C ADC EDX, 0
00405E1F NEG EDX
00405E21 MOV DWORD PTR SS:[ESP+8], EAX
00405E25 MOV DWORD PTR SS:[ESP+C], EDX
00405E29 JMP ZXGraph.00405EE5
00405E2E MOV AL, BYTE PTR DS:[ESI+EBP-1]********跳到这里,32送AL
00405E32 MOV EDX, EAX***************************EAX的值:B0EF32入EDX
00405E34 ADD DL, 0D0****************************DL=DL+D0=02
00405E37 SUB DL, 0A*****************************DL=DL-A=F8
00405E3A JNB SHORT ZXGraph.00405E9E*************不低于转移
00405E3C MOV EDI, EAX***************************EAX的值:B0EF32入EDI
00405E3E AND EDI, 0FF***************************与OFF=32
00405E44 SUB EDI, 30****************************减去30=2
00405E47 CMP DWORD PTR SS:[ESP+C], 0
00405E4C JNZ SHORT ZXGraph.00405E57
00405E4E CMP DWORD PTR SS:[ESP+8], 0
00405E53 JB SHORT ZXGraph.00405E9E
00405E55 JMP SHORT ZXGraph.00405E59
00405E57 JL SHORT ZXGraph.00405E9E
00405E59 CMP DWORD PTR SS:[ESP+C], 0CCCCCCC
00405E61 JNZ SHORT ZXGraph.00405E6F
00405E63 CMP DWORD PTR SS:[ESP+8], CCCCCCCC
00405E6B JBE SHORT ZXGraph.00405E71
00405E6D JMP SHORT ZXGraph.00405E9E
00405E6F JG SHORT ZXGraph.00405E9E
00405E71 PUSH 0
00405E73 PUSH 0A
00405E75 MOV EAX, DWORD PTR SS:[ESP+10]
00405E79 MOV EDX, DWORD PTR SS:[ESP+14]
00405E7D CALL ZXGraph.00405C40****************算法CALL(2),按F7跟进!
====================================================================================
算法CALL(2)的代码:
00405C40 PUSH EDX
00405C41 PUSH EAX
00405C42 MOV EAX, DWORD PTR SS:[ESP+10]
00405C46 MUL DWORD PTR SS:[ESP]
00405C49 MOV ECX, EAX
00405C4B MOV EAX, DWORD PTR SS:[ESP+4]
00405C4F MUL DWORD PTR SS:[ESP+C]
00405C53 ADD ECX, EAX
00405C55 MOV EAX, DWORD PTR SS:[ESP]*********[ESP]的初始值为0 ,第二次就把第一次的结果保存在这里计算!
00405C58 MUL DWORD PTR SS:[ESP+C]************0*常数A=0
00405C5C ADD EDX, ECX
00405C5E POP ECX
00405C5F POP ECX
00405C60 RETN 8
********这个CALL结束,注意算法CALL(3)调用同一子程序,只是在[ESP]处存放的是常数:867D
=======================================================================================
00405E82 PUSH EDX
00405E83 PUSH EAX
00405E84 MOV EAX, EDI***************2移入EAX
00405E86 CDQ****************************EDX清0
00405E87 ADD EAX, DWORD PTR SS:[ESP]**EAX+0=2
00405E8A ADC EDX, DWORD PTR SS:[ESP+4]**
00405E8E ADD ESP, 8
00405E91 MOV DWORD PTR SS:[ESP+8], EAX
00405E95 MOV DWORD PTR SS:[ESP+C], EDX
00405E99 INC EBP
00405E9A XOR EBX, EBX
00405E9C ^ JMP SHORT ZXGraph.00405E2E**********跳回循环!这个循环是对上面的机器码进行处理,
****处理过程是这样,取每一位的ASCII码值,减去30,乘以A,然后再累加,如第一位2,32-30=2,0*A=0,0+2=2
****第二位0,30-30=0,2*A=14.14+0=14,第三位是8,38-30=8,14*A=C8,C8+8=D0,最后结果是:1FE052
00405E9E CMP BYTE PTR SS:[ESP+10], 0
00405EA3 JE SHORT ZXGraph.00405EBC
00405EA5 MOV EAX, DWORD PTR SS:[ESP+8] ; ZXGraph.00490BF7
下面的代码省略!
3、算法小结
输入用户名和单位,然后根据用户名和单位产生机器码!再根据机器码计算出注册码。计算方法如下:
第一步对机器码变形,把机器码中间的“-”去掉,连接起来这,组成12位的一组数值,然后再加上第一位机器码,
变成13位的一组数值,再依次从第一位取起,每次取4位,共取三组。
第二步对取出的三组数值处理,第一次取第一组的1、3两位,第二次取第二组的1、3两位,第三次取第三组的1、
3两位,第四次取第一组的第二位,组成一组7位数字的数值。
第三步对取出的7位数值处理,每次取1位计算,设计算的结果为X,第一次X的值为0,取数值的ASCII码值,这个值
减去30,其实就是加上数值本身,再加上X*A,设数值为N,刚X1=0*A+N1,X2=X1*A+N2,以下类推;计算完的结果为X7,
X7*867D+3,转化成十进制值,注册码要12位,这个转化的数值是11位,不足就用0补充第一位。
第四步取注册码,依次取,每次取4位,共取三组,中间加“-”就是15位的注册码。
4、举例说明:
用户名:yzez,用户单位:[DFCG][BCG][FCG],生成的机器码是:2088-7970-8446.
第一步变形,去掉"-"变成:208879708446,再加上第一个机器码:2208879708446,分三次取,每次取4位,取三组,
第一组取出前4位是:2208,第二组接着取4位是:8797,第三组再接着取4位是:0844;
第二步再取7位数值:取第一组的1、3两位是:2、0;取第二组的1、3两位是:8、9;取第三组的1、3两位是:0、4
取第一组的第2位是:2;组成7位的数值是:2089042。
第三步计算,取第一位:2,则0*A+2=2,取第二位:0,则2*A+0=14------最后的结果是:33008*A+2=1FE052
1FE052*867D+3=10BEFB740D,转化成十进制值是:71923627021,在最前面加上0组成12位的数值是:071923627021
第四步取码:0719-2362-7021,这就是我们要找的注册码!