• 标 题:超级拖拉机 4.02
  • 作 者:fxyang
  • 时 间:2003/03/31 00:51am
  • 链 接:http://bbs.pediy.com

超级拖拉机

超级拖拉机是一个四副牌的拖拉机游戏,在全国范围都有广泛使用。
游戏有多种设定以适应不同地方的规则。游戏支持单人玩,也支网络
多人一起玩。最新版4.02

下载地址:  http://yywk.nease.net/

软件限制:在单人游戏中,未注册版本的悔牌次数受限制。在多人游戏中,
未注册版本只能玩一段时间。

【破解工具】:Ollydbg1.09 中文版
【过    程】:


呵呵,我们开工吧!唉!^-^^-^ 我的水平很低,许多地方表达的有问题,烦请各位指教!
用ollydbg加载运行 ,发现是个重起效验型的软件.输入注册码后,软件用用户名和试验码
计算(加密注册信息)得到新的字符串后放到注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\yywk\超级拖拉机]-reg下

输入试验码:123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK  (一共要46位)
说明:试验码没有46位,程序在用用户名计算的值移动试验码时,就会计算出一些别的字符在
比较的字符串中,引起无法正确跟踪.

开始:

第一部分---注册表中注册信息的处理过程
用0llydbg加载后下 RegQueryvalueExA中断:
|

00423A4E  PUSH    超级拖拉.0046D470                 ;  ASCII "reg"
00423A53  PUSH    EAX
00423A54  MOV     BYTE PTR SS:[EBP+2E8], 0
00423A5B  MOV     DWORD PTR SS:[ESP+28], ESI
00423A5F  CALL    EBX                               ;  //读注册信息
00423A61  MOV     EAX, DWORD PTR SS:[ESP+10]
00423A65  CMP     EAX, ESI
00423A67  JNB     SHORT 超级拖拉.00423A75
00423A69  MOV     ECX, DWORD PTR SS:[EBP+530]      

;  ECX<==SS:[470D98]=01260490. ASCII "q02$%7'yc"k$%&'jhz{m}N/r1z3456uyij@RcGO"

00423A6F  MOV     BYTE PTR DS:[EAX+ECX], 0
00423A73  JMP     SHORT 超级拖拉.00423A7F
|
00423ADD  MOV     EAX, DWORD PTR SS:[EBP+530]       ;  EAX<==01260490.
00423AE3  PUSH    EAX
00423AE4  CALL    超级拖拉.004051B0
00423AE9  MOV     EDI, EAX                          ;  EDI=EAX (长度)
00423AEB  XOR     ECX, ECX
00423AED  ADD     ESP, 4
00423AF0  CMP     EDI, ECX
00423AF2  MOV     DWORD PTR SS:[ESP+1C], ECX
00423AF6  MOV     BYTE PTR SS:[ESP+20], 1
00423AFB  MOV     BYTE PTR SS:[ESP+21], 2
00423B00  MOV     BYTE PTR SS:[ESP+22], 40
00423B05  MOV     BYTE PTR SS:[ESP+23], 20
00423B0A  MOV     BYTE PTR SS:[ESP+24], 8
00423B0F  MOV     BYTE PTR SS:[ESP+25], 10   ;  //计算开始
00423B14  JLE     SHORT 超级拖拉.00423B55  

;  SS:[12F498]<== 01 02 40 20 08 10 1A 02 赋值

00423B16  /MOV     EAX, ECX
00423B18  |XOR     EDX, EDX
00423B1A  |DIV     DWORD PTR SS:[ESP+18]
00423B1E  |MOV     ESI, 6                           ;  ESI=6
00423B23  |MOV     DL, BYTE PTR SS:[ESP+EDX+28]     ;  DL<==4A ('J')
00423B27  |MOV     BYTE PTR SS:[ESP+1C], DL
00423B2B  |MOV     EAX, DWORD PTR SS:[ESP+1C]       ;  EAX<==4A ('J')
00423B2F  |CDQ
00423B30  |IDIV    ESI                     ;  EAX= 4A IDIV ESI=6 ==>EAX= 0C EDX=2
00423B32  |MOV     EAX, DWORD PTR SS:[EBP+530]      ;  EAX<==01260490.
00423B38  |LEA     ESI, DWORD PTR DS:[ECX+EAX]    ;  EAX<==01260490. ECX=0
00423B3B  |MOV     AL, BYTE PTR DS:[ECX+EAX]        ;  AL<== 77 ('w')
00423B3E  |MOV     DL, BYTE PTR SS:[ESP+EDX+20]  ;  DL<==40 ('@')
00423B42  |TEST    AL, DL
00423B44  |JNZ     SHORT 超级拖拉.00423B4A
00423B46  |OR      AL, DL
00423B48  |JMP     SHORT 超级拖拉.00423B4E
00423B4A  |NOT     DL
00423B4C  |AND     AL, DL
00423B4E  |INC     ECX
00423B4F  |MOV     BYTE PTR DS:[ESI], AL            
00423B51  |CMP     ECX, EDI
00423B53  \JL      SHORT 超级拖拉.00423B16        

;  //这里把注册表中加密的注册信息还原成原来的试验码

;  DS:[ESI]=01260490,(ASCII"123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK")

00423B74  MOV     EAX, DWORD PTR SS:[EBP+530]      

;  EAX<==01260490,(ASCII"123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK")

00423B7A  POP     EDI
00423B7B  POP     ESI
00423B7C  MOV     DL, BYTE PTR DS:[EAX+20]          ;  DL=0
00423B7F  MOV     CL, BYTE PTR DS:[EAX+2]           ;  CL=DS:[1260492]
00423B82  MOV     BYTE PTR DS:[EAX+2], DL  
00423B85  MOV     EAX, DWORD PTR SS:[EBP+530]       ;  EAX<==01260490,
00423B8B  MOV     BYTE PTR DS:[EAX+20], CL          ;  DS:[EAX+20]=CL
00423B8E  MOV     EAX, DWORD PTR SS:[EBP+530]       ;  EAX<==01260490,
00423B94  MOV     DL, BYTE PTR DS:[EAX+17]          ;  DL=DS:[EAX+17]
00423B97  MOV     CL, BYTE PTR DS:[EAX+7]           ;  CL=DS:[EAX+7]
00423B9A  MOV     BYTE PTR DS:[EAX+7], DL           ;  DL=
00423B9D  MOV     EAX, DWORD PTR SS:[EBP+530]       ;  EAX<==01260490
00423BA3  MOV     BYTE PTR DS:[EAX+17], CL          
00423BA6  MOV     EAX, DWORD PTR SS:[EBP+530]       ;  EAX<==01260490
00423BAC  MOV     DL, BYTE PTR DS:[EAX+12]        
00423BAF  MOV     CL, BYTE PTR DS:[EAX+1D]        
00423BB2  MOV     BYTE PTR DS:[EAX+1D], DL        
00423BB5  MOV     EAX, DWORD PTR SS:[EBP+530]
00423BBB  MOV     BYTE PTR DS:[EAX+12], CL        
00423BBE  MOV     EAX, DWORD PTR SS:[EBP+530]
00423BC4  MOV     DL, BYTE PTR DS:[EAX+2A]          
00423BC7  MOV     CL, BYTE PTR DS:[EAX+1F]      
00423BCA  MOV     BYTE PTR DS:[EAX+1F], DL        
00423BCD  MOV     EAX, DWORD PTR SS:[EBP+530]
00423BD3  MOV     BYTE PTR DS:[EAX+2A], CL
00423BD6  MOV     EAX, DWORD PTR SS:[EBP+530]
00423BDC  MOV     DL, BYTE PTR DS:[EAX+C]        
00423BDF  MOV     CL, BYTE PTR DS:[EAX+24]        
00423BE2  MOV     BYTE PTR DS:[EAX+24], DL      
00423BE5  MOV     EAX, DWORD PTR SS:[EBP+530]
00423BEB  MOV     BYTE PTR DS:[EAX+C], CL    
00423BEE  MOV     EAX, DWORD PTR SS:[EBP+530]
00423BF4  MOV     DL, BYTE PTR DS:[EAX+21]      
00423BF7  MOV     CL, BYTE PTR DS:[EAX+28]    
00423BFA  MOV     BYTE PTR DS:[EAX+28], DL    
00423BFD  MOV     EAX, DWORD PTR SS:[EBP+530]
00423C03  MOV     BYTE PTR DS:[EAX+21], CL      
00423C06  MOV     EAX, DWORD PTR SS:[EBP+530]
00423C0C  MOV     DL, BYTE PTR DS:[EAX+F]        
00423C0F  MOV     CL, BYTE PTR DS:[EAX+19]      
00423C12  MOV     BYTE PTR DS:[EAX+19], DL      
00423C15  MOV     EAX, DWORD PTR SS:[EBP+530]
00423C1B  MOV     BYTE PTR DS:[EAX+F], CL        
00423C1E  MOV     EAX, DWORD PTR SS:[EBP+530]
00423C24  MOV     DL, BYTE PTR DS:[EAX+14]      
00423C27  MOV     CL, BYTE PTR DS:[EAX+5]        
00423C2A  MOV     BYTE PTR DS:[EAX+5], DL        
00423C2D  MOV     EAX, DWORD PTR SS:[EBP+530]
00423C33  POP     EBP
00423C34  MOV     BYTE PTR DS:[EAX+14], CL          ;  CL=36
00423C37  ADD     ESP, 3C                           ;  //EAX=01260490
00423C3A  RETN      
****************
00423C2D  MOV     EAX <==12x45l7o9abcBefqhiuklmn8pgrstjvH3FzAdCDEyGwIJK
到这里试验码变成 "12x45l7o9abcBefqhiuklmn8pgrstjvH3FzAdCDEyGwIJK"

;  //以上把试验码打散
===============================================================

第二部分--注册码的计算(实际上是把试验码用用户名计算的值做参数重新排列)

004231AD  CALL    超级拖拉.004051B0
004231B2  MOV     EBX, EAX                   ;  EBX=EAX=6长度
004231B4  ADD     ESP, 4
004231B7  TEST    EBX, EBX
004231B9  JLE     SHORT 超级拖拉.00423215
004231BB  MOV     EAX, -4F8                    ;  EAX=-4F8
004231C0  MOV     ECX, EDI                      ;  ECX<==00470D60,(ASCII "fxyang")
004231C2  SUB     EAX, ESI
004231C4  MOV     DWORD PTR SS:[ESP+14], EAX  ;  EAX=FFB8F2A0
004231C8  XOR     EDX, EDX
004231CA  MOV     EBP, 2C                           ;  EBP=2C
004231CF  MOV     DL, BYTE PTR DS:[ECX]  
;  DL<==DS:[470D60]=66 ('f') 用户名的第一位
004231D1  MOV     EDI, EDX                          ;  EDI=66
004231D3  XOR     EDX, EDX
004231D5  MOV     EAX, EDI                          ;  EAX=66
004231D7  DIV     EBP             ;  EAX=66 DIV EBP=2C ==>EAX=02 EDX=0E
004231D9  MOV     EAX, EDI                          ;  EAX=66
004231DB  MOV     EDI, 2C                           ;  EDI=2C
004231E0  NOT     EAX                               ;  EAX=FFFFFFF99
004231E2  MOV     EBP, EDX                          ;  EBP=EDX=0E
004231E4  XOR     EDX, EDX
004231E6  DIV     EDI                              
004231E8  MOV     EAX, DWORD PTR DS:[ESI+530]      
004231EE  INC     ECX                               ;  //进一位
004231EF  MOV     EDI, EDX                          ;  EDI=EDX=21
004231F1  MOV     DL, BYTE PTR DS:[EAX+EBP]        
004231F4  MOV     BYTE PTR SS:[ESP+13], DL
004231F8  MOV     DL, BYTE PTR DS:[EAX+EDI]        
;  DL<==DS:[EAX+EDI]=C1 EAX=01260490  EDI=21
004231FB  MOV     BYTE PTR DS:[EAX+EBP], DL      
004231FE  MOV     EAX, DWORD PTR DS:[ESI+530]      
00423204  MOV     DL, BYTE PTR SS:[ESP+13]          
00423208  MOV     BYTE PTR DS:[EDI+EAX], DL        
0042320B  MOV     EAX, DWORD PTR SS:[ESP+14]        
0042320F  ADD     EAX, ECX
00423211  CMP     EAX, EBX                          ;  //计算的次数=6
00423213  JL      SHORT 超级拖拉.004231C8          

;  //用用户名计算的值做指针把试验码重新排列

00423215  DEC     EBX
00423216  TEST    EBX, EBX
00423218  MOV     DWORD PTR SS:[ESP+18], EBX
0042321C  JLE     SHORT 超级拖拉.00423289
0042321E  MOV     EAX, -4F9                         ;  EAX=-4F9
00423223  LEA     EDI, DWORD PTR DS:[ESI+4F9]      

;  EDI<== DS:[ESI+4F9]=00470D61,(ASCII "xyang")

00423229  SUB     EAX, ESI
0042322B  MOV     DWORD PTR SS:[ESP+14], EAX        ;  EAX=FFB8F29F
0042322F  XOR     ECX, ECX
00423231  XOR     EDX, EDX
00423233  MOV     CL, BYTE PTR DS:[EDI-1]           ;  CL=DS:[470D60]=66 ('f')
00423236  MOV     EBX, 29                           ;  EBX=29
0042323B  MOV     EBP, ECX                          ;  EBP=66
0042323D  XOR     ECX, ECX
0042323F  MOV     CL, BYTE PTR DS:[EDI]             ;  CL=DS:[470D61]=78 ('x')
00423241  MOV     EAX, EBP                          ;  EAX=66
00423243  SHL     EAX, 8                            ;  EAX=00006600
00423246  ADD     EAX, ECX                          ;  EAX=6678
00423248  DIV     EBX             ;  EAX=6678 DIV EBX=29 ==>EAX=27F EDX=21
0042324A  MOV     EAX, EBP                          ;  EAX=66
0042324C  NOT     EAX                               ;  EAX=FFFFFF99
0042324E  SHL     EAX, 8                            ;  EAX=FFFF9900
00423251  NOT     ECX                               ;  ECX=FFFFFF87
00423253  ADD     EAX, ECX                          ;  EAX=FFFF9987
00423255  MOV     ECX, 25                           ;  ECX=25
0042325A  MOV     EBX, EDX                          ;  EBX=21
0042325C  XOR     EDX, EDX
0042325E  DIV     ECX                              

;  EAX=FFFF9887 DIV ECX=25 ==>EAX=6EB3B79 EDX=0A

00423260  MOV     EAX, DWORD PTR DS:[ESI+530]      
00423266  INC     EDI
00423267  MOV     CL, BYTE PTR DS:[EAX+EBX]    
 
;  CL=DS:[EAX+EBX]=C1 EAX=01260490 EBX=21

0042326A  MOV     EBP, EDX                          ;  EBP=EDX=A
0042326C  MOV     DL, BYTE PTR DS:[EAX+EBP]  ;  DL=DS:[EAX+EBP]=31 ('1')
0042326F  MOV     BYTE PTR DS:[EAX+EBX], DL
00423272  MOV     EAX, DWORD PTR DS:[ESI+530]
00423278  MOV     BYTE PTR DS:[EAX+EBP], CL         ;  CL=C1
0042327B  MOV     ECX, DWORD PTR SS:[ESP+14]
0042327F  MOV     EAX, DWORD PTR SS:[ESP+18]
00423283  ADD     ECX, EDI
00423285  CMP     ECX, EAX
00423287  JL      SHORT 超级拖拉.0042322F          

;  //用用户名计算的值做指针把试验码重新排列
|
004232EC  MOV     DWORD PTR DS:[4719B8], EDI
004232F2  MOV     ECX, DWORD PTR DS:[ESI+530]       ;  ECX<==DS:[470D98]=01260490,(ASCII "78")
004232F8  MOV     EDX, DWORD PTR DS:[ESI+52C]       ;  EDX<==DS:[470D94]=01260450
004232FE  MOV     EAX, DWORD PTR DS:[ECX]           ;  EAX=DS:[1260490]=34003837
00423300  MOV     DWORD PTR DS:[EDX], EAX
00423302  MOV     EAX, DWORD PTR DS:[ECX+4]        
00423305  MOV     DWORD PTR DS:[EDX+4], EAX
00423308  MOV     EAX, DWORD PTR DS:[ECX+8]  ;  EAX=DS:[1260498]=32C17433
0042330B  MOV     DWORD PTR DS:[EDX+8], EAX
0042330E  MOV     EAX, DWORD PTR DS:[ECX+C]    ;  EAX=DS:[ECX+C]=007134C0
00423311  MOV     DWORD PTR DS:[EDX+C], EAX
00423314  MOV     CX, WORD PTR DS:[ECX+10]          ;  CX=DS:[ECX+10]=0033
00423318  MOV     WORD PTR DS:[EDX+10], CX
0042331C  MOV     EDX, DWORD PTR DS:[ESI+52C]
00423322  MOV     BYTE PTR DS:[EDX+12], 0
00423326  MOV     EAX, DWORD PTR DS:[ESI+530]      
0042332C  MOV     ECX, DWORD PTR DS:[ESI+528]
00423332  ADD     EAX, 12
00423335  MOV     EDX, DWORD PTR DS:[EAX]          
00423337  MOV     DWORD PTR DS:[ECX], EDX
00423339  MOV     EDX, DWORD PTR DS:[EAX+4]    ;  EDX=DS:[EAX+4]=3A733236
0042333C  MOV     DWORD PTR DS:[ECX+4], EDX
0042333F  MOV     EDX, DWORD PTR DS:[EAX+8]    ;  EDX=DS:[EAX+8]=3275006B
00423342  MOV     DWORD PTR DS:[ECX+8], EDX
00423345  MOV     EDX, DWORD PTR DS:[EAX+C]   ;  EDX=DS:[EAX+C]=3139FA76
00423348  MOV     DWORD PTR DS:[ECX+C], EDX
0042334B  MOV     AX, WORD PTR DS:[EAX+10]     ;  AX=DS:[EAX+10]=3701
0042334F  MOV     WORD PTR DS:[ECX+10], AX
00423353  MOV     ECX, DWORD PTR DS:[ESI+528]  ;  ECX=01260470
00423359  XOR     EAX, EAX
0042335B  MOV     BYTE PTR DS:[ECX+12], 0

;到这里试验码经过用用户名计算的值做指针重新排列

到这里试验码变成 "12x45f7o9rFcBelqdiuk6mg8pnDstjvH3bzAhCaEyGwIJK"

====================================================

第三部分:注册码最后的计算和比较 (fly的功劳)

如果你悔牌超过29次后,会提示你“未注册".就是说你必须悔牌超过29次后 .才会来到这里:

00423490  SUB     ESP, 0C
00423493  PUSH    EBX
00423494  MOV     EBX, ECX
00423496  PUSH    EBP
00423497  XOR     ECX, ECX
00423499  PUSH    ESI
0042349A  MOV     ESI, DWORD PTR DS:[EBX+530]
004234A0  PUSH    EDI
004234A1  MOV     BYTE PTR SS:[ESP+14], CL
004234A5  MOV     BYTE PTR SS:[ESP+15], CL
004234A9  MOV     BYTE PTR SS:[ESP+16], CL
004234AD  MOV     BYTE PTR SS:[ESP+17], CL
004234B1  /MOV     EAX, 38E38E39
004234B6  |MOV     EBP, 47
004234BB  |IMUL    ECX
004234BD  |SAR     EDX, 1
004234BF  |MOV     EAX, EDX
004234C1  |SHR     EAX, 1F
004234C4  |ADD     EDX, EAX
004234C6  |XOR     EAX, EAX
004234C8  |MOV     AL, BYTE PTR DS:[ESI+ECX]  
004234CB  |LEA     EDI, DWORD PTR SS:[ESP+EDX+14>
004234CF  |CDQ
004234D0  |IDIV    EBP
004234D2  |MOV     AL, BYTE PTR DS:[EDI]
004234D4  |ADD     AL, DL
004234D6  |INC     ECX
004234D7  |CMP     ECX, 9
004234DA  |MOV     BYTE PTR DS:[EDI], AL      
004234DC  \JL      SHORT 超级拖拉.004234B1

;以上把试验码重新排列后的字符串的前9位"12x45f7o9"的hex值计算后相加
;  AL =B4

004234DE  MOV     ECX, 9
004234E3  /MOV     EAX, 38E38E39
004234E8  |MOV     EBP, 1D
004234ED  |IMUL    ECX
004234EF  |SAR     EDX, 1
004234F1  |MOV     EAX, EDX
004234F3  |SHR     EAX, 1F
004234F6  |ADD     EDX, EAX
004234F8  |XOR     EAX, EAX
004234FA  |MOV     AL, BYTE PTR DS:[ESI+ECX]    
004234FD  |LEA     EDI, DWORD PTR SS:[ESP+EDX+14>
00423501  |CDQ
00423502  |IDIV    EBP
00423504  |MOV     AL, BYTE PTR DS:[EDI]
00423506  |ADD     AL, DL
00423508  |INC     ECX
00423509  |CMP     ECX, 12
0042350C  |MOV     BYTE PTR DS:[EDI], AL         ;  EAX=8B
0042350E  \JL      SHORT 超级拖拉.004234E3

;以上把试验码重新排列后的字符串的第10-18位"rFcBelqdi"的hex值计算后相加
;  AL =8B

00423510  MOV     ECX, 12
00423515  /MOV     EAX, 38E38E39
0042351A  |MOV     EBP, 2F
0042351F  |IMUL    ECX
00423521  |SAR     EDX, 1
00423523  |MOV     EAX, EDX
00423525  |SHR     EAX, 1F
00423528  |ADD     EDX, EAX
0042352A  |XOR     EAX, EAX
0042352C  |MOV     AL, BYTE PTR DS:[ESI+ECX]
0042352F  |LEA     EDI, DWORD PTR SS:[ESP+EDX+14>
00423533  |CDQ
00423534  |IDIV    EBP
00423536  |MOV     AL, BYTE PTR DS:[EDI]
00423538  |ADD     AL, DL
0042353A  |INC     ECX
0042353B  |CMP     ECX, 1B
0042353E  |MOV     BYTE PTR DS:[EDI], AL
00423540  \JL      SHORT 超级拖拉.00423515       ;  EAX=95

;以上把试验码重新排列后的字符串的第19-27位"uk6mg8pnD"的hex值计算后相加
;  AL =95

00423542  MOV     ECX, 1B
00423547  /MOV     EAX, 38E38E39
0042354C  |MOV     EBP, 11
00423551  |IMUL    ECX
00423553  |SAR     EDX, 1
00423555  |MOV     EAX, EDX
00423557  |SHR     EAX, 1F
0042355A  |ADD     EDX, EAX
0042355C  |XOR     EAX, EAX
0042355E  |MOV     AL, BYTE PTR DS:[ESI+ECX]
00423561  |LEA     EDI, DWORD PTR SS:[ESP+EDX+14>
00423565  |CDQ
00423566  |IDIV    EBP
00423568  |MOV     AL, BYTE PTR DS:[EDI]
0042356A  |ADD     AL, DL
0042356C  |INC     ECX
0042356D  |CMP     ECX, 24
00423570  |MOV     BYTE PTR DS:[EDI], AL
00423572  \JL      SHORT 超级拖拉.00423547       ;  EAX=45

;以上把试验码重新排列后的字符串的第28-36位"stjvH3bzA"的hex值计算后相加
;  AL =45

00423574  MOV     EDX, DWORD PTR SS:[ESP+14]  ;  EDX=518397B4
00423578  LEA     ECX, DWORD PTR SS:[ESP+12]  ;  ECX=0012EEA6
0042357C  PUSH    ECX
0042357D  PUSH    EDX
0042357E  CALL    超级拖拉.00422FF0           ;  用上面ECX值计算二组值
00423583  MOV     EAX, DWORD PTR DS:[EBX+530] ;  EAX<==DS:[EBX+530]=01260490,
00423589  MOV     CX, WORD PTR SS:[ESP+1A]    ;  CX<== SS:[12EEA6]=4234
0042358E  ADD     ESP, 8
00423591  CMP     CL, BYTE PTR DS:[EAX+24]    ;  第37位=CL  
00423594  JNZ     超级拖拉.0042361E
0042359A  CMP     CH, BYTE PTR DS:[EAX+25]    ;  第38位=CH
0042359D  JNZ     SHORT 超级拖拉.0042361E
0042359F  MOV     ECX, DWORD PTR SS:[ESP+15]   ;  ECX=9A518397
004235A3  LEA     EAX, DWORD PTR SS:[ESP+12]
004235A7  PUSH    EAX
004235A8  PUSH    ECX
004235A9  CALL    超级拖拉.00422FF0             ;  用上面ECX值计算二组值
004235AE  MOV     EAX, DWORD PTR DS:[EBX+530]
004235B4  MOV     CX, WORD PTR SS:[ESP+1A]     ;  CX=3937
004235B9  ADD     ESP, 8
004235BC  CMP     CL, BYTE PTR DS:[EAX+26]     ;  第39位=CL
004235BF  JNZ     SHORT 超级拖拉.0042361E
004235C1  CMP     CH, BYTE PTR DS:[EAX+27]     ;  第40位=CH
004235C4  JNZ     SHORT 超级拖拉.0042361E
004235C6  MOV     EAX, DWORD PTR SS:[ESP+16]   ;  EAX=029A5183
004235CA  LEA     EDX, DWORD PTR SS:[ESP+12]
004235CE  PUSH    EDX
004235CF  PUSH    EAX
004235D0  CALL    超级拖拉.00422FF0             ;  用上面EAX值计算二组值
004235D5  MOV     EAX, DWORD PTR DS:[EBX+530]
004235DB  MOV     CX, WORD PTR SS:[ESP+1A]     ;  CX=3833
004235E0  ADD     ESP, 8
004235E3  CMP     CL, BYTE PTR DS:[EAX+28]     ;  第41位=CL
004235E6  JNZ     SHORT 超级拖拉.0042361E
004235E8  CMP     CH, BYTE PTR DS:[EAX+29]     ;  第42位=CH
004235EB  JNZ     SHORT 超级拖拉.0042361E
004235ED  MOV     EDX, DWORD PTR SS:[ESP+17]   ;  EDX=45029A51
004235F1  LEA     ECX, DWORD PTR SS:[ESP+12]
004235F5  PUSH    ECX
004235F6  PUSH    EDX
004235F7  CALL    超级拖拉.00422FF0            ;  用上面EDX值计算二组值
004235FC  MOV     EAX, DWORD PTR DS:[EBX+530]
00423602  MOV     CX, WORD PTR SS:[ESP+1A]     ;  CX=3531
00423607  ADD     ESP, 8
0042360A  CMP     CL, BYTE PTR DS:[EAX+2A]     ;  第43位=CL
0042360D  JNZ     SHORT 超级拖拉.0042361E
0042360F  CMP     CH, BYTE PTR DS:[EAX+2B]     ;  第44位=CH
00423612  JNZ     SHORT 超级拖拉.0042361E
00423614  POP     EDI
00423615  POP     ESI
00423616  POP     EBP
00423617  MOV     AL, 1   <==赋注册成功标记
00423619  POP     EBX
0042361A  ADD     ESP, 0C
0042361D  RETN
0042361E  POP     EDI
0042361F  POP     ESI
00423620  POP     EBP
00423621  XOR     AL, AL  <==赋注册失败标记
00423623  POP     EBX
00423624  ADD     ESP, 0C
00423627  RETN


===============================

总结: 条件注册码必须有46位长

1. 把注册码按照软件固定的顺序重新排列
2. 用用户名计算的值做易位的指针再次排列
3. 把排列后的字符串前36位计算出一组八位的值
 然后用这个值计算出第37-44位的正确值

一组可用的注册码
        用户名: fxyang
        注册码: 1234567897bcdefg4ijklmnopqrstuv1x3zABBD9F8H5JK
     
                                              Cracked  fly[OCN]
                                                       fxyang[OCN]

                                                        2003.3.31