ChinaZip v2.0的註冊碼演算法(初學者)

看雪資料發表於2000-11-30

ChinaZip v2.0的註冊碼演算法(初學者)
很少寫破解心得,不足之處請指正。
為什麼要選擇ChinaZip呢?因為ChinaZip的演算法比較簡單,非常適合初學者。
能讓每一個初學者都能學會如何分析註冊碼的演算法,寫出序號產生器。(是誰在笑我...)^o^
由於本文是針對初學者,所以下面的破解過程我儘量寫的詳細一些。

軟體介紹:
中華壓縮(ChinaZip) V2.0
中華壓縮是一個國產的壓縮、解壓縮軟體,暫時只支援 zip 壓縮格式,
正式版本將逐步支援RAR,ARJ,CAB 等更多的壓縮格式。軟體的介面、操作習慣、
程式快捷鍵將完全相容 WinZip。

下載地:
http://www.soft999.com/download2/ChinaZip.exe

軟體保護:
1.Aspack1.07b
2.註冊碼保護
-----------------

使用工具:
1.UnAspack v1.0.9.1
2.Trw2000 v1.22
3.W32dsm v8.9黃金版
4.Crackcode2000
5.VB 5.0
-------------------------
現在開始破解嘍!...............

1.首先執行ChinaZip.exe
2.在幫助選單下找到註冊部分

3.使用者名稱:dyiyd(你可輸入你的名字)
  註冊碼:98989898

4.按確定後出現“您的註冊碼不正確!” (這可是破解的線索哦!)
5.將ChinaZip.exe用UnAspack v1.0.9.1脫殼(有興趣的朋友可手動脫殼。我比較懶....^o^)
6.w32dsm v8.9黃金版載入已脫殼的ChinaZip.exe
7.搜尋“您的註冊碼不正確”字串。很快便找到了....
8.下面開始靜態分析...從“您的註冊碼不正確!”向上看
---------------------------------------

* Possible StringData Ref from Code Obj ->"?]"
                                  |
:004D1DD3 68D51E4D00              push 004D1ED5
:004D1DD8 64FF30                  push dword ptr fs:[eax]
:004D1DDB 648920                  mov dword ptr fs:[eax], esp
:004D1DDE A1CC6D4E00              mov eax, dword ptr [004E6DCC]
:004D1DE3 8B00                    mov eax, dword ptr [eax]
:004D1DE5 8B10                    mov edx, dword ptr [eax]
:004D1DE7 FF92D8000000            call dword ptr [edx+000000D8]
:004D1DED 48                      dec eax
:004D1DEE 0F85B6000000            jne 004D1EAA
:004D1DF4 8D55FC                  lea edx, dword ptr [ebp-04]
:004D1DF7 A1CC6D4E00              mov eax, dword ptr [004E6DCC]
:004D1DFC 8B00                    mov eax, dword ptr [eax]
:004D1DFE 8B80E0020000            mov eax, dword ptr [eax+000002E0]
:004D1E04 E87F10F6FF              call 00432E88----------------------------/*取出你輸入的使用者名稱*/
:004D1E09 8D4DF8                  lea ecx, dword ptr [ebp-08]
:004D1E0C 8B55FC                  mov edx, dword ptr [ebp-04]--------------/*[ebp-04]存放是你的使用者名稱*/
:004D1E0F 8BC3                    mov eax, ebx
:004D1E11 E8D6FDFFFF              call 004D1BEC----------------------------/*註冊碼計算部分*/
:004D1E16 8D55F4                  lea edx, dword ptr [ebp-0C]
:004D1E19 A1CC6D4E00              mov eax, dword ptr [004E6DCC]
:004D1E1E 8B00                    mov eax, dword ptr [eax]
:004D1E20 8B80E4020000            mov eax, dword ptr [eax+000002E4]
:004D1E26 E85D10F6FF              call 00432E88----------------------------/*取出你輸入的註冊碼*/
:004D1E2B 8B45F4                  mov eax, dword ptr [ebp-0C]--------------/*[ebp-0C]存放你輸入的註冊碼*/
:004D1E2E 8B55F8                  mov edx, dword ptr [ebp-08]--------------/*[ebp-08]存放真正的註冊碼*/
:004D1E31 E89A22F3FF              call 004040D0----------------------------/*這個Call一定是註冊碼比較處*/
:004D1E36 7568                    jne 004D1EA0-----------------------------/*我們來到這裡。哈哈!有點兒意思了吧?*/
                                      /*這裡要跳就跳過了所有註冊成功的資訊*/
:004D1E38 A1306F4E00              mov eax, dword ptr [004E6F30]
:004D1E3D 8B00                    mov eax, dword ptr [eax]
:004D1E3F 8B8008040000            mov eax, dword ptr [eax+00000408]
:004D1E45 B201                    mov dl, 01
:004D1E47 E89CB3FDFF              call 004AD1E8
:004D1E4C 8D55F0                  lea edx, dword ptr [ebp-10]
:004D1E4F A120704E00              mov eax, dword ptr [004E7020]
:004D1E54 8B00                    mov eax, dword ptr [eax]
:004D1E56 E8E1EEF7FF              call 00450D3C
:004D1E5B 8D45F0                  lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Code Obj ->" - 註冊使用者!"
                                  |
:004D1E5E BAEC1E4D00              mov edx, 004D1EEC
:004D1E63 E86021F3FF              call 00403FC8
:004D1E68 8B55F0                  mov edx, dword ptr [ebp-10]
:004D1E6B A1306F4E00              mov eax, dword ptr [004E6F30]
:004D1E70 8B00                    mov eax, dword ptr [eax]
:004D1E72 E84110F6FF              call 00432EB8
:004D1E77 6A40                    push 00000040

* Possible StringData Ref from Code Obj ->"註冊成功!"
                                  |
:004D1E79 B9FC1E4D00              mov ecx, 004D1EFC

* Possible StringData Ref from Code Obj ->"謝謝您的寶貴支援."
                                  |
:004D1E7E BA081F4D00              mov edx, 004D1F08
:004D1E83 A120704E00              mov eax, dword ptr [004E7020]
:004D1E88 8B00                    mov eax, dword ptr [eax]
:004D1E8A E8E1F4F7FF              call 00451370
:004D1E8F A174F05000              mov eax, dword ptr [0050F074]
:004D1E94 C7803402000001000000    mov dword ptr [ebx+00000234], 00000001
:004D1E9E EB0A                    jmp 004D1EAA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1E36(C)--------------------------------------------------------------/*注意這個偏移地址,向上找到此偏移地址*/
|

* Possible StringData Ref from Code Obj ->"您的註冊碼不正確!"
                                  |
:004D1EA0 B8241F4D00              mov eax, 004D1F24
:004D1EA5 E84661F8FF              call 00457FF0
--------------------------------------------------------

9.到現在為止我們只要知道這個Call
:004D1E31 E89A22F3FF              call 004040D0----------------------------/*這個Call一定是註冊碼比較處*/
如果用Trm2000跟蹤的話,按F8進入

:004040D0 53                      push ebx
:004040D1 56                      push esi
:004040D2 57                      push edi
:004040D3 89C6                    mov esi, eax
:004040D5 89D7                    mov edi, edx
:004040D7 39D0                    cmp eax, edx----------------------------/*這是註冊碼的比較核心
                                      eax是你輸入的註冊碼
                                      edx是真正的註冊碼
                                      (下面我們可用這個地方用
                                      CRACKCODE2000做個序號產生器)*/
:004040D9 0F848F000000            je 0040416E
:004040DF 85F6                    test esi, esi
:004040E1 7468                    je 0040414B
:004040E3 85FF                    test edi, edi
:004040E5 746B                    je 00404152
:004040E7 8B46FC                  mov eax, dword ptr [esi-04]
:004040EA 8B57FC                  mov edx, dword ptr [edi-04]
:004040ED 29D0                    sub eax, edx
:004040EF 7702                    ja 004040F3
:004040F1 01C2                    add edx, eax


10.執行Trw2000,在執行ChinaZip.exe重複2、3步
11.按Ctrl-N撥出Trw2000
  下斷點bpx 4d1e31
  按確定後程式立刻被Trw2000接管
  下命令d edx  哈哈你看到什麼?......註冊碼?^_^

至此我們已經知道了註冊碼,但是這並不是我們的最終目的。我們是想知道他是如何計算出來的?往下看吧^_^

12.重複10步.....
下斷點bpx 004D1E11 我們來到這裡
:004D1E09 8D4DF8                  lea ecx, dword ptr [ebp-08]
:004D1E0C 8B55FC                  mov edx, dword ptr [ebp-04]--------------/*[ebp-04]存放是你的使用者名稱*/
:004D1E0F 8BC3                    mov eax, ebx
:004D1E11 E8D6FDFFFF              call 004D1BEC----------------------------/*註冊碼計算部分*/
:004D1E16 8D55F4                  lea edx, dword ptr [ebp-0C]
:004D1E19 A1CC6D4E00              mov eax, dword ptr [004E6DCC]
:004D1E1E 8B00                    mov eax, dword ptr [eax]

按F8進入call 004D1BEC來到
* Referenced by a CALL at Address:
|:004D1E11 
|
:004D1BEC 55                      push ebp
:004D1BED 8BEC                    mov ebp, esp
:004D1BEF 6A00                    push 00000000
:004D1BF1 6A00                    push 00000000
:004D1BF3 6A00                    push 00000000
:004D1BF5 6A00                    push 00000000
:004D1BF7 6A00                    push 00000000
:004D1BF9 6A00                    push 00000000
:004D1BFB 6A00                    push 00000000
:004D1BFD 53                      push ebx
:004D1BFE 56                      push esi
:004D1BFF 57                      push edi
:004D1C00 894DF8                  mov dword ptr [ebp-08], ecx
:004D1C03 8955FC                  mov dword ptr [ebp-04], edx
:004D1C06 8B45FC                  mov eax, dword ptr [ebp-04]
:004D1C09 E86625F3FF              call 00404174
:004D1C0E 33C0                    xor eax, eax
:004D1C10 55                      push ebp

* Possible StringData Ref from Code Obj ->"?^]U?
                                  |
:004D1C11 68D41C4D00              push 004D1CD4
:004D1C16 64FF30                  push dword ptr fs:[eax]
:004D1C19 648920                  mov dword ptr fs:[eax], esp
:004D1C1C 33F6                    xor esi, esi
:004D1C1E 8D45F4                  lea eax, dword ptr [ebp-0C]
:004D1C21 8B55FC                  mov edx, dword ptr [ebp-04]
:004D1C24 E8AF21F3FF              call 00403DD8
:004D1C29 8B45F4                  mov eax, dword ptr [ebp-0C]
:004D1C2C E88F23F3FF              call 00403FC0-----------------------------/*確定註冊碼的長度*/
:004D1C31 8BF8                    mov edi, eax------------------------------/*將註冊碼的長度(Eax)作為迴圈次數
                                          儲存在Edi當中*/
:004D1C33 85FF                    test edi, edi
:004D1C35 7E57                    jle 004D1C8E------------------------------/*檢查使用者名稱是否為空值若是則跳*/
:004D1C37 BB01000000              mov ebx, 00000001-------------------------/*將Ebx賦值1(表示弟1次迴圈)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C8C(C)
|
:004D1C3C 8B45F4                  mov eax, dword ptr [ebp-0C]---------------/*將使用者名稱取出*/
:004D1C3F 8A4418FF                mov al, byte ptr [eax+ebx-01]-------------/*將第1位的AscII碼取出,結果儲存在al中*/
:004D1C43 E858FFFFFF              call 004D1BA0-----------------------------/*判斷該AscII中的數是否為素數(我們將在下面詳解)*/
:004D1C48 84C0                    test al, al-------------------------------/*若是al=1 若不是al=0*/
:004D1C4A 7425                    je 004D1C71-------------------------------/*al=0跳轉*/
:004D1C4C 8D45E8                  lea eax, dword ptr [ebp-18]     
:004D1C4F 8B55F4                  mov edx, dword ptr [ebp-0C]
:004D1C52 8A541AFF                mov dl, byte ptr [edx+ebx-01]
:004D1C56 E88D22F3FF              call 00403EE8-----------------------------/*               
:004D1C5B 8B45E8                  mov eax, dword ptr [ebp-18]
:004D1C5E 8D55EC                  lea edx, dword ptr [ebp-14]
:004D1C61 E8166DF3FF              call 0040897C-----------------------------/*這三個Call將素數提出並且轉換成大寫*/
:004D1C66 8B55EC                  mov edx, dword ptr [ebp-14]
:004D1C69 8D45F0                  lea eax, dword ptr [ebp-10]
:004D1C6C E85723F3FF              call 00403FC8-----------------------------/*

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C4A(C)
|
:004D1C71 83FB01                  cmp ebx, 00000001-------------------------/*比較是否為第1次迴圈*/
:004D1C74 740A                    je 004D1C80-------------------------------/*若是第1次迴圈則跳轉*/
:004D1C76 8B45F4                  mov eax, dword ptr [ebp-0C]---------------/*將使用者名稱轉移到Eax中*/
:004D1C79 0FB64418FE              movzx eax, byte ptr [eax+ebx-02]----------/*取出1位AscII碼*/
:004D1C7E EB06                    jmp 004D1C86------------------------------/*無條件轉移到004D1C86*/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C74(C)
|
:004D1C80 8B45F4                  mov eax, dword ptr [ebp-0C]---------------/*將使用者名稱轉移到Eax中*/
:004D1C83 0FB600                  movzx eax, byte ptr [eax]-----------------/*將使用者名稱第1位的AscII碼移到Eax中*/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C7E(U)
|
:004D1C86 8D748612                lea esi, dword ptr [esi+4*eax+12]---------/*[esi+4*eax+12]是註冊碼的計算公式
                                              計算結果儲存在Esi當中*/
:004D1C8A 43                      inc ebx-----------------------------------/*當前迴圈次數+1*/
:004D1C8B 4F                      dec edi-----------------------------------/*總迴圈次數-1*/
:004D1C8C 75AE                    jne 004D1C3C------------------------------/*edi不等於0轉移*/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1C35(C)
|
:004D1C8E 8D55E4                  lea edx, dword ptr [ebp-1C]
:004D1C91 8BC6                    mov eax, esi------------------------------/*將Esi中的運算結果移至Eax中*/
:004D1C93 E8A870F3FF              call 00408D40
:004D1C98 8B4DE4                  mov ecx, dword ptr [ebp-1C]
:004D1C9B 8D45F4                  lea eax, dword ptr [ebp-0C]
:004D1C9E 8B55F0                  mov edx, dword ptr [ebp-10]
:004D1CA1 E86623F3FF              call 0040400C-----------------------------/*將運算結果轉換成字串
                                          將上面AscII碼為素數的字母+字串
                                          這就是註冊碼*/----終於算完了^o^
:004D1CA6 8B45F8                  mov eax, dword ptr [ebp-08]
:004D1CA9 8B55F4                  mov edx, dword ptr [ebp-0C]
:004D1CAC E8E320F3FF              call 00403D94
:004D1CB1 33C0                    xor eax, eax
:004D1CB3 5A                      pop edx
:004D1CB4 59                      pop ecx
:004D1CB5 59                      pop ecx
:004D1CB6 648910                  mov dword ptr fs:[eax], edx

* Possible StringData Ref from Code Obj ->"_[迕jjS乩h"
                                  |
:004D1CB9 68DB1C4D00              push 004D1CDB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1CD9(U)
|
:004D1CBE 8D45E4                  lea eax, dword ptr [ebp-1C]
:004D1CC1 BA05000000              mov edx, 00000005
:004D1CC6 E89920F3FF              call 00403D64
:004D1CCB 8D45FC                  lea eax, dword ptr [ebp-04]
:004D1CCE E86D20F3FF              call 00403D40
:004D1CD3 C3                      ret---------------------------------------/*退出子程式*/

至於判斷是否為素數的演算法也很簡單:
按F8進入 call 004D1BA0
* Referenced by a CALL at Address:
|:004D1C43 
|
:004D1BA0 55                      push ebp
:004D1BA1 8BEC                    mov ebp, esp
:004D1BA3 51                      push ecx
:004D1BA4 53                      push ebx
:004D1BA5 56                      push esi
:004D1BA6 8845FF                  mov byte ptr [ebp-01], al
:004D1BA9 C645FD02                mov [ebp-03], 02
:004D1BAD C645FE01                mov [ebp-02], 01
:004D1BB1 8A4DFF                  mov cl, byte ptr [ebp-01]
:004D1BB4 49                      dec ecx
:004D1BB5 80E902                  sub cl, 02
:004D1BB8 722A                    jb 004D1BE4
:004D1BBA 41                      inc ecx
:004D1BBB B302                    mov bl, 02--------------------------------/*bl=2*/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1BE2(C)
|
:004D1BBD 33C0                    xor eax, eax
:004D1BBF 8A45FF                  mov al, byte ptr [ebp-01]-----------------/*將使用者名稱的1位AscII碼移至al*/
:004D1BC2 33D2                    xor edx, edx
:004D1BC4 8AD3                    mov dl, bl--------------------------------/*將Bl-->dl*/
:004D1BC6 8BF2                    mov esi, edx------------------------------/*將edx-->esi*/
:004D1BC8 33D2                    xor edx, edx------------------------------/*edx清零(異或)*/
:004D1BCA F7F6                    div esi-----------------------------------/*eax/esi結果儲存在eax餘數儲存在edx*/
:004D1BCC 85D2                    test edx, edx-----------------------------/*檢查是否有餘數*/
:004D1BCE 7503                    jne 004D1BD3------------------------------/*若有則跳*/
:004D1BD0 FE45FD                  inc [ebp-03]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1BCE(C)
|
:004D1BD3 807DFD02                cmp byte ptr [ebp-03], 02
:004D1BD7 7606                    jbe 004D1BDF
:004D1BD9 C645FE00                mov [ebp-02], 00
:004D1BDD EB05                    jmp 004D1BE4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D1BD7(C)
|
:004D1BDF 43                      inc ebx----------------------------------/*edx+1*/
:004D1BE0 FEC9                    dec cl
:004D1BE2 75D9                    jne 004D1BBD-----------------------------/不等於0跳*/

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004D1BB8(C), :004D1BDD(U)
|
:004D1BE4 8A45FE                  mov al, byte ptr [ebp-02]
:004D1BE7 5E                      pop esi
:004D1BE8 5B                      pop ebx
:004D1BE9 59                      pop ecx
:004D1BEA 5D                      pop ebp
:004D1BEB C3                      ret

大家基本上看明白了吧?
將使用者名稱的一位AscII碼提出/2 /3 /4 /5.........如果能被他本身整除即為素數....

總結一下演算法:
如:使用者名稱是adyiyd(為什麼要加一個a呢?)^o^一會兒就知道了。

字串:  a      d    y    i    y    d
AscII:  61    64    79    69    79    64
十進位制: 97    100  121  105  121  100

註冊碼=SN
a為素數--->A(將他提出)---(原來a的ASCII碼是個素數)^_^
SN=A+((97*4+18)*2+(100*4+18)+(121*4+18)+(105*4+18)+(121*4+18))----(為什麼第一位*2最後一位沒有算呢?大家看看上邊就清楚了)
SN=A2672

整理一下:
使用者名稱: adyiyd
註冊碼: A2672

我們一起寫一個序號產生器....

第一種方法:
用Crackcode2000(具體用法請參考看雪主頁裡RuFeng教程)
CRACKCODE.INI中加入
[Options]
CommandLine=ChinaZip.exe
Mode=2
First_Break_Address=4D1E31
First_Break_Address_Code=E8
First_Break_Address_Code_Lenth=5
Second_Break_Address=4040D7
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDX

第二種方法:
因為本文針對的是初學者,所以用VB編制序號產生器
原始碼如下....
Private Sub Command1_Click()

    Dim Sum As Long  '第二部分總數
    Dim StrString As String '第一部分字串
    Dim Strfull As String  '輸入的使用者名稱
    Dim StrPassWord As String '處理後的密碼
    Dim StrSingle As Integer  '單獨處理的字元的ASC碼值
    Dim intLen As Integer  '使用者名稱長度
    Dim I As Integer, J As Integer
    Dim flgFrist As Boolean '標示是否為第一次迴圈
    StrString = ""
    Sum = 0
    '初始化為第一次迴圈
    flgFrist = True
   
    intLen = Len(Text1(0).Text)
    If intLen <= 1 Then
        MsgBox "請輸入英文字元", vbInformation, "提示"
        With Text1(0)
            .SelStart = 0
            .SelLength = Len(.Text)
            .SetFocus
        End With
        Exit Sub
    End If
    '處理第二部分數字累加
    For I = 1 To intLen - 1
        StrSingle = Asc(Mid(Text1(0).Text, I))
        '輸入中文提示
        If StrSingle < 0 Then
            MsgBox "請輸入英文字元", vbInformation, "提示"
           
            With Text1(0)
                .SelStart = 0
                .SelLength = Len(.Text)
                .SetFocus
            End With
            '如果為中文,則退出迴圈
            Exit Sub
        End If
        Sum = Sum + StrSingle * 4 + 18
    Next I
   
    StrSingle = Asc(Mid(Text1(0).Text, 1))
    Sum = Sum + StrSingle * 4 + 18
    '累加和處理結束
    StrPassWord = Trim(Str(Sum))
   
    '處理第一部分字元連線
    For I = 1 To intLen
        StrSingle = Asc(Mid(Text1(0).Text, I))
        J = 2
        Do While StrSingle Mod J <> 0
            If StrSingle = CLng(J) Then
                Exit Do
            End If
            J = J + 1
        Loop

        If StrSingle = CLng(J) Then
            StrString = StrString & UCase(Chr(StrSingle))
        End If
    Next I
   
    Text1(1).Text = Trim(StrString) & Trim(StrPassWord)
    With Text1(1)
        .SelStart = 0
        .SelLength = Len(.Text)
        .SetFocus
    End With
End Sub

注:本程式沒有對中文字元進行處理

這種方法雖然笨一些,但是非常清楚。還是看不懂得朋友看看我家的注視吧!
寫了這麼多,手已經麻了。還希望大家能夠滿意


希望和大家多多交流!多提寶貴意見!^_^
序號產生器我的網頁可以下載到
http://dyiyd.yeah.net
dyiyd@yeah.net

相關文章