超级拖拉机
超级拖拉机是一个四副牌的拖拉机游戏,在全国范围都有广泛使用。
游戏有多种设定以适应不同地方的规则。游戏支持单人玩,也支网络
多人一起玩。最新版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
;
//这里把注册表中加密的注册信息还原成原来的试验码 ;
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
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