软件名称:WinImage4.0(FileVersion:4.00.4000)  WinImage.EXE  320KB
下载地点:http://www.winimage.com/winimage.htm
发 信 人: 井  风
时    间: 2000-12-08 
破解工具:Trw20001.22


前    言:此软件有专业模式和标准模式两组注册码,试用期为30天。
             
             
详细过程:

一、 运行TRW2000程序
二、 运行WinImage4.0
三、 粗跟踪
  1 点[选项]-->[注册]......
  2 输入 姓名:CCCC   注册码: 88888888 (8个8)
  3 Ctrl+N 呼出TRW,下断点:BPX getdlgitemtexta  按F5 返回
  4 点[确定],被拦截,

0137:BFF61654  RET      0C
0137:BFF61657  MOV      CL,96     <------中断于此行
0137:BFF61659  PUSH     EBP
0137:BFF6165A  MOV      EBP,ESP
0137:BFF6165C  PUSH     ECX
0137:BFF6165D  SUB      ESP,BYTE +3C
0137:BFF61660  PUSH     WORD [EBP+08]
0137:BFF61664  PUSH     DWORD [EBP+0C]
0137:BFF61667  CALL     `KERNEL32!SMapLS_IP_EBP_16`
0137:BFF6166C  PUSH     EAX
0137:BFF6166D  PUSH     WORD [EBP+14]
0137:BFF61671  CALL     NEAR [BFF61206]

  5 bd * , 作废所有断点
  6 pmodule,直接到达WinImage领空,如下代码:

0137:00429093  CALL     ESI
0137:00429095  MOV      EDI,0043C420   <------来到此行,标记为[A]
0137:0042909A  PUSH     BYTE +7F
0137:0042909C  PUSH     EDI
0137:0042909D  PUSH     DWORD 0817

  7 按F12,在1次后出现非法注册码错误对话框,点[确定]退出
  8 分析:    按1次后即出现非法注册码错误框,说明验证注册码就在这段代码中(F12 运行到遇到 RET,
          RETF,IRET指令时停下来)。接下来应找出具体哪个CALL产生错误框,并记录下大致跳转的过程。
          以便可找出在哪个跳转位置可以跳过产生错误框的的CALL。进一步找出验证注册码、计算注册码
          的位置。

四、 细跟踪
  1 同前,输入注册码,呼出TRW,设断点:BPX 00429095  <--是上面A行
  2 点[确定],被拦截,代码如下[步聚7后面]
  3 bc * ,清除所有断点
  4 现在要找出产生误注册码框的的哪个CALL:按F10,即单步跟踪。一直按F10,33次,出现错误框。
  5 从步聚1开始重来,做到步聚4时按F10(33-1)次,即找出了产生错误的CALL,
    是下面代码后部的0137:00429131 CALL 0041D7F5 ,就是这条指令产生错误框。
  6 着重分析如何跳过0137:00429131 CALL 0041D7F5 这条产生错误框指令。读者可从下面代码由后面向前
    读,弄懂本人的分析过程。
  7 现在已基本找出验证注册码的地方了004290AE CALL 0042CD8320这个CALL中验证注册码,所以要深
    入跟踪进这个CALL。(深入跟踪步聚在代码后面)

0137:00429093  CALL     ESI
0137:00429095  MOV      EDI,0043C420   <------四中的1步中断于此,按F10 33次出现错误框。
0137:0042909A  PUSH     BYTE +7F
0137:0042909C  PUSH     EDI
0137:0042909D  PUSH     DWORD 0817
0137:004290A2  PUSH     DWORD [EBP+08]
0137:004290A5  CALL     ESI
0137:004290A7  PUSH     DWORD 0043C800
0137:004290AC  PUSH     EDI
0137:004290AD  PUSH     EBX
0137:004290AE  CALL     0042CD8320     <---可以确定此CALL为计算或验证注册码,为后面跳转产生
                                           判断条件(置EAX寄存器为1),所要着重深入跟踪此CALL
0137:004290B3  MOV      ECX,[0043C800]
0137:004290B9  XOR      EDX,EDX 
0137:004290BB  ADD      ESP,BYTE +0C
0137:004290BE  CMP      EAX,EDX
0137:004290C0  MOV      [0043C5E8],EAX
0137:004290C5  JZ       004290CD       <---错注册码此行跳
0137:004290C7  MOV      [0043C7C4],ECX
0137:004290CD  CMP      [0043C7C4],EDX
0137:004290D3  MOV      [0043CA54],ECX
0137:004290D9  JNZ      004290E0       <---错注册码此行跳
0137:004290DB  MOV      [0043CA54],EAX
0137:004290E0  PUSH     BYTE +01
0137:004290E2  CMP      EAX,EDX        <---比较寄存器(即相减),产生后一跳转判断的条件
0137:004290E4  POP      ESI
0137:004290E5  JNZ      00429113       <---此行如果不跳则到C行,继而到B行出错
0137:004290E7  PUSH     DWORD 2000
0137:004290EC  PUSH     DWORD 042D
0137:004290F1  PUSH     DWORD 042B
0137:004290F6  MOV      [0043C6CC],ESI
0137:004290FC  PUSH     DWORD [EBP+08]
0137:004290FF  MOV      [0043C824],ESI
0137:00429105  MOV      [0043C420],DL
0137:0042910B  MOV      [0043C828],DL
0137:00429111  JMP      SHORT 00429131  <---如执行到此行则跳到B行,记着[C]
0137:00429113  PUSH     DWORD 2000
0137:00429118  PUSH     DWORD 042D
0137:0042911D  PUSH     DWORD 042A
0137:00429122  MOV      [0043C6CC],EDX
0137:00429128  PUSH     DWORD [EBP+08]
0137:0042912B  MOV      [0043C824],EDX
0137:00429131  CALL     0041D7F5        <---第1步按F10键32次来到此行,执行此出错误框,记着[B]行
0137:00429136  ADD      ESP,BYTE +10
0137:00429139  PUSH     ESI
0137:0042913A  PUSH     DWORD [EBP+08]
0137:0042913D  CALL     `USER32!EndDialog`
0137:00429143  MOV      EAX,ESI
0137:00429145  JMP      SHORT 00429180
0137:00429147  PUSH     DWORD [EBP+08]
0137:0042914A  CALL     0041D512
0137:0042914F  CMP      DWORD [0043C5E8],BYTE +00



四、 深入跟踪
  1 追入此004290AE  CALL  0042CD8320  此行的CALL,来到下面代码。

0137:0042CD83  PUSH     EBP      <---深入跟踪追入后来到此行
0137:0042CD84  MOV      EBP,ESP
0137:0042CD86  SUB      ESP,0200
0137:0042CD8C  PUSH     ESI
   .
   .
   .
0137:0042CDE0  JZ       NEAR 0042CE86
0137:0042CDE6  LEA      EAX,[EBP+FFFFFF00]
0137:0042CDEC  PUSH     EAX
0137:0042CDED  LEA      EAX,[EDI+14051948]
0137:0042CDF3  PUSH     EAX
0137:0042CDF4  LEA      EAX,[EBP+FFFFFE00]
0137:0042CDFA  PUSH     EAX
0137:0042CDFB  CALL     0042CD36      <---此CALL计算注册码,
                                          执行此行后D EAX 看见标准注册码:144E1ADC
0137:0042CE00  POP      ECX
0137:0042CE01  POP      ECX
0137:0042CE02  PUSH     EAX
0137:0042CE03  CALL     `CRTDLL!strcmp`
0137:0042CE08  POP      ECX
0137:0042CE09  TEST     EAX,EAX
0137:0042CE0B  POP      ECX
0137:0042CE0C  JZ       0042CE86
0137:0042CE0E  LEA      EAX,[EBP+FFFFFF00]
0137:0042CE14  PUSH     EAX
0137:0042CE15  LEA      EAX,[EDI+17061954]
0137:0042CE1B  PUSH     EAX
0137:0042CE1C  LEA      EAX,[EBP+FFFFFE00]
0137:0042CE22  PUSH     EAX
0137:0042CE23  CALL     0042CD36      <---此CALL计算另一注册码,
                                          执行此行后D EAX 看见标准注册码:174F1AEB
0137:0042CE28  POP      ECX
0137:0042CE29  POP      ECX
0137:0042CE2A  PUSH     EAX
0137:0042CE2B  CALL     `CRTDLL!strcmp`
0137:0042CE30  POP      ECX
0137:0042CE31  TEST     EAX,EAX
0137:0042CE33  POP      ECX
0137:0042CE34  JZ       0042CE86
0137:0042CE36  LEA      EAX,[EBP+FFFFFF00]
0137:0042CE3C  PUSH     EAX
0137:0042CE3D  LEA      EAX,[EDI+10051981]
0137:0042CE43  PUSH     EAX
0137:0042CE44  LEA      EAX,[EBP+FFFFFE00]
0137:0042CE4A  PUSH     EAX
0137:0042CE4B  CALL     0042CD36      <---此CALL计算注册码,
                                          执行此行后D EAX 看见专业注册码:104E1815
0137:0042CE50  POP      ECX
0137:0042CE51  POP      ECX
0137:0042CE52  PUSH     EAX
   .
   .
   .
0137:0042CEC0  POP      EDI
0137:0042CEC1  POP      ESI
0137:0042CEC2  LEAVE   
0137:0042CEC3  RET       <---------执行此行返回呼叫程序


至此,找出注册码!


小   结: 
            此程序有三处计算注册码的子程序。有兴趣的读者可追入计算注册码的CALL,详细研究其
         算法,写注册机。

         姓名:CCCC  标准注册码:144E1ADC 或 174F1AEB 专业注册码:104E1815

后   记:
        有疑问请与我联系:hz.cy@163.net