WINZIP8.0(FileVersion:13.0 32bit) Winzip32.EXE 1,393KB

看雪資料發表於2015-11-15

發信人:WINZIP8.0(FileVersion:13.0  32bit)  Winzip32.EXE  1,393KB

發信人:井風

時 間:2000-11-21 

詳細資訊: 


軟體名稱:WINZIP8.0(FileVersion:13.0  32bit)  Winzip32.EXE  1,393KB
下載地點:http://cycycycy.yeah.net  (已經漢化,附註冊碼)
發 信 人: 井風
時    間: 2000-11-21 
破解工具:Trw20001.22
難    度:易

前    言:
              應幾位網友的請求,本人特寫下這篇文章。其目的不是單單為破解此軟體,意義在於拋磚
          引玉,讓初學者理解破解的基本思路。本文具有一定的普遍性,過程講解儘可能詳細,即使是
          未接觸過破解的人也能按步聚找出註冊碼,掌握一套普遍適用的方法。本文歡迎轉載,但務必
          請保留原文完整性。

              本人再次呼籲!每個能人志士積極行動起來,拿出自已的經驗和技術,積極參與交流活動,
          為提高我國計算機技術水平貢獻一份力量。鳴謝!廣大為網友提供技術和經驗的高手、為大家
          建設網站提供交流點的站長們。
             
詳細過程:

一、 執行TRW2000程式
二、 執行Winzip8.0
三、 粗跟蹤
  1 點HELP-->about winzip...-->register...
  2 輸入 Namme:cccc   Reg Key: 88888888 (8個8)
  3 Ctrl+N 撥出TRW,下斷點:BPX HMEMCPY  按F5 返回
  4 點OK,被攔截,
  5 bd * , 作廢所有斷點
  6 pmodule,直接到達Winzip領空,下程式碼:

0137:00407F6D  CALL     `USER32!GetDlgItemTextA`
0137:00407F73  PUSH     EDI       <--來到此行,是WINZIP的程式碼,細跟蹤可以直接中斷到這行[A]
0137:00407F74  CALL     0043F89A
0137:00407F79  PUSH     EDI
0137:00407F7A  CALL     0043F8C3
0137:00407F7F  POP      ECX
0137:00407F80  MOV      ESI,0048CDA4
0137:00407F85  POP      ECX
0137:00407F86  PUSH     BYTE +0B

  7 按F12,在1次後出現非法註冊碼錯誤對話方塊,點OK退出
  8 分析:    按1次後即出現非法註冊碼錯誤框,說明驗證註冊碼就在這段程式碼中(F12 執行到遇到 RET,
          RETF,IRET指令時停下來)。接下來應找出具體哪個CALL產生錯誤框,並記錄下大致跳轉的過程。
          以便可找出在哪個跳轉位置可以跳過產生錯誤框的的CALL。進一步找出驗證註冊碼、計算註冊碼
          的位置。

四、 細跟蹤
  1 同前,輸入註冊碼,撥出TRW,設斷點:BPX 004077F73  <--是上面[A]行
  2 點OK,被攔截,程式碼如下面[步聚7後面]
  3 bc * ,清除所有斷點
  4 現在要找出產生誤註冊碼框的的哪個CALL:按F10,即單步跟蹤。一直按F10,一直按,注意記下的次數,
    直到出現錯誤框,假設使用次數為X次。
  5 從步聚1開始重來,做到步聚4時按F10(X-1)次,即找出了產生錯誤的CALL,
    是下面程式碼後部的0137:00408018  CALL  00430025,就是這條指令產生錯誤框。
  6 著重分析如何跳過0137:00408018  CALL  00430025這條產生錯誤框指令。讀者可從下面程式碼由後面向前
    讀,弄懂本人的分析過程。另也可以首先在離0137:00408018  CALL  00430025這條產生錯誤框指令不遠
    程式碼處開始,記錄一份程式執行到0137:00408018 CALL 的跳轉過程,這樣便於直接找出那個重要的跳轉
    點,即如本程式中的00407FBC  JZ  00408005。
  7 現在已基本找出驗證註冊碼的地方了0137:00407FB5  CALL 004079D5 這個CALL中驗證註冊碼,所以要深
    入跟蹤進這個CALL。(深入跟蹤步聚在程式碼後面)

0137:00407F6D  CALL     `USER32!GetDlgItemTextA`
0137:00407F73  PUSH     EDI       <--中斷於此行,從這行起開始細跟蹤,即按F10鍵。
0137:00407F74  CALL     0043F89A
0137:00407F79  PUSH     EDI
0137:00407F7A  CALL     0043F8C3
0137:00407F7F  POP      ECX
0137:00407F80  MOV      ESI,0048CDA4
0137:00407F85  POP      ECX
0137:00407F86  PUSH     BYTE +0B
0137:00407F88  PUSH     ESI
      .
      .
      .
0137:00407F96  CALL     0043F89A
0137:00407F9B  PUSH     ESI
0137:00407F9C  CALL     0043F8C3
0137:00407FA1  CMP      BYTE [0048CD78],00
0137:00407FA8  POP      ECX
0137:00407FA9  POP      ECX
0137:00407FAA  JZ       00408005
0137:00407FAC  CMP      BYTE [0048CDA4],00
0137:00407FB3  JZ       00408005

0137:00407FB5  CALL     004079D5   <--就是這個CALL中驗證註冊碼,所以深入跟蹤進入這個CALL

0137:00407FBA  TEST     EAX,EAX    <--就是這個測試(TEST),至關重要,EAX的值由上面的CALL決定,
                                      哪就是說上面這個CALL驗證註冊碼,並相應置EAX的值,決定是
                                      否跳轉。應深入到這個CALL中,找出驗證的地方。
0137:00407FBC  JZ       00408005   <--這裡如跳轉則到00408005 CALL,接下去執行00408018 CALL,出錯

0137:00407FBE  PUSH     EDI
0137:00407FBF  MOV      EDI,0047FFA4
0137:00407FC4  PUSH     DWORD 0047DB24
0137:00407FC9  PUSH     EDI
0137:00407FCA  CALL     0043B5DA
0137:00407FCF  PUSH     ESI
0137:00407FD0  PUSH     DWORD 0047E66C
0137:00407FD5  PUSH     EDI
0137:00407FD6  CALL     0043B5DA
0137:00407FDB  PUSH     DWORD 0047FFC4
0137:00407FE0  PUSH     BYTE +00
0137:00407FE2  PUSH     BYTE +00
0137:00407FE4  PUSH     DWORD 0047DB30
0137:00407FE9  CALL     0043B5C1
0137:00407FEE  MOV      EAX,[00487AF4]
0137:00407FF3  ADD      ESP,BYTE +28
0137:00407FF6  TEST     EAX,EAX
0137:00407FF8  JZ       00408001
0137:00407FFA  PUSH     EAX
0137:00407FFB  CALL     `GDI32!DeleteObject`
0137:00408001  PUSH     BYTE +01
0137:00408003  JMP      SHORT 00408035
0137:00408005  CALL     004082A6  <--上面00407FBC行跳到此行,如執行到此行,則會執行00408018 CALL
0137:0040800A  PUSH     DWORD 028E   說明上一跳轉已判別出輸入的是錯誤註冊碼。繼續向分分析
0137:0040800F  CALL     0043F5ED
0137:00408014  PUSH     EAX
0137:00408015  PUSH     EBX
0137:00408016  PUSH     BYTE +3D
0137:00408018  CALL     00430025    <--執行此行CALL則出現錯誤框,須找出如何才能跳過此行
0137:0040801D  ADD      ESP,BYTE +10
0137:00408020  INC      DWORD [00487AF8]


四、 深入跟蹤
  1 重複細跟蹤步聚中的1-3步;
  2 按F10,小心不要走過頭呵,一直執行00407FB5 CALL 004079D5 這行;
  3 按F8,追入此CALL,來到下面程式碼(程式碼在步聚4後面);
  4 按F10,邊按邊分析,值得懷凝地方可檢視各暫存器的內容(用D EAX 、EDI等命令)你會找到下面的
    程式碼,本程式就在這裡計算和驗證註冊碼。按F10鍵53次到達0137:00407A97 PUSH EAX(見程式碼),這
    裡就是…………。

0137:00407905  POP      ESI  <-- 追入上敘CALL後,來到此行
0137:00407906  POP      EBP
0137:00407907  RET      04
0137:0040790A  PUSH     ESI
0137:0040790B  MOV      ESI,ECX
    .
    .
    .
0137:00407A5E  PUSH     EAX
0137:00407A5F  CALL     00467C10
0137:00407A64  PUSH     DWORD C8
0137:00407A69  LEA      EAX,[EBP+FFFFFDF8]
0137:00407A6F  PUSH     BYTE +00
0137:00407A71  PUSH     EAX
0137:00407A72  CALL     00467C10
0137:00407A77  ADD      ESP,BYTE +18
0137:00407A7A  TEST     ESI,ESI
0137:00407A7C  JZ       00407A91
0137:00407A7E  CALL     004082A6
0137:00407A83  AND      DWORD [00489FDC],BYTE +00
0137:00407A8A  XOR      EAX,EAX
0137:00407A8C  JMP      00407B42
0137:00407A91  LEA      EAX,[EBP+FFFFFEC0]
0137:00407A97  PUSH     EAX          <--按F10鍵53次到這行
0137:00407A98  PUSH     EDI          <--執行此行後,下令D EDI,顯示‘cccc’,即輸入的註冊名
0137:00407A99  CALL     00407B47     <--呼叫計算註冊碼子程式(新版本)
0137:00407A9E  MOV      ESI,0048CDA4 <--傳送輸入的註冊碼,執行此行後下令D ESI,顯示‘8個8’
0137:00407AA3  LEA      EAX,[EBP+FFFFFEC0]
0137:00407AA9  PUSH     ESI          <--將輸入的假碼‘8個8’壓入堆疊,下令D ESI,顯示‘8個8’
0137:00407AAA  PUSH     EAX          <--計算出的註冊碼壓入堆疊,下令D EAX 顯示正確註冊碼:
                                                                                    02EC0252 
0137:00407AAB  CALL     004692D0     <--呼叫驗證註冊碼子程式,看看輸入的是否為新版本註冊碼。
0137:00407AB0  ADD      ESP,BYTE +10
0137:00407AB3  NEG      EAX
0137:00407AB5  SBB      EAX,EAX
0137:00407AB7  INC      EAX
0137:00407AB8  MOV      [00489FDC],EAX
0137:00407ABD  JNZ      00407B27    <--如輸入的註冊碼正確,這裡跳轉,可返回呼叫程式,
                                       可跳過00408018 CALL ,完成程式註冊。
0137:00407ABF  LEA      EAX,[EBP+FFFFFEC0]
0137:00407AC5  PUSH     EAX       
0137:00407AC6  PUSH     EDI         <--執行此行後,下令D EDI,顯示‘cccc’,即輸入的註冊名
0137:00407AC7  CALL     00407BE4    <--呼叫計算註冊碼子程式(老版本)
0137:00407ACC  LEA      EAX,[EBP+FFFFFEC0]
0137:00407AD2  PUSH     ESI          <--將輸入的假碼‘8個8’壓入堆疊,下令D ESI,顯示‘8個8’
0137:00407AD3  PUSH     EAX          <--計算出的註冊碼壓入堆疊,下令D EAX 顯示正確註冊碼:
                                                                                   07480594
0137:00407AD4  CALL     004692D0     <--呼叫驗證註冊碼子程式,看看輸入的是否為新版本註冊碼。
0137:00407AD9  ADD      ESP,BYTE +10
0137:00407ADC  NEG      EAX
0137:00407ADE  SBB      EAX,EAX
0137:00407AE0  INC      EAX
0137:00407AE1  MOV      [00489FDC],EAX
0137:00407AE6  JNZ      00407B27
0137:00407AE8  LEA      EAX,[EBP+FFFFFEC4]
0137:00407AEE  PUSH     BYTE +04
0137:00407AF0  PUSH     EAX
0137:00407AF1  PUSH     ESI
0137:00407AF2  CALL     004696C0
0137:00407AF7  ADD      ESP,BYTE +0C
0137:00407AFA  TEST     EAX,EAX
0137:00407AFC  JNZ      00407B20             (JUMP)
0137:00407AFE  LEA      EAX,[EBP+FFFFFEC0]
0137:00407B04  PUSH     BYTE +04
0137:00407B06  PUSH     EAX
0137:00407B07  PUSH     DWORD 0048CDA8
0137:00407B0C  CALL     004696C0
0137:00407B11  ADD      ESP,BYTE +0C
0137:00407B14  TEST     EAX,EAX
0137:00407B16  JNZ      00407B20
0137:00407B18  MOV      [00489FDC],EBX
0137:00407B1E  JMP      SHORT 00407B27
0137:00407B20  AND      DWORD [00489FDC],BYTE +00
0137:00407B27  PUSH     DWORD 012C
0137:00407B2C  LEA      EAX,[EBP+FFFFFEC0]
0137:00407B32  PUSH     BYTE +00
0137:00407B34  PUSH     EAX
0137:00407B35  CALL     00467C10
0137:00407B3A  MOV      EAX,[00489FDC]
0137:00407B3F  ADD      ESP,BYTE +0C
0137:00407B42  POP      EDI
0137:00407B43  POP      ESI
0137:00407B44  POP      EBX
0137:00407B45  LEAVE   
0137:00407B46  RET       <--執行此行返回呼叫程式


至此,找出註冊碼!


小   結: 
            此程式有兩處計算和驗證註冊碼的子程式。它可用新版本的註冊碼註冊,亦可用前一版本的
        註冊碼完成註冊。
         User Name:    cccc 
         Reg Key:      02EC0252 或07480594  (新舊版本註冊碼皆可用)
後   記:
        有疑問請與我聯絡:hz.cy@163.net

相關文章