Easy Audio CD Burner 算法分析及逆向推算(图)

【文章作者】: BeyondMe

【作者邮箱】: [email protected]

【作者主页】: http://hi.baidu.com/beyond0769

【软件名称】: Easy Audio CD Burner 3.8

【下载地址】: http://download.cnet.com/3001-2646_4-10072350.html?spi=34fd547af2d2ef1eddb6d24ebd26f5d0

【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

--------------------------------------------------------------------------------

【详细过程】

这几天有空,连续分析了几个软件,都放上来分享一下,如果能帮到某些破友,那就不枉花了精力。高手飞过 ~~~

软件简介:

Easy Audio CD Burner 可以让您直接将MP3或者WAV轻松创建成高保真的音乐CD,也可以将CD中的音乐直接保存为MP3或者WAV文件。



[详细过程]

PEid查得是Delphi编写,应用上篇破文的办法,用DEDE加载,查得注册按键的事件,并导出MAP文件,然后在OD里加载这个MAP文件,一下子很多

函数都被清晰地分析出来,不用我花力气去打中文了,怎一个爽字了得 :)





004FCC40 >/. 55 PUSH EBP ; <-TfrmReg@BitBtn1Click

004FCC41 |. 8BEC MOV EBP,ESP

……省略N行代码……

004FCC75 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

004FCC78 >|. E8 8773F0FF CALL easycdbu.00404004; ->system.@LStrLen:Integer;< >

004FCC7D |. 85C0 TEST EAX,EAX

004FCC7F |. 75 0F JNZ SHORT easycdbu.004FCC90

004FCC81 |. B8 A0CD4F00 MOV EAX,easycdbu.004FCDA0 ; ASCII "Please enter your registration name!"

004FCC86 >|. E8 91F3F5FF CALL easycdbu.0045C01C; ->dialogs.ShowMessage(AnsiString);

004FCC8B |. E9 C8000000 JMP easycdbu.004FCD58

004FCC90 |> B2 01 MOV DL,1

004FCC92 |. A1 605D4D00 MOV EAX,DWORD PTR DS:[4D5D60]

004FCC97 >|. E8 C491FDFF CALL easycdbu.004D5E60; ->Unit_004D5D00.Proc_004D5E60

004FCC9C |. 8BD8 MOV EBX,EAX

004FCC9E |. BA 01000080 MOV EDX,80000001

004FCCA3 |. 8BC3 MOV EAX,EBX

004FCCA5 >|. E8 5692FDFF CALL easycdbu.004D5F00; ->Unit_004D5D00.Proc_004D5F00

004FCCAA |. B1 01 MOV CL,1

004FCCAC |. BA D0CD4F00 MOV EDX,easycdbu.004FCDD0 ; ASCII "/Software/PGStar/EasyAudioCDBurner/Reg"

004FCCB1 |. 8BC3 MOV EAX,EBX

004FCCB3 >|. E8 AC92FDFF CALL easycdbu.004D5F64; ->Unit_004D5D00.Proc_004D5F64

004FCCB8 |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]

004FCCBB >|. 8B86 00030000 MOV EAX,DWORD PTR DS:[ESI 300]; *TfrmReg.Edit1:TEdit

004FCCC1 >|. E8 6A8AF3FF CALL easycdbu.00435730; ->controls.TControl.GetText(TControl):TCaption;

004FCCC6 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]

004FCCC9 |. BA 00CE4F00 MOV EDX,easycdbu.004FCE00 ; ASCII "Id"

004FCCCE |. 8BC3 MOV EAX,EBX

004FCCD0 >|. E8 2B94FDFF CALL easycdbu.004D6100; ->Unit_004D5D00.Proc_004D6100

004FCCD5 |. 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]

004FCCD8 >|. 8B86 08030000 MOV EAX,DWORD PTR DS:[ESI 308]; *TfrmReg.Edit2:TEdit

004FCCDE >|. E8 4D8AF3FF CALL easycdbu.00435730; ->controls.TControl.GetText(TControl):TCaption;

004FCCE3 |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]

004FCCE6 |. 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]

004FCCE9 >|. E8 3AC4F0FF CALL easycdbu.00409128; ->Unit_004084E0.Proc_00409128

004FCCEE |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]

004FCCF1 |. BA 0CCE4F00 MOV EDX,easycdbu.004FCE0C ; ASCII "PASSWORD"

004FCCF6 |. 8BC3 MOV EAX,EBX

004FCCF8 >|. E8 0394FDFF CALL easycdbu.004D6100; ->Unit_004D5D00.Proc_004D6100

004FCCFD |. 8BC3 MOV EAX,EBX

004FCCFF >|. E8 1863F0FF CALL easycdbu.0040301C; ->system.TObject.Free(TObject);

004FCD04 |. A1 BCA45000 MOV EAX,DWORD PTR DS:[50A4BC]

004FCD09 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

004FCD0B >|. E8 B4600000 CALL easycdbu.00502DC4; 关键算法

004FCD10 |. A1 BCA45000 MOV EAX,DWORD PTR DS:[50A4BC]

004FCD15 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

004FCD17 >|. 8A80 C4040000 MOV AL,BYTE PTR DS:[EAX 4C4] ; 注意[EAX 4C4],经验告诉我,这个是注册标志位

004FCD1D |. 84C0 TEST AL,AL

004FCD1F |. 75 30 JNZ SHORT easycdbu.004FCD51 ; 关键比较及跳转

004FCD21 |. 6A 00 PUSH 0 ; /Arg1 = 00000000

……省略N行代码……

004FCD85 >|. E8 FA6FF0FF CALL easycdbu.00403D84; ->system.@LStrClr(String;String);

004FCD8A /. C3 RETN





------------------

如果还看不明白的话,估计要去复习英文或看Delphi的函数参考了。这里不作做解释了。

进入关键算法看看

004FCD0B >|. E8 B4600000 CALL easycdbu.00502DC4; 关键算法





00502DC4 $ 55 PUSH EBP ; 关键算法过程

00502DC5 . 8BEC MOV EBP,ESP

……省略N行代码……

00502E4D . 64:8920 MOV DWORD PTR FS:[EAX],ESP

00502E50 . BA C8315000 MOV EDX,easycdbu.005031C8 ; ASCII "System"

00502E55 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]

00502E58 . E8 5B33FDFF CALL easycdbu.004D61B8; 这里尝试读取System项的数值,但正常情况下是没有这一项的

00502E5D . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; 因此会引发一个异常。向下跳

00502E60 . 8982 C8040000 MOV DWORD PTR DS:[EDX 4C8],EAX; |

00502E66 . 33C0 XOR EAX,EAX; |

00502E68 . 5A POP EDX ; |

00502E69 . 59 POP ECX ; |

00502E6A . 59 POP ECX ; |

00502E6B . 64:8910 MOV DWORD PTR FS:[EAX],EDX ; |

00502E6E . EB 17 JMP SHORT easycdbu.00502E87 ; ↓

00502E70 .^ E9 5306F0FF JMP easycdbu.004034C8; ← 异常出现后跳到这里,向上执行,然后

00502E75 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 再返回到这里

00502E78 . C780 C8040000>MOV DWORD PTR DS:[EAX 4C8],5

00502E82 . E8 9D09F0FF CALL easycdbu.00403824

00502E87 > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

00502E8A . 8B98 C8040000 MOV EBX,DWORD PTR DS:[EAX 4C8]; EBX = 5

00502E90 . 85DB TEST EBX,EBX; Switch (cases 0..5)

00502E92 . 75 0D JNZ SHORT easycdbu.00502EA1

00502E94 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; Case 0 of switch 00502E90

00502E97 . 33D2 XOR EDX,EDX

00502E99 . 8990 C8040000 MOV DWORD PTR DS:[EAX 4C8],EDX

00502E9F . EB 28 JMP SHORT easycdbu.00502EC9

00502EA1 > 83FB 05 CMP EBX,5

00502EA4 . 74 23 JE SHORT easycdbu.00502EC9

00502EA6 . 83C3 7E ADD EBX,7E ; Default case of switch 00502E90

00502EA9 . 895D EC MOV DWORD PTR SS:[EBP-14],EBX

00502EAC . DB45 EC FILD DWORD PTR SS:[EBP-14] ; EBX浮点入STO

00502EAF . D835 D0315000 FDIV DWORD PTR DS:[5031D0] ; 除以40

00502EB5 . D825 D4315000 FSUB DWORD PTR DS:[5031D4] ; 减去68

00502EBB . E8 D4FBEFFF CALL easycdbu.00402A94; 四舍五入,结果保存在EAX

00502EC0 . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]

00502EC3 . 8982 C8040000 MOV DWORD PTR DS:[EDX 4C8],EAX

00502EC9 > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; Case 5 of switch 00502E90

00502ECC . 83B8 C8040000>CMP DWORD PTR DS:[EAX 4C8],5 ; 和5比较

00502ED3 . 7E 0B JLE SHORT easycdbu.00502EE0 ; 小于等于则跳

00502ED5 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

00502ED8 . 33D2 XOR EDX,EDX

00502EDA . 8990 C8040000 MOV DWORD PTR DS:[EAX 4C8],EDX

00502EE0 > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

00502EE3 . 8B80 C8040000 MOV EAX,DWORD PTR DS:[EAX 4C8]; EAX=5

00502EE9 . 83C0 7E ADD EAX,7E ; EAX=EAX+$7E

00502EEC . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX ; 结果保存在 [EBP-14]

00502EEF . DB45 EC FILD DWORD PTR SS:[EBP-14] ; EAX浮点,入ST0

00502EF2 . D835 D0315000 FDIV DWORD PTR DS:[5031D0] ; 除以40

00502EF8 . D825 D4315000 FSUB DWORD PTR DS:[5031D4] ; 减去68

00502EFE . E8 9DFBEFFF CALL easycdbu.00402AA0; 四舍五入,结果保存在EAX

00502F03 . 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX

00502F06 . 8955 E8 MOV DWORD PTR SS:[EBP-18],EDX

00502F09 . DF6D E4 FILD QWORD PTR SS:[EBP-1C] ; EAX浮点入ST0

00502F0C . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

00502F0F . 8B80 C8040000 MOV EAX,DWORD PTR DS:[EAX 4C8]; EAX=注册表System项的值

00502F15 . 83C0 7E ADD EAX,7E ; EAX=EAX+$7E

00502F18 . 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX ; 结果保存在 [EBP-20]

00502F1B . DB45 E0 FILD DWORD PTR SS:[EBP-20] ; EAX浮点,入ST0

00502F1E . D835 D0315000 FDIV DWORD PTR DS:[5031D0] ; 除以40

00502F24 . D825 D4315000 FSUB DWORD PTR DS:[5031D4] ; 减去68

00502F2A . DED9 FCOMPP ; 双出栈

00502F2C . DFE0 FSTSW AX ; AX读入FST寄存器值

00502F2E . 9E SAHF

00502F2F . 76 0B JBE SHORT easycdbu.00502F3C ; 大于等于0则跳走

00502F31 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 这个跳转总是能实现的

00502F34 . 33D2 XOR EDX,EDX

00502F36 . 8990 C8040000 MOV DWORD PTR DS:[EAX 4C8],EDX

00502F3C > 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]

00502F3F . E8 D800F0FF CALL easycdbu.0040301C

00502F44 . 33C0 XOR EAX,EAX

00502F46 . 55 PUSH EBP

00502F47 . 68 09315000 PUSH easycdbu.00503109

00502F4C . 64:FF30 PUSH DWORD PTR FS:[EAX]

00502F4F . 64:8920 MOV DWORD PTR FS:[EAX],ESP

00502F52 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

00502F55 . C680 C4040000>MOV BYTE PTR DS:[EAX 4C4],0 ; 初始化注册标志位为0

00502F5C . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]

00502F5F . 50 PUSH EAX

00502F60 . B9 03000000 MOV ECX,3

00502F65 . BA 01000000 MOV EDX,1

00502F6A . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]

00502F6D . E8 9A12F0FF CALL easycdbu.0040420C; EAX = Copy(Sn,1,3)

00502F72 . 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24]

00502F75 . E8 7668F0FF CALL easycdbu.004097F0; StrtoInt(EAX)

00502F7A . 8BF0 MOV ESI,EAX; ESI返回结果

00502F7C . 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]

00502F7F . 50 PUSH EAX

00502F80 . B9 04000000 MOV ECX,4

00502F85 . BA 04000000 MOV EDX,4

00502F8A . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]

00502F8D . E8 7A12F0FF CALL easycdbu.0040420C; EAX = Copy(Sn,4,4)

00502F92 . 8B45 D8 MOV EAX,DWORD PTR SS:[EBP-28]

00502F95 . E8 5668F0FF CALL easycdbu.004097F0; StrtoInt(EAX)

00502F9A . 8BD8 MOV EBX,EAX; EBX返回结果

00502F9C . 8D0433 LEA EAX,DWORD PTR DS:[EBX ESI]; 以上两个结果相加,结果入EAX

00502F9F . 03C0 ADD EAX,EAX; EAX = EAX * 2

00502FA1 . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX

00502FA4 . DB45 EC FILD DWORD PTR SS:[EBP-14]

00502FA7 . D835 D8315000 FDIV DWORD PTR DS:[5031D8] ; EAX 除以 4

00502FAD . D805 DC315000 FADD DWORD PTR DS:[5031DC] ; 加上 10

00502FB3 . D805 E0315000 FADD DWORD PTR DS:[5031E0] ; 加上 28.87500 ,结果记入ST1

00502FB9 . DB2D E4315000 FLD TBYTE PTR DS:[5031E4] ; ST0 = 6.9000

00502FBF . DEC9 FMULP ST(1),ST; ST0 * ST1

00502FC1 . E8 CEFAEFFF CALL easycdbu.00402A94; 把结果四舍五入

00502FC6 . 8BF0 MOV ESI,EAX; 结果入ESI, 记为 R1

00502FC8 . 8D041E LEA EAX,DWORD PTR DS:[ESI EBX]; EAX = ESI EBX

00502FCB . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX

00502FCE . DB45 EC FILD DWORD PTR SS:[EBP-14]

00502FD1 . DB2D F0315000 FLD TBYTE PTR DS:[5031F0] ; ST0 = 0.8300000, ST1 = EAX

00502FD7 . DEC9 FMULP ST(1),ST; ST0 * ST1

00502FD9 . D805 FC315000 FADD DWORD PTR DS:[5031FC] ; 加上23

00502FDF . DB2D 00325000 FLD TBYTE PTR DS:[503200] ; ST0 = 7.9000

00502FE5 . DEC9 FMULP ST(1),ST; ST0 * ST1

00502FE7 . E8 A8FAEFFF CALL easycdbu.00402A94; 把结果四舍五入

00502FEC . 8BD8 MOV EBX,EAX; 结果记为 R2

00502FEE . 8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C]

00502FF1 . 50 PUSH EAX

00502FF2 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]

00502FF5 . E8 0A10F0FF CALL easycdbu.00404004; EAX=Length(Sn);

00502FFA . 8BC8 MOV ECX,EAX

00502FFC . BA 08000000 MOV EDX,8

00503001 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]

00503004 . E8 0312F0FF CALL easycdbu.0040420C; Copy(Sn,8,Length(Sn));

00503009 . 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C]

0050300C . 50 PUSH EAX

0050300D . 8D4D D0 LEA ECX,DWORD PTR SS:[EBP-30]

00503010 . BA 04000000 MOV EDX,4

00503015 . 8BC6 MOV EAX,ESI

00503017 . E8 5867F0FF CALL easycdbu.00409774; Format函数把R1转换成十六进制格式字符串

0050301C . 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30]

0050301F . 50 PUSH EAX

00503020 . 8D55 CC LEA EDX,DWORD PTR SS:[EBP-34]

00503023 . 8BC3 MOV EAX,EBX

00503025 . E8 E666F0FF CALL easycdbu.00409710; Forma函数把R2转换成十进制格式字符串

0050302A . 8B55 CC MOV EDX,DWORD PTR SS:[EBP-34]

0050302D . 58 POP EAX

0050302E . E8 D90FF0FF CALL easycdbu.0040400C; 两个字符串合并 

00503033 . 8B55 D0 MOV EDX,DWORD PTR SS:[EBP-30] ; 结果送入EDX,记为R3

00503036 . 58 POP EAX ; EAX = Copy(Sn,8,Length(Sn));

00503037 . E8 D810F0FF CALL easycdbu.00404114; R3和EAX进行比较,相等则通过

0050303C . 0F94C0 SETE AL

0050303F . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]

00503042 8882 C4040000 MOV BYTE PTR DS:[EDX 4C4],AL ; [EAX 4C4]为标志位赋值,AL必须等于1才能通过

00503048 8D45 C8 LEA EAX,DWORD PTR SS:[EBP-38]

0050304B 50 PUSH EAX

0050304C B9 01000000 MOV ECX,1

00503051 . BA 01000000 MOV EDX,1

00503056 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; EAX= Sn

00503059 . E8 AE11F0FF CALL easycdbu.0040420C; Copy(Sn,1,1) 读取第1位

0050305E . 8B45 C8 MOV EAX,DWORD PTR SS:[EBP-38] ; 必须=3

00503061 . BA 14325000 MOV EDX,easycdbu.00503214 ; 因为这里指向内存值 $33

00503066 . E8 A910F0FF CALL easycdbu.00404114; 必须要跳

0050306B . 74 0A JE SHORT easycdbu.00503077

0050306D . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

00503070 . C680 C4040000>MOV BYTE PTR DS:[EAX 4C4],0 ; 因为这一句使验证失败

00503077 > 8D45 C4 LEA EAX,DWORD PTR SS:[EBP-3C]

0050307A . 50 PUSH EAX

0050307B . B9 01000000 MOV ECX,1

00503080 . BA 04000000 MOV EDX,4

00503085 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]

00503088 . E8 7F11F0FF CALL easycdbu.0040420C; Copy(Sn,4,1) 即第四位

0050308D . 8B45 C4 MOV EAX,DWORD PTR SS:[EBP-3C] ; 必须=4

00503090 . BA 20325000 MOV EDX,easycdbu.00503220 ; 因为这里指向内存值 $34

00503095 . E8 7A10F0FF CALL easycdbu.00404114

0050309A . 74 0A JE SHORT easycdbu.005030A6 ; 必须要跳

0050309C . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

0050309F . C680 C4040000>MOV BYTE PTR DS:[EAX 4C4],0 ; 因为这一句使验证失败

005030A6 > 33C0 XOR EAX,EAX

005030A8 . 55 PUSH EBP

005030A9 . 68 EB305000 PUSH easycdbu.005030EB

005030AE . 64:FF30 PUSH DWORD PTR FS:[EAX]

005030B1 . 64:8920 MOV DWORD PTR FS:[EAX],ESP

005030B4 . 8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40]

005030B7 . 50 PUSH EAX

005030B8 . B9 02000000 MOV ECX,2

005030BD . BA 02000000 MOV EDX,2

005030C2 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]

005030C5 . E8 4211F0FF CALL easycdbu.0040420C; EAX = Copy(Sn,2,2),即第2和第3位

005030CA . 8B45 C0 MOV EAX,DWORD PTR SS:[EBP-40]

005030CD . E8 1E67F0FF CALL easycdbu.004097F0; InttoStr(EAX)

005030D2 . 83F8 0C CMP EAX,0C ; 必须小于或等于 $0C

005030D5 . 7E 0A JLE SHORT easycdbu.005030E1 ; 必须要跳

005030D7 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

005030DA . C680 C4040000>MOV BYTE PTR DS:[EAX 4C4],0 ; 因为这一句使验证失败

005030E1 > 33C0 XOR EAX,EAX; 运行到这里将通往阳光大道啦……

……省略N行代码……

00503160 . C3 RETN





---------------



这个算法过程看起来很长,但真正涉及到注册码验证过程并不长。注意几个地方。

第一处:

  这个过程一开始会尝试访问注册表"/Software/PGStar/EasyAudioCDBurner/Reg" 下的一个 "System" 项的值但这个值是不存在的,会抛出一个 Exception ,如果不知道其控制权交到哪里,程序总是跟飞掉,于是在其下面狂下断点,才拦截下来。 ------------------------

这个过程简单作笔记记录为:

5 $7E = $83

$83浮点→131.000

131 / 40 - 68 = -64.724999999999994320

双出栈

AX=$120

跳走

----------------------



而真正的算法过程从其之后开始,做一个简单算法验证总结



1、设有假码 Str, 取其前3位和4到7位转化为数值并相加,其和再乘以2,记为 S1

2、( R1 / 4 10 28.87500 ) * 6.9000 结果四舍五入 记为 S2

3、把S1通过Format函数转换成十六进制字符串,记为R1;

  把S2通过Format函数转换成十进制字符串,记为R2;

R1和R2合并起来记为SN

4、然后读取Str第8到最后一位的字符串,再和SN进行比较,相等则通过第一步验证。

5、第二步验证,保证第一位必须等于3

6、第三步验证,保证第四位必须等于4

7、第四步验证,保证第二三位转换成数值后小于或等于12。

如果能通过第四步,则这个注册码被接受。





了解了验证过程,反向推算很简单,

1、根据第二到第四步先得到注册码前7位。

2、根据第1-4点计算得出SN

3、把这两串字符串直接连接,OK



见Delphi完美源代码





function KeyGen: string;

var

Str, SN: string;

S1,S2: Single ;

R1, R2: Integer;

begin

//生成前7信位

Randomize;

Str:= '3' //第一位=3

Format('%.2d',[Random($0C)]) //第二位小于等于12,不足两位前补0

'4' //第三位=4

Format('%.3d',[Random(999)]); // 第四至七位任意0-999。



S1:=(StrtoInt(Copy(Str,1,3)) StrtoInt(Copy(Str,4,4))) * 2 ;

S1:=( S1 / 4 10 28.87500 ) * 6.9000 ;

R1:= Trunc(S1 0.5); //四舍五入;



S2:= (( R1 StrtoInt(Copy(Str,4,4))) * 0.83 23 ) * 7.900 ;

R2:= Trunc(S2 0.5); //四舍五入;



SN:=Format('%.4x',[R1]) Format('%d',[R2]);

Result:= Str SN;

end;





//需要说明的是,慎用Delphi的 Round 函数进行四舍五入,否则你会后悔的,至于什么原因,呵呵,留着大家去研究吧。

最后给几组用这个注册机计算出来的注册码:

(用户名任意)

30341773D6C130673

30941153CAB129001

30849134769152265

30543463FBA135649

30241213CA8129020

3084988486B154448

30341383CE6129538



没有去测试,希望上面几级注册码不要出错,级个面子……



-----------------------

注册成功后信息保存在注册表下面位置。



Windows Registry Editor Version 5.00



[HKEY_CURRENT_USER/Software/PGStar/EasyAudioCDBurner/Reg]

"Id"="BeyondMe"

"PASSWORD"="3064772457B148101"

-----------------------



收工! 下周见



--------------------------------------------------------------------------------

【版权声明】: 本文原创于http://www.unpack.cn, 转载请注明作者并保持文章的完整, 谢谢!

你可能感兴趣的:(其他)