- 浏览: 1650522 次
- 性别:
文章分类
- 全部博客 (2929)
- 非技术 (18)
- Eclipse (11)
- JAVA (31)
- 正则表达式 (0)
- J2EE (4)
- DOS命令 (2)
- WEB前端 (52)
- JavaScript (69)
- 数据库 (8)
- 设计模式 (0)
- JFreechart (1)
- 操作系统 (1)
- 互联网 (10)
- EasyMock (1)
- jQuery (5)
- Struts2 (12)
- Spring (24)
- 浏览器 (16)
- OGNL (1)
- WebService (12)
- OSGi (14)
- 软件 (10)
- Tomcat (2)
- Ext (3)
- SiteMesh (2)
- 开源软件 (2)
- Hibernate (2)
- Quartz (6)
- iBatis (2)
最新评论
【文章作者】: 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, 转载请注明作者并保持文章的完整, 谢谢!
发表评论
-
性能测试中用LambdaProbe监控Tomcat Tomcat和Probe的配置
2009-09-25 14:12 642性能测试中用LambdaProbe监控TomcatLambda ... -
[转]HTTP调试工具:Fiddler的使用方法介绍
2009-09-25 14:27 775Fiddler可以帮您记录,调 ... -
Javascript压缩工具(Javascript compressed,Js压缩)(转)
2009-09-29 17:33 864怎么压缩Js?为什么要压缩Javascript? Javasc ... -
Fences -让你的桌面图标分组显示,成块状化
2009-11-13 11:36 936Fences是stardock公司开发的系统美化软件,功 ... -
Your Uninstaller 2008 软件介绍及注册码
2009-11-18 16:36 826Your Uninstaller 2008 软 ... -
软件推荐:强大的本地搜索工具Everything及FAT16/FAT32转化为NTFS
2010-04-06 09:35 735如果你对windows自身的搜索工具不是很满意,有不想使用To ... -
JAVA内存泄漏原因和内存泄漏检测工具
2010-06-10 09:24 584摘要 虽然Java 虚 ... -
JROCKIT MISSION CONTROL简介
2010-06-10 12:57 754摘要 BEA JRockit Mission Contr ... -
世界最快的Java虚拟机JVM与内存泄露诊断
2010-06-10 16:30 1045Oracle JRockit JVM (即原先的 ...
相关推荐
Easy Audio CD Burner破解版Easy Audio CD Burner破解版
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/...
Easy DVD CD Burner是一款专为普通用户设计的简洁易用的刻录软件,它以其直观的操作界面和强大的功能,成为了众多用户进行数据备份、音乐刻录及视频制作的理想选择。在这款绿色版的软件中,用户无需复杂的安装过程,...
为您提供Audio CD Burner Studio 光盘刻录软件下载,Audio CD Burner Studio是一款帮助用户刻录音频光盘的刻录软件,用户用户只需要简单的几次蒂娜及就足以从你的MP3、WMA或wav文件中创建一张音频光盘,十分方便实用...
《Easy DVD/CDBurner v3.101:一款小巧高效的光盘刻录工具》 在数字化时代,光盘刻录软件仍然是许多用户备份数据、制作音乐CD或DVD电影的重要工具。今天我们要讨论的是一款名为"Easy DVD/CDBurner v3.101"的软件,...
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.
《Easy DVD/CD Burner v3.0.127:简单高效的刻录软件详解》 在数字化的时代,数据保存的方式日益多样化,其中CD和DVD作为传统的存储媒介,仍然在某些场景下扮演着重要角色。Easy DVD/CD Burner v3.0.127就是这样一...
CD Burner, 用于电脑磁盘刻录,免费软件,音频、文件、DVD均可刻录,速度快,便捷
《Magic CD Burner:在Windows下使用Delphi控件实现CD刻录》 在软件开发领域,尤其是Windows平台的应用程序设计中,Delphi控件扮演着至关重要的角色。它们为开发者提供了一种直观且高效的方式来构建用户界面和实现...
一款非常好用的光盘刻录软件,比nero更好用~
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。...
标题中的“Abyssmedia Audio CD.zip”提示我们这是一个与音频CD刻录相关的软件包,而“系统工具-文件下载-音频CD刻录机”进一步强调了这个软件的主要功能是用于在计算机上创建音频CD。这款软件由Abyssmedia公司开发...
对初级用户和专业人士都比较适合的DVD/CD刻录软件,能够制作高质量的音乐CD,数据CD和DVD。功能包括:导入多区段的CD/DVD,将MP3/OGG/WMA/WAV转换为音乐CD,On-the-fly 录制,BURN-Proof保护等
《Magic CD DVD Burner VCL 1.23:Delphi中的光盘烧录利器》 在编程领域,尤其是Delphi开发环境中,有效地管理和操作硬件资源是至关重要的。Magic CD DVD Burner VCL 1.23是一款专为Delphi开发者设计的组件库,它...
ACE CD Burner 可以帮助你快速的将收藏的音乐刻录为CD,支持BURN-PROOF技术!支持刻录前预先测试功能,支持包括MP3, WMA,WAV,OGG在内的各种常用的音乐格式!同时程序也具有对CD进行抓取音轨的功能!程序内置音频播放器和...
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 著名DELPHI光盘刻录控件修改版源码,修复原版中几处错误,并增加两个接口便于调用
"Magic CD&DVD Burner Pro VCL 1.21 FULL SOURCE" 正是这样一个提供了全部源代码的CD和DVD刻录工具,专为Delphi 4至2009及C++ Builder 5至2009设计。这个工具不仅提供了刻录功能,还允许开发者对软件进行深度定制,...
《Magic CDDVD Burner Pro 1.21 Full Source》是一款专业的光盘刻录软件,它具有强大的功能和易用性,适用于个人和企业用户。该软件版本为1.21,集成了完整的源代码,这对于开发者和高级用户来说是极其宝贵的资源,...
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 ...