• 标 题:象棋叁谋
  • 作 者:fxyang
  • 时 间:2003/02/07 10:06pm 
  • 链 接:http://bbs.pediy.com

注册码的计算过程比较简单,正好用来练习。


注册码的第一个条件是必须九位且必须是数字
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