• 标 题:Graph ZX V1.2
  • 作 者:txm123
  • 时 间:2003年11月03日 12:30
  • 链 接:http://bbs.pediy.com

不脱壳破解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     EAXDWORD PTR SS:[EBP-10]
00490A10    CALL    ZXGraph.00404DC4
00490A15    LEA     EDXDWORD PTR SS:[EBP-1FC]
00490A1B    MOV     EAXDWORD PTR DS:[EDI+308]
00490A21    CALL    ZXGraph.0044BA50
00490A26    MOV     EAXDWORD PTR SS:[EBP-1FC]****机器码移入EAX,我的机器码是2088-7970-8446
00490A2C    LEA     EDXDWORD 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     EAXDWORD 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     EAXDWORD PTR SS:[EBP-4]*****赋EAX地址值!
00490AD2    PUSH    EAX
00490AD3    MOV     ECX, 4************************常数4送ECX
00490AD8    MOV     EDX, 1************************赋EDX的初始值为1,即把第一位机器码加进去!
00490ADD    MOV     EAXDWORD PTR SS:[EBP-10]****变换后的机器码入EAX
00490AE0    CALL    ZXGraph.004052E4**************再次变形机器码加上第一位机器码,变成2208879708446
**************************************************然后取前4位:2208
00490AE5    LEA     EAXDWORD PTR SS:[EBP-8]*****赋EAX地址值
00490AE8    PUSH    EAX
00490AE9    MOV     ECX, 4************************常数4送ECX
00490AEE    MOV     EDX, 5************************把常数5赋EDX
00490AF3    MOV     EAXDWORD PTR SS:[EBP-10]****变换后的机器码入EAX
00490AF6    CALL    ZXGraph.004052E4**************从第5位开始取机器码的中间四位:8797
00490AFB    LEA     EAXDWORD PTR SS:[EBP-C]
00490AFE    PUSH    EAX
00490AFF    MOV     ECX, 4************************常数4送ECX
00490B04    MOV     EDX, 9************************把常数9赋EDX
00490B09    MOV     EAXDWORD PTR SS:[EBP-10]
00490B0C    CALL    ZXGraph.004052E4**************从第9位取四位:0844
00490B11    LEA     EAXDWORD PTR SS:[EBP-20C]
00490B17    PUSH    EAX
00490B18    MOV     ECX, 1************************常数1送ECX
00490B1D    MOV     EDX, 1************************把常数1赋EDX
00490B22    MOV     EAXDWORD PTR SS:[EBP-4]*****取出的第一组的变形机器码:2208入EAX
00490B25    CALL    ZXGraph.004052E4**************取第一位2保存到内存地址:00B00C78处
00490B2A    PUSH    DWORD PTR SS:[EBP-20C]
00490B30    LEA     EAXDWORD PTR SS:[EBP-210]
00490B36    PUSH    EAX
00490B37    MOV     ECX, 1************************赋ECX的值1
00490B3C    MOV     EDX, 3************************赋EDX的值3
00490B41    MOV     EAXDWORD PTR SS:[EBP-4]*****2208入EAX
00490B44    CALL    ZXGraph.004052E4**************取第三位0
00490B49    PUSH    DWORD PTR SS:[EBP-210]
00490B4F    LEA     EAXDWORD PTR SS:[EBP-214]
00490B55    PUSH    EAX
00490B56    MOV     ECX, 1
00490B5B    MOV     EDX, 1
00490B60    MOV     EAXDWORD PTR SS:[EBP-8]
00490B63    CALL    ZXGraph.004052E4*************取第二组:8797的第一位:8
00490B68    PUSH    DWORD PTR SS:[EBP-214]
00490B6E    LEA     EAXDWORD PTR SS:[EBP-218]
00490B74    PUSH    EAX
00490B75    MOV     ECX, 1
00490B7A    MOV     EDX, 3
00490B7F    MOV     EAXDWORD PTR SS:[EBP-8]
00490B82    CALL    ZXGraph.004052E4*************取第二组:8797的第三位:9
00490B87    PUSH    DWORD PTR SS:[EBP-218]
00490B8D    LEA     EAXDWORD PTR SS:[EBP-21C]
00490B93    PUSH    EAX
00490B94    MOV     ECX, 1
00490B99    MOV     EDX, 1
00490B9E    MOV     EAXDWORD PTR SS:[EBP-C]
00490BA1    CALL    ZXGraph.004052E4*************取第三组:0844的第一位:0
00490BA6    PUSH    DWORD PTR SS:[EBP-21C]
00490BAC    LEA     EAXDWORD PTR SS:[EBP-220]
00490BB2    PUSH    EAX
00490BB3    MOV     ECX, 1
00490BB8    MOV     EDX, 3
00490BBD    MOV     EAXDWORD PTR SS:[EBP-C]
00490BC0    CALL    ZXGraph.004052E4*************取第三组:0844的第三位:4
00490BC5    PUSH    DWORD PTR SS:[EBP-220]
00490BCB    LEA     EAXDWORD PTR SS:[EBP-224]
00490BD1    PUSH    EAX
00490BD2    MOV     ECX, 1
00490BD7    MOV     EDX, 2
00490BDC    MOV     EAXDWORD PTR SS:[EBP-4]
00490BDF    CALL    ZXGraph.004052E4*************取第一组:2208的第二位:2
00490BE4    PUSH    DWORD PTR SS:[EBP-224]
00490BEA    LEA     EAXDWORD PTR SS:[EBP-18]
00490BED    MOV     EDX, 7**********************取完了7位吗?
00490BF2    CALL    ZXGraph.00405144************这个CALL把取出的7位连接起来,就是:2089042
00490BF7    PUSH    0
00490BF9    PUSH    867D
00490BFE    MOV     EAXDWORD 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     EAXDWORD PTR SS:[EBP-14]
00490C20    CALL    ZXGraph.004093E4***********把10BEFB740D转化成十进制值就是:71923627021
00490C25    MOV     EAXDWORD PTR SS:[EBP-14]
00490C28    CALL    ZXGraph.00405084
00490C2D    CMP     EAX, 0C*******************比较得到的结果是:C位吗?上面的结果是:11位(0B位)
00490C30    JGE     SHORT ZXGraph.00490C42****大于就跳
00490C32    LEA     EAXDWORD PTR SS:[EBP-14]
00490C35    MOV     ECXDWORD PTR SS:[EBP-14]********把上述结果71923627021移入ECX
00490C38    MOV     EDX, ZXGraph.00490E54
00490C3D    CALL    ZXGraph.004050D0*******************此CALL补足注册码12位,补的过程是这样,第一位用0补足
00490C42    LEA     EAXDWORD PTR SS:[EBP-228]
00490C48    PUSH    EAX
00490C49    MOV     ECX, 4******************************这里是把注册码组起来,每次取四位,后面省略了!
00490C4E    MOV     EDX, 1******************************取第一组注册码!从第一位取起
00490C53    MOV     EAXDWORD PTR SS:[EBP-14]**********把处理过的注册码071923627021移入EAX
00490C56    CALL    ZXGraph.004052E4********************取出第一组注册码,取前四位,即:0719
00490C5B    PUSH    DWORD PTR SS:[EBP-228]
00490C61    PUSH    ZXGraph.00490E3C
00490C66    LEA     EAXDWORD PTR SS:[EBP-22C]
00490C6C    PUSH    EAX
00490C6D    MOV     ECX, 4******************************再取四位注册码,组成第二组
00490C72    MOV     EDX, 5******************************赋EDX的值为5,即从第五位取起
00490C77    MOV     EAXDWORD 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     EAXDWORD PTR SS:[EBP-230]
00490C90    PUSH    EAX
00490C91    MOV     ECX, 4*****************************赋ECX的值4,再取四位组成第三组注册码
00490C96    MOV     EDX, 9*****************************赋EDX的值9,即从第9位取起
00490C9B    MOV     EAXDWORD PTR SS:[EBP-14]**********把处理过的注册码071923627021移入EAX
00490C9E    CALL    ZXGraph.004052E4********************从第9位取,取第三组注册码:7021
00490CA3    PUSH    DWORD PTR SS:[EBP-230]
00490CA9    LEA     EAXDWORD PTR SS:[EBP-14]
00490CAC    MOV     EDX, 5
00490CB1    CALL    ZXGraph.00405144
00490CB6    LEA     EDXDWORD PTR SS:[EBP-234]
00490CBC    MOV     EAXDWORD PTR DS:[EDI+304]
00490CC2    CALL    ZXGraph.0044BA50
00490CC7    MOV     EDXDWORD PTR SS:[EBP-234]**试验码1234-5678-9009入EDX
00490CCD    MOV     EAXDWORD PTR SS:[EBP-14]***真码0719-2362-7021入EAX
00490CD0    CALL    ZXGraph.004051D0*************关键比较
00490CD5    JNZ     SHORT ZXGraph.00490D03*******不相等就跳!
00490CD7    LEA     EAXDWORD 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     EBXEAX
004094DE    LEA     EDXDWORD PTR SS:[ESP+8]
004094E2    MOV     EAXEBX
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     EDXDWORD PTR SS:[ESP+C]
00409504    MOV     EAXDWORD PTR DS:[4A7454]
00409509    XOR     ECXECX
0040950B    CALL    ZXGraph.00408D4C
00409510    MOV     EAXDWORD PTR SS:[ESP]         
00409513    MOV     EDXDWORD 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     ESIEAX
00405CEC    MOV     EBP, 1
00405CF1    XOR     EDIEDI
00405CF3    MOV     DWORD PTR SS:[ESP+8], 0
00405CFB    MOV     DWORD PTR SS:[ESP+C], 0
00405D03    TEST    ESIESI
00405D05    JNZ     SHORT ZXGraph.00405D12
00405D07    MOV     EAXDWORD 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     ALBYTE 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     ALBYTE 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     ALBYTE 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     ALBYTE PTR DS:[ESI+EBP-1]********跳到这里,32送AL
00405E32    MOV     EDXEAX***************************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     EDIEAX***************************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     EAXDWORD PTR SS:[ESP+10]
00405E79    MOV     EDXDWORD PTR SS:[ESP+14]
00405E7D    CALL    ZXGraph.00405C40****************算法CALL(2),按F7跟进!
====================================================================================
算法CALL(2)的代码:
00405C40    PUSH    EDX
00405C41    PUSH    EAX
00405C42    MOV     EAXDWORD PTR SS:[ESP+10]
00405C46    MUL     DWORD PTR SS:[ESP]              
00405C49    MOV     ECXEAX
00405C4B    MOV     EAXDWORD PTR SS:[ESP+4]
00405C4F    MUL     DWORD PTR SS:[ESP+C]
00405C53    ADD     ECXEAX
00405C55    MOV     EAXDWORD PTR SS:[ESP]*********[ESP]的初始值为0 ,第二次就把第一次的结果保存在这里计算!        
00405C58    MUL     DWORD PTR SS:[ESP+C]************0*常数A=0
00405C5C    ADD     EDXECX
00405C5E    POP     ECX                             
00405C5F    POP     ECX                             
00405C60    RETN    8
********这个CALL结束,注意算法CALL(3)调用同一子程序,只是在[ESP]处存放的是常数:867D
=======================================================================================

00405E82    PUSH    EDX
00405E83    PUSH    EAX
00405E84    MOV     EAXEDI***************2移入EAX
00405E86    CDQ****************************EDX清0
00405E87    ADD     EAXDWORD PTR SS:[ESP]**EAX+0=2         
00405E8A    ADC     EDXDWORD 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     EBXEBX
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     EAXDWORD 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,这就是我们要找的注册码!