HAPPYDOWN的CM入门系列分析到DELPHI算发机
 

标题:HAPPYDOWN的CM入门系列分析到DELPHI算发机
链接:http://www.unpack.cn/viewthread.php?tid=19516
贴者:奈落
日期:2007-11-25 10:14

第一个学习笔记
下断点 MSVBVM60.__vbaStrMove
取消断点返回到反汇编窗口~往上找到这里下断点

004023BC    6A 01           PUSH 1
004023BE    FF15 2C104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaOnEr>; MSVBVM60.__vbaOnError
004023C4    8B16            MOV EDX,DWORD PTR DS:[ESI]
004023C6    56              PUSH ESI
004023C7    FF92 04030000   CALL DWORD PTR DS:[EDX+304]
004023CD    50              PUSH EAX
004023CE    8D45 C4         LEA EAX,DWORD PTR SS:[EBP-3C]
004023D1    50              PUSH EAX
004023D2    FF15 30104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjS>; MSVBVM60.__vbaObjSet
004023D8    8BF8            MOV EDI,EAX
004023DA    8B0F            MOV ECX,DWORD PTR DS:[EDI]
004023DC    8D55 C8         LEA EDX,DWORD PTR SS:[EBP-38]
004023DF    52              PUSH EDX
004023E0    57              PUSH EDI
004023E1    FF91 A0000000   CALL DWORD PTR DS:[ECX+A0]
004023E7    DBE2            FCLEX
004023E9    3BC3            CMP EAX,EBX
004023EB    7D 12           JGE SHORT KeyGenMe.004023FF
004023ED    68 A0000000     PUSH 0A0
004023F2    68 401C4000     PUSH KeyGenMe.00401C40
004023F7    57              PUSH EDI
004023F8    50              PUSH EAX
004023F9    FF15 20104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaHres>; MSVBVM60.__vbaHresultCheckObj
004023FF    8B55 C8         MOV EDX,DWORD PTR SS:[EBP-38]
00402402    895D C8         MOV DWORD PTR SS:[EBP-38],EBX
00402405    8D4D CC         LEA ECX,DWORD PTR SS:[EBP-34]
00402408    8B3D A0104000   MOV EDI,DWORD PTR DS:[<&MSVBVM60.__vbaS>; MSVBVM60.__vbaStrMove
0040240E    FFD7            CALL EDI                                ; <&MSVBVM60.__vbaStrMove>
00402410    8D4D C4         LEA ECX,DWORD PTR SS:[EBP-3C]
00402413    FF15 B0104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeObj
00402419    8B45 CC         MOV EAX,DWORD PTR SS:[EBP-34]
0040241C    50              PUSH EAX
0040241D    FF15 08104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenB>; 取用户名长度
00402423    8BC8            MOV ECX,EAX
00402425    FF15 50104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaI2I4>; MSVBVM60.__vbaI2I4
0040242B    8945 D0         MOV DWORD PTR SS:[EBP-30],EAX
0040242E    66:3D 0300      CMP AX,3
00402432    0F8C CD010000   JL KeyGenMe.00402605                    ; 跳就死`用户名要大于3
00402438    8B0E            MOV ECX,DWORD PTR DS:[ESI]
0040243A    56              PUSH ESI
0040243B    FF91 0C030000   CALL DWORD PTR DS:[ECX+30C]
00402441    50              PUSH EAX
00402442    8D55 C4         LEA EDX,DWORD PTR SS:[EBP-3C]
00402445    52              PUSH EDX
00402446    FF15 30104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjS>; MSVBVM60.__vbaObjSet
0040244C    8BF0            MOV ESI,EAX
0040244E    8B06            MOV EAX,DWORD PTR DS:[ESI]
00402450    8D4D C8         LEA ECX,DWORD PTR SS:[EBP-38]
00402453    51              PUSH ECX
00402454    56              PUSH ESI
00402455    FF90 A0000000   CALL DWORD PTR DS:[EAX+A0]
0040245B    DBE2            FCLEX
0040245D    3BC3            CMP EAX,EBX
0040245F    7D 12           JGE SHORT KeyGenMe.00402473
00402461    68 A0000000     PUSH 0A0
00402466    68 401C4000     PUSH KeyGenMe.00401C40
0040246B    56              PUSH ESI
0040246C    50              PUSH EAX
0040246D    FF15 20104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaHres>; MSVBVM60.__vbaHresultCheckObj
00402473    8B55 C8         MOV EDX,DWORD PTR SS:[EBP-38]
00402476    895D C8         MOV DWORD PTR SS:[EBP-38],EBX
00402479    8D4D DC         LEA ECX,DWORD PTR SS:[EBP-24]
0040247C    FFD7            CALL EDI
0040247E    8D4D C4         LEA ECX,DWORD PTR SS:[EBP-3C]
00402481    FF15 B0104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeObj
00402487    8B55 DC         MOV EDX,DWORD PTR SS:[EBP-24]
0040248A    52              PUSH EDX
0040248B    FF15 08104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenB>; 去试验码位数
00402491    8BC8            MOV ECX,EAX
00402493    FF15 50104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaI2I4>; MSVBVM60.__vbaI2I4
00402499    66:3BC3         CMP AX,BX                               ; 判断实验码是否为空
0040249C    0F84 63010000   JE KeyGenMe.00402605
004024A2    BF 01000000     MOV EDI,1
004024A7    8BF7            MOV ESI,EDI
004024A9    8B1D 0C104000   MOV EBX,DWORD PTR DS:[<&MSVBVM60.__vbaF>; MSVBVM60.__vbaFreeVarList
004024AF    66:3B75 D0      CMP SI,WORD PTR SS:[EBP-30]
004024B3    0F8F 93000000   JG KeyGenMe.0040254C
004024B9    C745 BC 0100000>MOV DWORD PTR SS:[EBP-44],1
004024C0    C745 B4 0200000>MOV DWORD PTR SS:[EBP-4C],2
004024C7    8D45 CC         LEA EAX,DWORD PTR SS:[EBP-34]
004024CA    8985 7CFFFFFF   MOV DWORD PTR SS:[EBP-84],EAX
004024D0    C785 74FFFFFF 0>MOV DWORD PTR SS:[EBP-8C],4008
004024DA    8D4D B4         LEA ECX,DWORD PTR SS:[EBP-4C]
004024DD    51              PUSH ECX
004024DE    0FBFD6          MOVSX EDX,SI
004024E1    52              PUSH EDX
004024E2    8D85 74FFFFFF   LEA EAX,DWORD PTR SS:[EBP-8C]
004024E8    50              PUSH EAX
004024E9    8D4D A4         LEA ECX,DWORD PTR SS:[EBP-5C]
004024EC    51              PUSH ECX
004024ED    FF15 44104000   CALL DWORD PTR DS:[<&MSVBVM60.#632>]    ; MSVBVM60.rtcMidCharVar
004024F3    8D55 A4         LEA EDX,DWORD PTR SS:[EBP-5C]
004024F6    52              PUSH EDX
004024F7    8D45 C8         LEA EAX,DWORD PTR SS:[EBP-38]
004024FA    50              PUSH EAX
004024FB    FF15 74104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrV>; MSVBVM60.__vbaStrVarVal
00402501    50              PUSH EAX
00402502    FF15 18104000   CALL DWORD PTR DS:[<&MSVBVM60.#516>]    ; 取用户名ASCII码
00402508    66:0FAFC6       IMUL AX,SI                              ; 用户名ASCII码与相应的位数相乘
0040250C    0F80 5F010000   JO KeyGenMe.00402671
00402512    0FBFC8          MOVSX ECX,AX
00402515    03CF            ADD ECX,EDI                             ; 用户名ASCII累积和放ECX,EDX初为1
00402517    0F80 54010000   JO KeyGenMe.00402671
0040251D    8BF9            MOV EDI,ECX                             ; 最终累积和放EDI
0040251F    8D4D C8         LEA ECX,DWORD PTR SS:[EBP-38]
00402522    FF15 B4104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeStr
00402528    8D55 A4         LEA EDX,DWORD PTR SS:[EBP-5C]
0040252B    52              PUSH EDX
0040252C    8D45 B4         LEA EAX,DWORD PTR SS:[EBP-4C]
0040252F    50              PUSH EAX
00402530    6A 02           PUSH 2
00402532    FFD3            CALL EBX
00402534    83C4 0C         ADD ESP,0C
00402537    B8 01000000     MOV EAX,1
0040253C    66:03C6         ADD AX,SI
0040253F    0F80 2C010000   JO KeyGenMe.00402671
00402545    8BF0            MOV ESI,EAX
00402547  ^ E9 63FFFFFF     JMP KeyGenMe.004024AF
0040254C    69FF 96740100   IMUL EDI,EDI,17496                      ; 累积和与十六进制17496相成放EDI为真码的十六进制
00402552    0F80 19010000   JO KeyGenMe.00402671
00402558    897D D8         MOV DWORD PTR SS:[EBP-28],EDI
0040255B    DB45 D8         FILD DWORD PTR SS:[EBP-28]
0040255E    DD9D 14FFFFFF   FSTP QWORD PTR SS:[EBP-EC]
00402564    8B4D DC         MOV ECX,DWORD PTR SS:[EBP-24]
00402567    51              PUSH ECX
00402568    FF15 80104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8St>; MSVBVM60.__vbaR8Str
0040256E    DC9D 14FFFFFF   FCOMP QWORD PTR SS:[EBP-EC]               真码比较
00402574    DFE0            FSTSW AX
00402576    F6C4 40         TEST AH,40
00402579    0F84 86000000   JE KeyGenMe.00402605                    ; 关键跳~此处可以爆破
0040257F    B9 04000280     MOV ECX,80020004
00402584    894D 8C         MOV DWORD PTR SS:[EBP-74],ECX
00402587    B8 0A000000     MOV EAX,0A

算法总结:1,取用户名ASCII累加~再加初始值一
         2,与十六进制17496十进制相乘就是注册码
我们再来做算法注册机
var
  name:string;
s2:longword;
  i:integer;
begin
  name:=edit1.text;
  s2:=1;
  for i:=1 to length(name) do
    s2:=ord(name) * i + s2;
  s2:=s2 * 95382;
  edit2.text:=inttostr(s2);
end;



第二篇学习笔记
下断点 MSVBVM60.__vbaStrMove
取消断点返回到反汇编窗口~往上找到这里下断点

004023DC    6A 01           PUSH 1
004023DE    FF15 2C104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaOnErr>; MSVBVM60.__vbaOnError
004023E4    8B16            MOV EDX,DWORD PTR DS:[ESI]
004023E6    56              PUSH ESI
004023E7    FF92 14030000   CALL DWORD PTR DS:[EDX+314]
004023ED    50              PUSH EAX
004023EE    8D45 C4         LEA EAX,DWORD PTR SS:[EBP-3C]
004023F1    50              PUSH EAX
004023F2    FF15 30104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSe>; MSVBVM60.__vbaObjSet
004023F8    8BF8            MOV EDI,EAX
004023FA    8B0F            MOV ECX,DWORD PTR DS:[EDI]
004023FC    8D55 C8         LEA EDX,DWORD PTR SS:[EBP-38]
004023FF    52              PUSH EDX
00402400    57              PUSH EDI
00402401    FF91 A0000000   CALL DWORD PTR DS:[ECX+A0]
00402407    DBE2            FCLEX
00402409    3BC3            CMP EAX,EBX
0040240B    7D 12           JGE SHORT KeyGenMe.0040241F
0040240D    68 A0000000     PUSH 0A0
00402412    68 581C4000     PUSH KeyGenMe.00401C58
00402417    57              PUSH EDI
00402418    50              PUSH EAX
00402419    FF15 20104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
0040241F    8B55 C8         MOV EDX,DWORD PTR SS:[EBP-38]
00402422    895D C8         MOV DWORD PTR SS:[EBP-38],EBX
00402425    8D4D CC         LEA ECX,DWORD PTR SS:[EBP-34]
00402428    8B3D A4104000   MOV EDI,DWORD PTR DS:[<&MSVBVM60.__vbaSt>; MSVBVM60.__vbaStrMove
0040242E    FFD7            CALL EDI                                 ; 取用户名; <&MSVBVM60.__vbaStrMove>
00402430    8D4D C4         LEA ECX,DWORD PTR SS:[EBP-3C]
00402433    FF15 B4104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00402439    8B45 CC         MOV EAX,DWORD PTR SS:[EBP-34]
0040243C    50              PUSH EAX
0040243D    FF15 08104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBs>; 取用户名位数
00402443    8BC8            MOV ECX,EAX
00402445    FF15 50104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaI2I4>>; MSVBVM60.__vbaI2I4
0040244B    8945 D0         MOV DWORD PTR SS:[EBP-30],EAX
0040244E    66:3D 0200      CMP AX,2                                 ; 用户名位数与2比较
00402452    0F8C D1010000   JL KeyGenMe.00402629                     ; 小于就跳死
00402458    8B0E            MOV ECX,DWORD PTR DS:[ESI]
0040245A    56              PUSH ESI
0040245B    FF91 0C030000   CALL DWORD PTR DS:[ECX+30C]
00402461    50              PUSH EAX
00402462    8D55 C4         LEA EDX,DWORD PTR SS:[EBP-3C]
00402465    52              PUSH EDX
00402466    FF15 30104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSe>; MSVBVM60.__vbaObjSet
0040246C    8BF0            MOV ESI,EAX
0040246E    8B06            MOV EAX,DWORD PTR DS:[ESI]
00402470    8D4D C8         LEA ECX,DWORD PTR SS:[EBP-38]
00402473    51              PUSH ECX
00402474    56              PUSH ESI
00402475    FF90 A0000000   CALL DWORD PTR DS:[EAX+A0]
0040247B    DBE2            FCLEX
0040247D    3BC3            CMP EAX,EBX
0040247F    7D 12           JGE SHORT KeyGenMe.00402493
00402481    68 A0000000     PUSH 0A0
00402486    68 581C4000     PUSH KeyGenMe.00401C58
0040248B    56              PUSH ESI
0040248C    50              PUSH EAX
0040248D    FF15 20104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
00402493    8B55 C8         MOV EDX,DWORD PTR SS:[EBP-38]
00402496    895D C8         MOV DWORD PTR SS:[EBP-38],EBX
00402499    8D4D DC         LEA ECX,DWORD PTR SS:[EBP-24]
0040249C    FFD7            CALL EDI                                 ; 取试验码
0040249E    8D4D C4         LEA ECX,DWORD PTR SS:[EBP-3C]
004024A1    FF15 B4104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
004024A7    8B55 DC         MOV EDX,DWORD PTR SS:[EBP-24]
004024AA    52              PUSH EDX
004024AB    FF15 08104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBs>; MSVBVM60.__vbaLenBstr
004024B1    8BC8            MOV ECX,EAX                              ; 取试验码位数
004024B3    FF15 50104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaI2I4>>; MSVBVM60.__vbaI2I4
004024B9    66:3BC3         CMP AX,BX
004024BC    0F84 67010000   JE KeyGenMe.00402629
004024C2    BF 01000000     MOV EDI,1
004024C7    8BF7            MOV ESI,EDI
004024C9    8B1D 0C104000   MOV EBX,DWORD PTR DS:[<&MSVBVM60.__vbaFr>; MSVBVM60.__vbaFreeVarList
004024CF    66:3B75 D0      CMP SI,WORD PTR SS:[EBP-30]
004024D3    0F8F 89000000   JG KeyGenMe.00402562
004024D9    C745 BC 0100000>MOV DWORD PTR SS:[EBP-44],1
004024E0    C745 B4 0200000>MOV DWORD PTR SS:[EBP-4C],2
004024E7    8D45 CC         LEA EAX,DWORD PTR SS:[EBP-34]
004024EA    8985 7CFFFFFF   MOV DWORD PTR SS:[EBP-84],EAX
004024F0    C785 74FFFFFF 0>MOV DWORD PTR SS:[EBP-8C],4008
004024FA    8D4D B4         LEA ECX,DWORD PTR SS:[EBP-4C]
004024FD    51              PUSH ECX
004024FE    0FBFD6          MOVSX EDX,SI
00402501    52              PUSH EDX
00402502    8D85 74FFFFFF   LEA EAX,DWORD PTR SS:[EBP-8C]
00402508    50              PUSH EAX
00402509    8D4D A4         LEA ECX,DWORD PTR SS:[EBP-5C]
0040250C    51              PUSH ECX
0040250D    FF15 44104000   CALL DWORD PTR DS:[<&MSVBVM60.#632>]     ; MSVBVM60.rtcMidCharVar
00402513    8D55 A4         LEA EDX,DWORD PTR SS:[EBP-5C]
00402516    52              PUSH EDX
00402517    8D45 C8         LEA EAX,DWORD PTR SS:[EBP-38]
0040251A    50              PUSH EAX
0040251B    FF15 74104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrVa>; MSVBVM60.__vbaStrVarVal
00402521    50              PUSH EAX
00402522    FF15 18104000   CALL DWORD PTR DS:[<&MSVBVM60.#516>]     ; 取用户名ASCII码
00402528    0FBFC8          MOVSX ECX,AX
0040252B    03CF            ADD ECX,EDI                              ; 累积用户名ASCII放ECX~加初值一
0040252D    0F80 62010000   JO KeyGenMe.00402695
00402533    8BF9            MOV EDI,ECX                              ; 累积和还给EDI
00402535    8D4D C8         LEA ECX,DWORD PTR SS:[EBP-38]
00402538    FF15 B8104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
0040253E    8D55 A4         LEA EDX,DWORD PTR SS:[EBP-5C]
00402541    52              PUSH EDX
00402542    8D45 B4         LEA EAX,DWORD PTR SS:[EBP-4C]
00402545    50              PUSH EAX
00402546    6A 02           PUSH 2
00402548    FFD3            CALL EBX
0040254A    83C4 0C         ADD ESP,0C
0040254D    B8 01000000     MOV EAX,1
00402552    66:03C6         ADD AX,SI
00402555    0F80 3A010000   JO KeyGenMe.00402695
0040255B    8BF0            MOV ESI,EAX
0040255D  ^ E9 6DFFFFFF     JMP KeyGenMe.004024CF
00402562    69FF 10030000   IMUL EDI,EDI,310                         ; 累积和与310相乘
00402568    0F80 27010000   JO KeyGenMe.00402695
0040256E    DD05 E8104000   FLD QWORD PTR DS:[4010E8]                ; 固定值26A2F285
00402574    FF15 9C104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFpI4>>; 固定值转换成十六进制
0040257A    33F8            XOR EDI,EAX                              ; 累积和与固定值XOR
0040257C    897D D8         MOV DWORD PTR SS:[EBP-28],EDI
0040257F    DB45 D8         FILD DWORD PTR SS:[EBP-28]
00402582    DD9D 14FFFFFF   FSTP QWORD PTR SS:[EBP-EC]
00402588    8B4D DC         MOV ECX,DWORD PTR SS:[EBP-24]
0040258B    51              PUSH ECX
0040258C    FF15 80104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Str>; MSVBVM60.__vbaR8Str
00402592    DC9D 14FFFFFF   FCOMP QWORD PTR SS:[EBP-EC]              ; 真假码比较
00402598    DFE0            FSTSW AX
0040259A    F6C4 40         TEST AH,40
0040259D    0F84 86000000   JE KeyGenMe.00402629                     ; 关键挑
004025A3    B9 04000280     MOV ECX,80020004
004025A8    894D 8C         MOV DWORD PTR SS:[EBP-74],ECX
004025AB    B8 0A000000     MOV EAX,0A
004025B0    8945 84         MOV DWORD PTR SS:[EBP-7C],EAX
004025B3    894D 9C         MOV DWORD PTR SS:[EBP-64],ECX
004025B6    8945 94         MOV DWORD PTR SS:[EBP-6C],EAX
004025B9    C785 6CFFFFFF 8>MOV DWORD PTR SS:[EBP-94],KeyGenMe.00401>; UNICODE "Congratulations"
算法总结:1,用户名ASCII累积和加初值一
          2,累积和与310相乘
           3,再与固定值XOR  26A2F285 
           4,结果要为十进制  

写算法注册机 var name:string;
    i:integer;
    s1,s2,s3:longword;
begin
name:=edit1.Text;
s1:=1;
if length(name)<2 then exit;
for i:=1 to length(name) do
s1:=s1+ord(name);
s2:=s1*$310;
s3:=S2 Xor $26A2F285;
edit2.text:=inttostr(s3);
end;



第3个学习笔记~
研究这个确实花了点时候~主要是第一次接触密码表~再加上写注册机第一次写~所以老出错调试
现公布于下~
断点和前面两个一样
0040248B    6A 01           PUSH 1
0040248D    FF15 30104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaOnError>]    ; MSVBVM60.__vbaOnError
00402493    BA 7C1C4000     MOV EDX,KeyGenMe.00401C7C                       ; UNICODE "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
00402498    8D4D DC         LEA ECX,DWORD PTR SS:[EBP-24]
0040249B    FF15 90104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCopy>]    ; MSVBVM60.__vbaStrCopy
004024A1    8B16            MOV EDX,DWORD PTR DS:[ESI]
004024A3    56              PUSH ESI
004024A4    FF92 14030000   CALL DWORD PTR DS:[EDX+314]
004024AA    50              PUSH EAX
004024AB    8D45 B4         LEA EAX,DWORD PTR SS:[EBP-4C]
004024AE    50              PUSH EAX
004024AF    FF15 34104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSet>]     ; MSVBVM60.__vbaObjSet
004024B5    8BF8            MOV EDI,EAX
004024B7    8B0F            MOV ECX,DWORD PTR DS:[EDI]
004024B9    8D55 B8         LEA EDX,DWORD PTR SS:[EBP-48]
004024BC    52              PUSH EDX
004024BD    57              PUSH EDI
004024BE    FF91 A0000000   CALL DWORD PTR DS:[ECX+A0]
004024C4    DBE2            FCLEX
004024C6    3BC3            CMP EAX,EBX
004024C8    7D 12           JGE SHORT KeyGenMe.004024DC
004024CA    68 A0000000     PUSH 0A0
004024CF    68 C81C4000     PUSH KeyGenMe.00401CC8
004024D4    57              PUSH EDI
004024D5    50              PUSH EAX
004024D6    FF15 24104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresultCheck>; MSVBVM60.__vbaHresultCheckObj
004024DC    8B55 B8         MOV EDX,DWORD PTR SS:[EBP-48]
004024DF    895D B8         MOV DWORD PTR SS:[EBP-48],EBX
004024E2    8D4D BC         LEA ECX,DWORD PTR SS:[EBP-44]
004024E5    FF15 B0104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrMove>]    ; MSVBVM60.__vbaStrMove
004024EB    8D4D B4         LEA ECX,DWORD PTR SS:[EBP-4C]
004024EE    8B3D C0104000   MOV EDI,DWORD PTR DS:[<&MSVBVM60.__vbaFreeObj>] ; MSVBVM60.__vbaFreeObj
004024F4    FFD7            CALL EDI                                        ; <&MSVBVM60.__vbaFreeObj>
004024F6    8B45 BC         MOV EAX,DWORD PTR SS:[EBP-44]
004024F9    50              PUSH EAX
004024FA    FF15 08104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBstr>]    ; 取用户名位数
00402500    8BC8            MOV ECX,EAX
00402502    FF15 58104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaI2I4>]       ; MSVBVM60.__vbaI2I4
00402508    8945 C4         MOV DWORD PTR SS:[EBP-3C],EAX
0040250B    66:3D 0300      CMP AX,3                                        ; 用户名位数与3比较
0040250F    0F8C C2020000   JL KeyGenMe.004027D7                            ; 小于就跳死
00402515    8B0E            MOV ECX,DWORD PTR DS:[ESI]
00402517    56              PUSH ESI
00402518    FF91 0C030000   CALL DWORD PTR DS:[ECX+30C]
0040251E    50              PUSH EAX
0040251F    8D55 B4         LEA EDX,DWORD PTR SS:[EBP-4C]
00402522    52              PUSH EDX
00402523    FF15 34104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSet>]     ; MSVBVM60.__vbaObjSet
00402529    8BF0            MOV ESI,EAX
0040252B    8B06            MOV EAX,DWORD PTR DS:[ESI]
0040252D    8D4D B8         LEA ECX,DWORD PTR SS:[EBP-48]
00402530    51              PUSH ECX
00402531    56              PUSH ESI
00402532    FF90 A0000000   CALL DWORD PTR DS:[EAX+A0]
00402538    DBE2            FCLEX
0040253A    3BC3            CMP EAX,EBX
0040253C    7D 12           JGE SHORT KeyGenMe.00402550
0040253E    68 A0000000     PUSH 0A0
00402543    68 C81C4000     PUSH KeyGenMe.00401CC8
00402548    56              PUSH ESI
00402549    50              PUSH EAX
0040254A    FF15 24104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresultCheck>; MSVBVM60.__vbaHresultCheckObj
00402550    8B55 B8         MOV EDX,DWORD PTR SS:[EBP-48]
00402553    895D B8         MOV DWORD PTR SS:[EBP-48],EBX
00402556    8D4D D4         LEA ECX,DWORD PTR SS:[EBP-2C]
00402559    FF15 B0104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrMove>]    ; MSVBVM60.__vbaStrMove
0040255F    8D4D B4         LEA ECX,DWORD PTR SS:[EBP-4C]
00402562    FFD7            CALL EDI
00402564    8B55 D4         MOV EDX,DWORD PTR SS:[EBP-2C]
00402567    52              PUSH EDX
00402568    FF15 08104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBstr>]    ; 取试验码位数
0040256E    8BC8            MOV ECX,EAX
00402570    FF15 58104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaI2I4>]       ; MSVBVM60.__vbaI2I4
00402576    66:3BC3         CMP AX,BX                                       ; 检验试验码是否为空
00402579    0F84 58020000   JE KeyGenMe.004027D7
0040257F    BF 01000000     MOV EDI,1
00402584    8BF7            MOV ESI,EDI
00402586    8B1D 10104000   MOV EBX,DWORD PTR DS:[<&MSVBVM60.__vbaFreeVarLi>; MSVBVM60.__vbaFreeVarList
0040258C    66:3B75 C4      CMP SI,WORD PTR SS:[EBP-3C]
00402590    0F8F 93000000   JG KeyGenMe.00402629
00402596    C745 AC 0100000>MOV DWORD PTR SS:[EBP-54],1
0040259D    C745 A4 0200000>MOV DWORD PTR SS:[EBP-5C],2
004025A4    8D45 BC         LEA EAX,DWORD PTR SS:[EBP-44]
004025A7    8985 6CFFFFFF   MOV DWORD PTR SS:[EBP-94],EAX
004025AD    C785 64FFFFFF 0>MOV DWORD PTR SS:[EBP-9C],4008
004025B7    8D4D A4         LEA ECX,DWORD PTR SS:[EBP-5C]
004025BA    51              PUSH ECX
004025BB    0FBFD6          MOVSX EDX,SI
004025BE    52              PUSH EDX
004025BF    8D85 64FFFFFF   LEA EAX,DWORD PTR SS:[EBP-9C]
004025C5    50              PUSH EAX
004025C6    8D4D 94         LEA ECX,DWORD PTR SS:[EBP-6C]
004025C9    51              PUSH ECX
004025CA    FF15 48104000   CALL DWORD PTR DS:[<&MSVBVM60.#632>]            ; MSVBVM60.rtcMidCharVar
004025D0    8D55 94         LEA EDX,DWORD PTR SS:[EBP-6C]
004025D3    52              PUSH EDX
004025D4    8D45 B8         LEA EAX,DWORD PTR SS:[EBP-48]
004025D7    50              PUSH EAX
004025D8    FF15 7C104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrVarVal>]  ; MSVBVM60.__vbaStrVarVal
004025DE    50              PUSH EAX
004025DF    FF15 1C104000   CALL DWORD PTR DS:[<&MSVBVM60.#516>]            ; 取用户名ASCII码
004025E5    66:0FAFC6       IMUL AX,SI                                      ; 用户名ASCII码和相应位置相乘
004025E9    0F80 66020000   JO KeyGenMe.00402855
004025EF    0FBFC8          MOVSX ECX,AX
004025F2    03CF            ADD ECX,EDI                                     ; 累积和加初值一
004025F4    0F80 5B020000   JO KeyGenMe.00402855
004025FA    8BF9            MOV EDI,ECX                                     ; 累积和还给EDI
004025FC    8D4D B8         LEA ECX,DWORD PTR SS:[EBP-48]
004025FF    FF15 C4104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeStr>]    ; MSVBVM60.__vbaFreeStr
00402605    8D55 94         LEA EDX,DWORD PTR SS:[EBP-6C]
00402608    52              PUSH EDX
00402609    8D45 A4         LEA EAX,DWORD PTR SS:[EBP-5C]
0040260C    50              PUSH EAX
0040260D    6A 02           PUSH 2
0040260F    FFD3            CALL EBX
00402611    83C4 0C         ADD ESP,0C
00402614    B8 01000000     MOV EAX,1
00402619    66:03C6         ADD AX,SI
0040261C    0F80 33020000   JO KeyGenMe.00402855
00402622    8BF0            MOV ESI,EAX
00402624  ^ E9 63FFFFFF     JMP KeyGenMe.0040258C
00402629    69FF D5470100   IMUL EDI,EDI,147D5                              ; 累积和与固定值相乘
0040262F    0F80 20020000   JO KeyGenMe.00402855
00402635    8BF7            MOV ESI,EDI
00402637    8975 D0         MOV DWORD PTR SS:[EBP-30],ESI
0040263A    BA DC1C4000     MOV EDX,KeyGenMe.00401CDC
0040263F    8D4D C0         LEA ECX,DWORD PTR SS:[EBP-40]
00402642    FF15 90104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCopy>]    ; MSVBVM60.__vbaStrCopy
00402648    8B3D 0C104000   MOV EDI,DWORD PTR DS:[<&MSVBVM60.__vbaStrVarMov>; MSVBVM60.__vbaStrVarMove
0040264E    8BC6            MOV EAX,ESI
00402650    99              CDQ
00402651    B9 24000000     MOV ECX,24                                      ; ECX得固定值24
00402656    F7F9            IDIV ECX                                        ; 乘积除以固定值,商放EAX`余数放EDX
00402658    8B45 C0         MOV EAX,DWORD PTR SS:[EBP-40]
0040265B    8985 4CFFFFFF   MOV DWORD PTR SS:[EBP-B4],EAX
00402661    C785 44FFFFFF 0>MOV DWORD PTR SS:[EBP-BC],8
0040266B    C745 AC 0100000>MOV DWORD PTR SS:[EBP-54],1
00402672    C745 A4 0200000>MOV DWORD PTR SS:[EBP-5C],2
00402679    8D4D DC         LEA ECX,DWORD PTR SS:[EBP-24]
0040267C    898D 6CFFFFFF   MOV DWORD PTR SS:[EBP-94],ECX
00402682    C785 64FFFFFF 0>MOV DWORD PTR SS:[EBP-9C],4008
0040268C    8D45 A4         LEA EAX,DWORD PTR SS:[EBP-5C]
0040268F    50              PUSH EAX
00402690    83C2 01         ADD EDX,1                                       ; 余数加1
00402693    0F80 BC010000   JO KeyGenMe.00402855
00402699    52              PUSH EDX
0040269A    8D8D 64FFFFFF   LEA ECX,DWORD PTR SS:[EBP-9C]
004026A0    51              PUSH ECX
004026A1    8D55 94         LEA EDX,DWORD PTR SS:[EBP-6C]
004026A4    52              PUSH EDX
004026A5    FF15 48104000   CALL DWORD PTR DS:[<&MSVBVM60.#632>]            ; MSVBVM60.rtcMidCharVar
004026AB    8D85 44FFFFFF   LEA EAX,DWORD PTR SS:[EBP-BC]
004026B1    50              PUSH EAX
004026B2    8D4D 94         LEA ECX,DWORD PTR SS:[EBP-6C]
004026B5    51              PUSH ECX
004026B6    8D55 84         LEA EDX,DWORD PTR SS:[EBP-7C]
004026B9    52              PUSH EDX
004026BA    FF15 A0104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAdd>]     ; MSVBVM60.__vbaVarAdd
004026C0    50              PUSH EAX
004026C1    FFD7            CALL EDI                                        ; 出真码的关键CALL
004026C3    8BD0            MOV EDX,EAX
004026C5    8D4D C0         LEA ECX,DWORD PTR SS:[EBP-40]
004026C8    FF15 B0104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrMove>]    ; MSVBVM60.__vbaStrMove
004026CE    8D45 84         LEA EAX,DWORD PTR SS:[EBP-7C]
004026D1    50              PUSH EAX
004026D2    8D4D 94         LEA ECX,DWORD PTR SS:[EBP-6C]
004026D5    51              PUSH ECX
004026D6    8D55 A4         LEA EDX,DWORD PTR SS:[EBP-5C]
004026D9    52              PUSH EDX
004026DA    6A 03           PUSH 3
004026DC    FFD3            CALL EBX
004026DE    83C4 10         ADD ESP,10
004026E1    DB45 D0         FILD DWORD PTR SS:[EBP-30]                      ; 乘积换成浮点数
004026E4    DD9D 04FFFFFF   FSTP QWORD PTR SS:[EBP-FC]
004026EA    DD85 04FFFFFF   FLD QWORD PTR SS:[EBP-FC]
004026F0    833D 00304000 0>CMP DWORD PTR DS:[403000],0
004026F7    75 08           JNZ SHORT KeyGenMe.00402701
004026F9    DC35 F8104000   FDIV QWORD PTR DS:[4010F8]                      ; 浮点数除以3
004026FF    EB 11           JMP SHORT KeyGenMe.00402712
00402701    FF35 FC104000   PUSH DWORD PTR DS:[4010FC]
00402707    FF35 F8104000   PUSH DWORD PTR DS:[4010F8]
0040270D    E8 22EAFFFF     CALL 
00402712    DFE0            FSTSW AX
00402714    A8 0D           TEST AL,0D
00402716    0F85 34010000   JNZ KeyGenMe.00402850
0040271C    FF15 A8104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFpI4>]       ; 再转换成十六进制
00402722    8BF0            MOV ESI,EAX
00402724    8975 D0         MOV DWORD PTR SS:[EBP-30],ESI
00402727    85F6            TEST ESI,ESI
00402729  ^ 0F8F 1FFFFFFF   JG KeyGenMe.0040264E
0040272F    8B45 C0         MOV EAX,DWORD PTR SS:[EBP-40]                   ; 得到真码
00402732    50              PUSH EAX
00402733    8B4D D4         MOV ECX,DWORD PTR SS:[EBP-2C]
00402736    51              PUSH ECX
00402737    FF15 54104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCmp>]     ; MSVBVM60.__vbaStrCmp
0040273D    85C0            TEST EAX,EAX
0040273F    0F85 92000000   JNZ KeyGenMe.004027D7
00402745    B9 04000280     MOV ECX,80020004
0040274A    898D 7CFFFFFF   MOV DWORD PTR SS:[EBP-84],ECX
00402750    B8 0A000000     MOV EAX,0A
00402755    8985 74FFFFFF   MOV DWORD PTR SS:[EBP-8C],EAX
0040275B    894D 8C         MOV DWORD PTR SS:[EBP-74],ECX
0040275E    8945 84         MOV DWORD PTR SS:[EBP-7C],EAX
00402761    C785 5CFFFFFF 0>MOV DWORD PTR SS:[EBP-A4],KeyGenMe.00401D04     ; UNICODE "Congratulations"
0040276B    BF 08000000     MOV EDI,8
00402770    89BD 54FFFFFF   MOV DWORD PTR SS:[EBP-AC],EDI
00402776    8D95 54FFFFFF   LEA EDX,DWORD PTR SS:[EBP-AC]
0040277C    8D4D 94         LEA ECX,DWORD PTR SS:[EBP-6C]
0040277F    8B35 A4104000   MOV ESI,DWORD PTR DS:[<&MSVBVM60.__vbaVarDup>]  ; MSVBVM60.__vbaVarDup
00402785    FFD6            CALL ESI                                        ; <&MSVBVM60.__vbaVarDup>
00402787    C785 6CFFFFFF E>MOV DWORD PTR SS:[EBP-94],KeyGenMe.00401CE4     ; UNICODE "Good job,man!"
00402791    89BD 64FFFFFF   MOV DWORD PTR SS:[EBP-9C],EDI
算法总结:1,第一个循环
    依次取用户名ASCII码
          ASCII码与相应位置乘积累积和为S1加初值1
          S1=S1*$147D5
2。第2个循环
S1初值=循环前那个与147D5的乘积~
然后取S1除以24的余数加一为N,根据N的值找到密码表的位置~我弄的数组~
然后round(s1/$3)为下一个S1~`这里为四舍五入~记住要再单元里添家Math单元
再就是循环S1除以24的余数加一为N~~~
值到S1为0


算法注册机:
procedure TForm1.Button1Click(Sender: TObject);
var i,n:integer;
    s1:longword;
    name,serial:string;
  const
z:array[1..36] of string=('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');
begin
name:=edit1.Text;
s1:=1;
if length(name)<3 then exit;
for i:=1 to length(name) do
s1:=s1+ord(name)*i;
s1:=s1*$147D5;
while s1<>0 do
for i:=1 to length(inttostr(s1)) do
  begin
   n:=(S1 mod $24)+1;
   serial:=serial+z[n];
   s1:=round(s1/$3);
   end;
edit2.Text:=serial;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

end.


上一篇   下一篇