• 标 题:WINZIP8.0(FileVersion:13.0 32bit) Winzip32.EXE 1,393KB
  • 作 者:井风
  • 时 间:2000-11-21
  • 链 接:http://bbs.pediy.com

软件名称: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