• 标 题:网络电视大师 V4.0.0 Build 2003.9.25注册算法简析
  • 作 者:txm123
  • 时 间: 2003年9月26日 04:34
  • 链 接:http://bbs.pediy.com

网络电视大师V4.0.0 Build 2003.9.25注册算法简析

    软件简介:这是一个在网络上看电视的软件。
    破解作者:
             yzez[DFCG]
    破解工具:
             w32dasm、ODBG109B
    破解目的:
             初学破解,只为交流技术,请不要依据本文章写注册机,还是多多保护一下本就艰难的国产软件吧!
    破解过程:
1、软件注册失败,会有提示信息,用w32dasm反汇编找到关键断点,用ODBG109B载入程序,按F9出现注册信息框后,
输入注册信息,用户名:YZEZ,试验码:1234567890098765432112,点确定,程序被断下来,看下面:

00485958   .  PUSH    EBP
00485959   .  8BEC          MOV     EBPESP
0048595B   .  B9 05000000   MOV     ECX, 5
00485960   >  6A 00         PUSH    0
00485962   .  6A 00         PUSH    0
00485964   .  49            DEC     ECX
00485965   .^ 75 F9         JNZ     SHORT main.00485960
00485967   .  53            PUSH    EBX
00485968   .  8BD8          MOV     EBXEAX
0048596A   .  33D2          XOR     EDXEDX
0048596C   .  55            PUSH    EBP
0048596D   .  68 145B4800   PUSH    main.00485B14
00485972   .  64:FF32       PUSH    DWORD PTR FS:[EDX]
00485975   .  64:8922       MOV     DWORD PTR FS:[EDX], ESP
00485978   .  84C0          TEST    ALAL
0048597A   .  0F84 5F010000 JE      main.00485ADF
00485980   .  8D45 F4       LEA     EAXDWORD PTR SS:[EBP-C]
00485983   .  CALL    main.00404308***************我们在此CALL设断!输入注册信息后往下走! 
00485988   .  LEA     EDXDWORD PTR SS:[EBP-1C]
0048598B   .  MOV     EAXDWORD PTR DS:[EBX+2FC]
00485991   .  CALL    main.0043F94C
00485996   .  MOV     EAXDWORD PTR SS:[EBP-1C]***把机器码:6875849699120117131144移入EAX中
00485999   .  LEA     EDXDWORD PTR SS:[EBP-18]
0048599C   .  CALL    main.00485878****************算法CALL,按F7跟进!代码附后!
004859A1   .  MOV     EAXDWORD PTR SS:[EBP-18]***转换后的机器码:9:8=?:>BDC:B??>KDEBIKJ入EAX
004859A4   .  PUSH    EAX
004859A5   .  LEA     EDXDWORD PTR SS:[EBP-20]
004859A8   .  MOV     EAXDWORD PTR DS:[EBX+2F4]
004859AE   .  CALL    main.0043F94C
004859B3   .  MOV     EDXDWORD PTR SS:[EBP-20]***用户名:YZEZ移入EDX
004859B6   .  LEA     EAXDWORD PTR SS:[EBP-4]
004859B9   .  POP     ECX                              
004859BA   .  CALL    main.0040460C
004859BF   .  LEA     EDXDWORD PTR SS:[EBP-24]
004859C2   .  MOV     EAXDWORD PTR DS:[EBX+2F4]
004859C8   .  CALL    main.0043F94C
004859CD   .  MOV     EDXDWORD PTR SS:[EBP-24]       
004859D0   .  MOV     EAXDWORD PTR DS:[EBX+318]
004859D6   .  CALL    main.0043F97C*****************此CALL把用户名和变换后的机器码串起来就是这种
*****************************************************形式:YZEZ9:8=?:>BDC:B??>KDEBIKJ
004859DB   .  MOV     EAXDWORD PTR DS:[EBX+31C]
004859E1   .  MOV     EDXDWORD PTR SS:[EBP-4]
004859E4   .  CALL    main.0043F97C
004859E9   .  CMP     DWORD PTR SS:[EBP-4], 0
004859ED   .  JE      main.00485ADF
004859F3   .  LEA     EDXDWORD PTR SS:[EBP-8]
004859F6   .  MOV     EAXDWORD PTR DS:[EBX+304]
004859FC   .  CALL    main.0043F94C
00485A01   .  LEA     EDXDWORD PTR SS:[EBP-C]
00485A04   .  MOV     EAXDWORD PTR SS:[EBP-4]
00485A07   .  CALL    main.00485878******************第二次计算,调用上面的同一个子程序,代码也是
*************一样,这次是对变形机器码+用户名进行计算,即:YZEZ9:8=?:>BDC:B??>KDEBIKJ,计算也是一样!
00485A0C   .  MOV     EDXDWORD PTR SS:[EBP-8]        
00485A0F   .  MOV     EAXDWORD PTR SS:[EBP-C]        
00485A12   .  CALL    main.004085C0******************在此CALL把计算后的值与输入的试验码相比较
00485A17   .  TEST    EAXEAX***********************如果比较都符合,则EAX的值为0,否则不为0
00485A19   .  JE      SHORT main.00485A44************不为0,就不跳,不跳就往下!为0则跳走!
00485A1B   .  MOV     EAX, main.00485B28
00485A20   .  CALL    main.004392AC******************不跳,在这里就失败了,交钱吧!
00485A25   .  MOV     EAXDWORD PTR DS:[EBX+2F4]
00485A2B   .  XOR     EDXEDX
00485A2D   .  CALL    main.0043F97C
00485A32   .  MOV     EAXDWORD PTR DS:[EBX+304]
00485A38   .  XOR     EDXEDX
00485A3A   .  CALL    main.0043F97C
00485A3F   .  JMP     main.00485ADF
00485A44   >  XOR     EAXEAX***********************相等就跳到这里!下面就写入注册信息!
00485A46   .  PUSH    EBP
00485A47   .  PUSH    main.00485AD8
00485A4C   .  PUSH    DWORD PTR FS:[EAX]
00485A4F   .  MOV     DWORD PTR FS:[EAX], ESP
00485A52   .  MOV     DL, 1
00485A54   .  MOV     EAXDWORD PTR DS:[469F4C]
00485A59   .  CALL    main.0046A04C
00485A5E   .  MOV     DWORD PTR SS:[EBP-10], EAX
00485A61   .  MOV     EDX, 80000002
00485A66   .  MOV     EAXDWORD PTR SS:[EBP-10]
00485A69   .  CALL    main.0046A0EC
00485A6E   .  LEA     EAXDWORD PTR SS:[EBP-14]
00485A71   .  MOV     EDX, main.00485B68               
00485A76   .  CALL    main.004043A0
00485A7B   .  MOV     CL, 1
00485A7D   .  MOV     EDXDWORD PTR SS:[EBP-14]
00485A80   .  MOV     EAXDWORD PTR SS:[EBP-10]
00485A83   .  CALL    main.0046A150
00485A88   .  TEST    ALAL
00485A8A   .  JE      SHORT main.00485ABA
00485A8C   .  MOV     ECXDWORD PTR SS:[EBP-8]        
00485A8F   .  MOV     EDX, main.00485B88********************ASCII "Passwd"这里写入注册码!
00485A94   .  MOV     EAXDWORD PTR SS:[EBP-10]
00485A97   .  CALL    main.0046A2EC
00485A9C   .  LEA     EDXDWORD PTR SS:[EBP-28]
00485A9F   .  MOV     EAXDWORD PTR DS:[EBX+318]
00485AA5   .  CALL    main.0043F94C
00485AAA   .  MOV     ECXDWORD PTR SS:[EBP-28]       
00485AAD   .  MOV     EDX, main.00485B98********************"UsrName"这里写入用户名!已经成功了!
00485AB2   .  MOV     EAXDWORD PTR SS:[EBP-10]
00485AB5   .  CALL    main.0046A2EC
00485ABA   >  MOV     EAXDWORD PTR SS:[EBP-10]
00485ABD   .  CALL    main.0046A0BC
00485AC2   .  XOR     EAXEAX
00485AC4   .  POP     EDX                              
00485AC5   .  POP     ECX                              
00485AC6   .  POP     ECX                              
00485AC7   .  MOV     DWORD PTR FS:[EAX], EDX
00485ACA   .  PUSH    main.00485ADF
00485ACF   >  MOV     EAXDWORD PTR SS:[EBP-10]
00485AD2   .  CALL    main.0040359C
00485AD7   .  RETN
=======================================================================================================================
***********************************算法CALL的代码!省略部分代码**********************************************************
00485878  /$  PUSH    EBP*********************************追进算法CALL后,我们停在这里!
***********************************省略部分代码!
004858A8  |.  CALL    main.00404308
004858AD  |.  MOV     EAX, [LOCAL.1]**************把机器码移入EAX中
004858B0  |.  CALL    main.004045C0
004858B5  |.  MOV     ESIEAX********************机器码的位数移入ESI,机器码是22(十六进制值是16),ESI=16
004858B7  |.  TEST    ESIESI********************测试位数!                        
004858B9  |.  JLE     SHORT main.0048590D*********小于就跳走!这里不会跳!直接往下!
004858BB  |.  MOV     EBX, 1**********************把1放进EBX
004858C0  |>  LEA     EAXDWORD PTR DS:[EBX+1E]**把值:EBX+1E=1+1E=1F入EAX这是第一次,第二次是2+1E=20,以后类
**************推,直至取完22位机器码!
004858C3  |.  PUSH    EAX*************************EAX入栈!1F入栈
004858C4  |.  MOV     EAXEBX********************EBX的值入EAX,即EAX的值变成1
004858C6  |.  POP     EDX                             
004858C7  |.  MOV     ECXEDX********************EDX的值1F移入ECX中
004858C9  |.  CDQ*********************************EDX清0
004858CA  |.  IDIV    ECX*************************EAX=EAX/ECX=1/1F=0,余数1放在EDX中
004858CC  |.  MOV     EDIEDX********************EDX入EDI,1入EDI
004858CE  |.  MOV     EAXEBX********************1入EAX
004858D0  |.  XOR     EAXEBX********************EAX清0
004858D2  |.  XOR     EAXEBX********************EAX的值为1
004858D4  |.  XOR     EDIEAX********************EDI清0
004858D6  |.  LEA     EAXDWORD PTR DS:[EBX+14]**EBX+14=1+14=15入EAX,同上,第二次是2+14=16
004858D9  |.  PUSH    EAX
004858DA  |.  MOV     EAXEBX********************EAX的值为1
004858DC  |.  POP     EDX                           
004858DD  |.  MOV     ECXEDX********************15入ECX
004858DF  |.  CDQ*********************************EDX清0
004858E0  |.  IDIV    ECX*************************EAX=EAX/ECX=1/15=0,余数1放在EDX中
004858E2  |.  XOR     EDXEBX********************EDX清0
004858E4  |.  ADD     EDIEDX********************EDI=EDI+EDX=0+0=0
004858E6  |.  ADD     EDIEBX********************EDI=EDI+EBX=0+1=1
004858E8  |.  XOR     EDI, 3**********************1与常数3相异或,值为2
004858EB  |.  INC     EDI*************************EDI的值再加1,为3
004858EC  |.  LEA     EAX, [LOCAL.4]
004858EF  |.  MOV     EDX, [LOCAL.1]**************机器码入EDX
004858F2  |.  MOVZX   EDXBYTE PTR DS:[EDX+EBX-1]***取机器码的第一位:6(ASCII码值为36)
004858F7  |.  ADD     EDXEDI********************EDX=EDX+EDI=3+36=39(十进制值为9)
004858F9  |.  CALL    main.004044E8
004858FE  |.  MOV     EDX, [LOCAL.4]
00485901  |.  LEA     EAX, [LOCAL.3]
00485904  |.  CALL    main.004045C8
00485909  |.  INC     EBX*************************EBX+1=2
0048590A  |.  DEC     ESI*************************ESI-1=16-1=15                             
0048590B  |.^ JNZ     SHORT main.004858C0*********机器码取完了吗?没取完继续循环,这一个循环是处理机器
********码,把机器码进行转换!转换是这样:每次取出一位机器码设为M,其对应的在机器码中所处的位数设为X,
********X XOR 3=Y,设转换后的值为N,N=Y+M(加的值是其ASCII码值),得到结果N取对应的字符串,就是转换后的值
********如取第一位:6,6对应的位数是:1,所以1^3=2,2+1=3,3+36=39,转换后的第一位值就是:9;第二位:8,就
********是:2^3=1,1+1=2,2+38=3A,3A对应的字符串是:“:”这就是转换后的第二位值,以下类推。我的机器码:
********6875849699120117131144转换后的值是:9:8=?:>BDC:B??>KDEBIKJ
0048590D  |>  MOV     EAX, [LOCAL.2]
00485910  |.  MOV     EDX, [LOCAL.3]
00485913  |.  CALL    main.0040435C
00485918  |.  XOR     EAXEAX
0048591A  |.  POP     EDX                              
0048591B  |.  POP     ECX                              
0048591C  |.  POP     ECX                              
0048591D  |.  MOV     DWORD PTR FS:[EAX], EDX
00485920  |.  PUSH    main.00485942
00485925  |>  LEA     EAX, [LOCAL.4]
00485928  |.  MOV     EDX, 2
0048592D  |.  CALL    main.0040432C
00485932  |.  LEA     EAX, [LOCAL.1]
00485935  |.  CALL    main.00404308
0048593A  .  RETN
2、算法小结:
   计算注册码用到机器码和你输入的用户名,要经过两次计算,第一次计算把机器码进行转换,转换是这样:每次取
出一位机器码设为M,其对应的在机器码中所处的位数设为X,X XOR 3=Y,设转换后的值为N,N=Y+M(加的值是其ASCII
码值),得到结果N取对应的字符串,就是转换后的值如取第一位:6,6对应的位数是:1,所以1^3=2,2+1=3,3+36=39,
转换后的第一位值就是:9;第二位:8,是:2^3=1,1+1=2,2+38=3A,3A对应的字符串是:“:”这就是转换后的第二
位值,以下类推。我的机器码:6875849699120117131144转换后的值是:9:8=?:>BDC:B??>KDEBIKJ
   第二次计算把用户名和变形后的机器码连接起来,组成一个新的值,再把这个值按上述公式计算出你的注册码,计算
一样,不再多说明。
   一个成功的注册码:
  用户名:YZEZ
  机器码:6875849699120117131144
  注册码:\Fb@@=IJDGRSQGVRQOc[[Wefd
  计算注册码的公式简述如下:
  设一位注册码为M,其对应在码中的位数为X,计算的中间值为Y,计算后的注册码对应的ASCII码值为N
  公式如下:X^3=Y,N=Y+M(取对应的字符串)