`

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

 
阅读更多

【文章作者】: BeyondMe

【作者邮箱】: futuring@126.com

【作者主页】: 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, 转载请注明作者并保持文章的完整, 谢谢!

分享到:
评论

相关推荐

    Easy Audio CD Burner破解版

    Easy Audio CD Burner破解版Easy Audio CD Burner破解版

    MP3 AVI MPEG WMV RM To Audio CD Burner v1.2.35

    MP3 AVI MPEG WMV RM To Audio CD Burner MP3/AVI/MPEG/WMV/RM to Audio CD Burner 是一个快的和高质量的CD转制工具,能高质量地将将音频文件和视频文件转换为CD。支持 mp3/wav/wma/ogg/ac3, avi/divx/xivd, mpeg/...

    Audio CD Burner Studio 光盘刻录软件 v6.0官方版

    为您提供Audio CD Burner Studio 光盘刻录软件下载,Audio CD Burner Studio是一款帮助用户刻录音频光盘的刻录软件,用户用户只需要简单的几次蒂娜及就足以从你的MP3、WMA或wav文件中创建一张音频光盘,十分方便实用...

    最简单的刻录软件Easy DVD CD Burner

    Easy DVD CD Burner 绿色版 最简单的刻录软件。点击软件以后重启一次即可使用

    Easy DVD CD Burner.rar

    Easy DVD/CD Burner is a simple and easy-to-use DVD & CD burning software for Windows. With this burning program you can create high-quality data DVDs and CDs, containing your files and directories.

    CD Burner 磁盘刻录

    CD Burner, 用于电脑磁盘刻录,免费软件,音频、文件、DVD均可刻录,速度快,便捷

    光盘刻录软件CD Burner

    一款非常好用的光盘刻录软件,比nero更好用~

    MP3 WAV to CD Burner v1.36

    MP3 WAV to CD Burner用于烧录 CD 光盘:MP3 WAV to CD Burner 支持 MP3 WAV WMA OGG AC3 音频格式。MP3 WAV to CD Burner 支持 650M(74min),700M(80min),730M(83min) 光盘。MP3 WAV to CD Burner 支持所有 CDRs。...

    Easy DVD/CD Burner v3.0.127(七天免费)

    Easy DVD/CD Burner是一款简单易用的DVD和CD备份和刻录软件,可以将以创建可以引导的DVD和CD,可以创建多段光碟,避免飞盘的发生,操作简单支持窗口拖放

    Smart DVD/CD Burner v3.0.104

    对初级用户和专业人士都比较适合的DVD/CD刻录软件,能够制作高质量的音乐CD,数据CD和DVD。功能包括:导入多区段的CD/DVD,将MP3/OGG/WMA/WAV转换为音乐CD,On-the-fly 录制,BURN-Proof保护等

    Easy DVD/CDBurner-v3.101

    很小的 非常好用的 DVD CD刻录软件,与大家分享~~~~~~~

    Ace CD Burner 1.32

    ACE CD Burner 可以帮助你快速的将收藏的音乐刻录为CD,支持BURN-PROOF技术!支持刻录前预先测试功能,支持包括MP3, WMA,WAV,OGG在内的各种常用的音乐格式!同时程序也具有对CD进行抓取音轨的功能!程序内置音频播放器和...

    Magic CD DVD Burner 1.1.7 Source (Retry)

    Magic CD/DVD Burner is developed to fulfill the requirement of Data CD/DVD burning needs in your Delphi/Builder program.Magic CD/DVD Burner Includes all the features required by the developers in such...

    Magic.CD.DVD.Burner.v1.23.1Fix.rar_Magic.CD.DVD.Burner_delphi bu

    Magic.CD.DVD.Burner v1.23 著名DELPHI光盘刻录控件修改版源码,修复原版中几处错误,并增加两个接口便于调用

    Magic CDDVD Burner Pro VCL 1.21 full source ported XE3

    Magic CD/DVD Burner Pro is developed to fulfill the requirement of Data CD/DVD burning needs in your Delphi/Builder program. Magic CD/DVD Burner Includes all the features required by the ...

    Magic.CD.DVD.Burner

    Magic.CD.DVD.Burner for delphi

    Magic CD Burner

    Delphi控件 WINDOWS下刻录控件

    Magic CD DVD Burner VCL 1.23+Source+Examples .rar

    Magic CD DVD Burner VCL 1.23+Source+Examples .rar

    Magic CDDVD Burner Pro 1.21 Full Source

    Magic CDDVD Burner Pro 1.21 支持多刻录,带源代码,DEMO,HELP

    mp3转cd

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

Global site tag (gtag.js) - Google Analytics