标 题:象棋叁谋
发信人:fxyang
时 间:2003/02/07 10:06pm
详细信息:
注册码的计算过程比较简单,正好用来练习。
注册码的第一个条件是必须九位且必须是数字
0044FD9C
PUSH EBX
0044FD9D PUSH ESI
0044FD9E PUSH EDI
0044FD9F MOV EBX,EDX
0044FDA1
XOR ECX,ECX
0044FDA3 XOR EAX,EAX
0044FDA5 MOV EDX,EBX
0044FDA7
/MOVSX ESI,BYTE PTR DS:[EDX] \
0044FDAA |LEA EDI,DWORD PTR
DS:[EAX+1] |
0044FDAD |INC EAX
|
0044FDAE |IMUL ESI,EDI
}注册码的前八位的ASCII值乘它的位数相加
0044FDB1
|ADD ECX,ESI
|
0044FDB3 |INC EDX
|
0044FDB4 |CMP EAX,8
/
0044FDB7 \JL
SHORT ADVISOR.0044FDA7
0044FDB9 MOV EAX,ECX
0044FDBB MOV EDI,0A
;EDI 赋值
0044FDC0 CDQ
;EDX 清零
0044FDC1 IDIV EDI
;EAX mod EDI ==>值放到 EDX
0044FDC3
MOVSX ESI,BYTE PTR DS:[EBX+8]
0044FDC7 ADD ESI,-30
; 注册码判断的第二个条件:
0044FDCA CMP EDX,ESI
; ascII值加的和 mod A =最后一位
0044FDCC JNZ SHORT ADVISOR.0044FDD5
;如果不同就进行第二次计算:
0044FDCE MOV EAX,1
0044FDD3 JMP
SHORT ADVISOR.0044FE01
0044FDD5 MOV EAX,ECX
0044FDD7 MOV EDI,9 ;EDI 赋值
0044FDDC
CDQ ;EDX 清零
0044FDDD
IDIV EDI ;EAX mod EDI ==>值放到
EDX
0044FDDF CMP ESI,EDX ;ascII值加的和 mod
9 =最后一位
0044FDE1 JNZ SHORT ADVISOR.0044FDEA ;如果不同就进行第三次计算:
0044FDE3
MOV EAX,2
0044FDE8 JMP SHORT ADVISOR.0044FE01
0044FDEA
MOV EAX,ECX
0044FDEC MOV ECX,7 ;EDI
赋值
0044FDF1 CDQ
;EDX 清零
0044FDF2 IDIV ECX ;EAX
mod EDI ==>值放到 EDX
0044FDF4 CMP ESI,EDX
;ascII值加的和 mod 7 =最后一位
0044FDF6 JNZ SHORT ADVISOR.0044FDFF
;死翘翘了
0044FDF8 MOV EAX,3
0044FDFD JMP SHORT ADVISOR.0044FE01
0044FDFF
XOR EAX,EAX
0044FE01 POP EDI
0044FE02 POP ESI
0044FE03
POP EBX
0044FE04 RETN
以上可以看出注册码的第九位可能有三个值,也就是说注册码可能有三个。
********************************************************************************
0044F333
MOV WORD PTR SS:[EBP-88],20
0044F33C XOR ECX,ECX
0044F33E
MOV DWORD PTR SS:[EBP-C],ECX
0044F341 LEA EDX,DWORD PTR SS:[EBP-C]
0044F344
INC DWORD PTR SS:[EBP-7C]
0044F347 MOV EAX,DWORD PTR DS:[EBX+30C]
0044F34D
CALL <JMP.&VCL50.@Controls@TControl@GetT>; 取得软件号 函数
0044F352
CMP DWORD PTR SS:[EBP-C],0
0044F356 JE SHORT ADVISOR.0044F35D
0044F358
MOV ECX,DWORD PTR SS:[EBP-C]
0044F35B JMP SHORT ADVISOR.0044F362
0044F35D
MOV ECX,ADVISOR.004875DB
0044F362 PUSH ECX
; /41000891
0044F363 PUSH ADVISOR.004875D8
; |format = "%s"
0044F368
LEA EAX,DWORD PTR SS:[EBP-AC] ;
|
0044F36E PUSH EAX
; |s
0044F36F
CALL <JMP.&CC3250MT._sprintf>
; \_sprintf
0044F374 ADD ESP,0C
0044F377 DEC DWORD
PTR SS:[EBP-7C]
0044F37A LEA EAX,DWORD PTR SS:[EBP-C]
0044F37D
MOV EDX,2
0044F382 CALL ADVISOR.00466FA4
; 第三个条件:注册码的第四位计算
0044F387 LEA ESI,DWORD PTR SS:[EBP-BC] ;
输入的数字-->ESI
0044F38D MOV AL,BYTE PTR DS:[ESI+3] ;
输入的第四位----->AL
0044F390 ADD AL,4
; ASCII 码 +4
0044F392
CMP AL,BYTE PTR SS:[EBP-AC] ; 第四位=软件号的第一位-4
0044F398
JE SHORT ADVISOR.0044F3C0 ; 如果不是数字就进行以下计算:
0044F39A
MOV AL,64
; 赋值 AL==64
0044F39C SUB AL,BYTE PTR DS:[ESI+3] ;
64-注册码的第四位的ASCII值
0044F39F CMP AL,BYTE PTR SS:[EBP-AC] ;
注册码的第四位=4-软件号的第一位
0044F3A5 JE SHORT ADVISOR.0044F3C0
0044F3A7
MOV EAX,EBX
0044F3A9 CALL ADVISOR.0044FF88
;死翘翘了
0044F3AE MOV EDX,DWORD PTR SS:[EBP-98]
0044F3B4
MOV DWORD PTR FS:[0],EDX
0044F3BB JMP ADVISOR.0044FABE
0044F3C0
MOV AL,BYTE PTR DS:[ESI+4] ; 第四个条件:注册码的第五位计算
0044F3C3
ADD AL,5
; ASCII 码 +5
0044F3C5 CMP AL,BYTE PTR SS:[EBP-AB]
; 第五位=软件号的第二位-5
0044F3CB JE SHORT ADVISOR.0044F3F3
; 如果不是数字就进行以下计算:
0044F3CD MOV AL,65
; 赋值 AL=65
0044F3CF
SUB AL,BYTE PTR DS:[ESI+4] ;
0044F3D2
CMP AL,BYTE PTR SS:[EBP-AB] ;
0044F3D8
JE SHORT ADVISOR.0044F3F3 ; 注册码的第五位=5-软件号的第二位
0044F3DA
MOV EAX,EBX
0044F3DC CALL ADVISOR.0044FF88
;死翘翘了
0044F3E1 MOV EDX,DWORD PTR SS:[EBP-98]
0044F3E7
MOV DWORD PTR FS:[0],EDX
0044F3EE JMP ADVISOR.0044FABE
0044F3F3
MOV AL,BYTE PTR DS:[ESI+1] ; 第五个条件:注册码的第二位计算
0044F3F6
ADD AL,2
; ASCII码+2
0044F3F8 CMP AL,BYTE PTR SS:[EBP-AA]
; 值=软件号的第三位ASCII值
0044F3FE JE SHORT ADVISOR.0044F426
; 注册码的第二位=软件号的第三位-2
0044F400 MOV
AL,62 ;
如果不是数字就进行以下计算:
0044F402 SUB AL,BYTE PTR DS:[ESI+1]
0044F405
CMP AL,BYTE PTR SS:[EBP-AA] ; 注册码的第二位=2-软件号的第三位
0044F40B
JE SHORT ADVISOR.0044F426
0044F40D MOV EAX,EBX
0044F40F
CALL ADVISOR.0044FF88
0044F414 MOV EDX,DWORD PTR
SS:[EBP-98]
0044F41A MOV DWORD PTR FS:[0],EDX
0044F421
JMP ADVISOR.0044FABE
0044F426 MOV AL,BYTE PTR DS:[ESI+7]
; 条件六:注册码的第八位计算
0044F429 ADD AL,8
; ASCII
值+8
0044F42B CMP AL,BYTE PTR SS:[EBP-A9] ; 注册码的第八位=软件号的第四位-8
0044F431
JE SHORT ADVISOR.0044F459 ; 如果不是数字就进行以下计算:
0044F433
MOV AL,68
0044F435 SUB AL,BYTE PTR DS:[ESI+7]
0044F438 CMP AL,BYTE PTR SS:[EBP-A9]
;注册码的第八位=8-软件号的第四位
0044F43E JE SHORT ADVISOR.0044F459
0044F440
MOV EAX,EBX
0044F442 CALL ADVISOR.0044FF88
0044F447
MOV EDX,DWORD PTR SS:[EBP-98]
0044F44D MOV DWORD
PTR FS:[0],EDX
0044F454 JMP ADVISOR.0044FABE
0044F459
MOV AL,BYTE PTR DS:[ESI+6] ; 条件七:注册码的第七位计算
0044F45C
ADD AL,7
0044F45E CMP AL,BYTE PTR SS:[EBP-A8]
; 注册码的第七位=软件号的第五位-7
0044F464 JE SHORT ADVISOR.0044F48C
; 如果不是数字就进行以下计算:
0044F466 MOV AL,67
0044F468
SUB AL,BYTE PTR DS:[ESI+6]
0044F46B CMP AL,BYTE PTR
SS:[EBP-A8] ;注册码的第七位=7-软件号的第五位
0044F471 JE SHORT
ADVISOR.0044F48C
0044F473 MOV EAX,EBX
0044F475 CALL
ADVISOR.0044FF88
0044F47A MOV EDX,DWORD PTR SS:[EBP-98]
0044F480
MOV DWORD PTR FS:[0],EDX
0044F487 JMP ADVISOR.0044FABE
0044F48C
MOV AL,BYTE PTR DS:[ESI] ; 条件八:注册码的第一位计算
0044F48E
INC EAX
0044F48F CMP AL,BYTE PTR SS:[EBP-A7]
; 注册码的第一位=软件号的第六位-1 0044F495 JE SHORT ADVISOR.0044F4BC
; 如果不是数字就进行以下计算:
0044F497 MOV AL,61
0044F499
SUB AL,BYTE PTR DS:[ESI]
0044F49B CMP AL,BYTE PTR
SS:[EBP-A7] ;注册码的第一位=1-软件号的第六位
0044F4A1 JE SHORT ADVISOR.0044F4BC
0044F4A3
MOV EAX,EBX
0044F4A5 CALL ADVISOR.0044FF88
0044F4AA
MOV EDX,DWORD PTR SS:[EBP-98]
0044F4B0 MOV DWORD
PTR FS:[0],EDX
0044F4B7 JMP ADVISOR.0044FABE
0044F4BC
MOV WORD PTR SS:[EBP-88],2C
0044F4C5 LEA EDX,DWORD PTR SS:[EBP-AC]
0044F4CB
LEA EAX,DWORD PTR SS:[EBP-10]
0044F4CE CALL ADVISOR.00466E4C
0044F4D3
INC DWORD PTR SS:[EBP-7C]
0044F4D6 MOV EAX,DWORD
PTR DS:[EAX]
0044F4D8 CALL <JMP.&VCL50.@Sysutils@StrToInt$qqrx>
0044F4DD
MOV EDI,EAX
0044F4DF MOV EAX,EBX
0044F4E1
CALL ADVISOR.0044FC74
0044F4E6 CMP EDI,EAX
0044F4E8
LEA EAX,DWORD PTR SS:[EBP-10]
0044F4EB SETNE DL
0044F4EE
AND EDX,1
0044F4F1 PUSH EDX
; /Arg1
0044F4F2 MOV EDX,2
;
|
0044F4F7 DEC DWORD PTR SS:[EBP-7C]
; |
0044F4FA CALL ADVISOR.00466FA4
; \Advisor.00466FA4
0044F4FF
POP ECX
0044F500 TEST CL,CL
0044F502 JE
SHORT ADVISOR.0044F510
0044F504 MOV EAX,DWORD PTR DS:[<&VCL50.@forms@App>
0044F509
MOV EAX,DWORD PTR DS:[EAX]
0044F50B CALL <JMP.&VCL50.@forms@TApplication@Ter>
0044F510
MOV AL,BYTE PTR DS:[ESI+5] ; 条件九:注册码的第六位计算
0044F513
ADD AL,6
; ASCII值+6
0044F515 CMP AL,BYTE
PTR SS:[EBP-A6] ; 注册码的第六位=软件号的第七位-6
0044F51B
JE SHORT ADVISOR.0044F543 ; 如果不是数字就进行以下计算:
0044F51D MOV AL,66
0044F51F SUB AL,BYTE PTR DS:[ESI+5]
0044F522
CMP AL,BYTE PTR SS:[EBP-A6] ; 注册码的第六位=6-软件号的第七位
0044F528
JE SHORT ADVISOR.0044F543
0044F52A MOV EAX,EBX
0044F52C
CALL ADVISOR.0044FF88
0044F531 MOV EDX,DWORD PTR
SS:[EBP-98]
0044F537 MOV DWORD PTR FS:[0],EDX
0044F53E
JMP ADVISOR.0044FABE
0044F543 MOV AL,BYTE PTR DS:[ESI+2]
; 条件十:注册码的第三位计算
0044F546 ADD AL,3
; ASCII 值+3
0044F548 CMP AL,BYTE PTR SS:[EBP-A5]
; 注册码的第三位=软件号的第八位-3
0044F54E JE SHORT ADVISOR.0044F576
; 如果不是数字就进行以下计算:
0044F550 MOV
AL,63
0044F552 SUB AL,BYTE PTR DS:[ESI+2]
0044F555 CMP
AL,BYTE PTR SS:[EBP-A5] ; 注册码的第三位=3-软件号的第八位
0044F55B
JE SHORT ADVISOR.0044F576
0044F55D MOV EAX,EBX
0044F55F
CALL ADVISOR.0044FF88
0044F564 MOV EDX,DWORD PTR
SS:[EBP-98]
0044F56A MOV DWORD PTR FS:[0],EDX
0044F571
JMP ADVISOR.0044FABE
0044F576 MOV DL,1
0044F578
MOV EAX,DWORD PTR DS:[<&VCL50.@Registry@>
0044F57D CALL
<JMP.&VCL50.@Registry@TRegistry@$bc>
0044F582 MOV DWORD
PTR SS:[EBP-9C],EAX
0044F588 MOV EDX,80000001
0044F58D
MOV EAX,DWORD PTR SS:[EBP-9C]
0044F593 CALL ADVISOR.00466E3C
0044F598
MOV WORD PTR SS:[EBP-88],38
0044F5A1 MOV WORD PTR
SS:[EBP-88],44
0044F5AA MOV EDX,ADVISOR.004875DC
; ASCII "\Software\Chess Advisor"
0044F5AF
LEA EAX,DWORD PTR SS:[EBP-14]
0044F5B2 CALL ADVISOR.00466E4C
0044F5B7
INC DWORD PTR SS:[EBP-7C]
0044F5BA MOV EDX,DWORD
PTR DS:[EAX]
0044F5BC MOV CL,1
================================================================================
以上总结:注册码的计算过程如下
注册码长度为 9 且必须是数字
设软件序列号为: ABCDEFGH
软件注册码为:abcdefghi
1: a=F-1 or a=1-F
2: b=C-2 or b=2-C
3:
c=H-3 or c=3-H
4: d=A-4
or d=4-A
5: e=B-5 or
e=5-B
6: f=G-6 or f=6-G
7: g=E-7 or g=7-E
8: h=D-8 or h=8-D
9: i= ("a"+"b"*2+"c"*3+"d"*4+"e"*5+"f"*6+"g"*7)
mod A
or i= ("a"+"b"*2+"c"*3+"d"*4+"e"*5+"f"*6+"g"*7)
mod 9
or i= ("a"+"b"*2+"c"*3+"d"*4+"e"*5+"f"*6+"g"*7)
mod 7
fxyang
2003.2.7