有声有色4.0注册算法 二 (7千字)
②计算注册码的CALL:* Referenced by a CALL at Addresses:
|:0048F11E , :0048F17F , :0048F32F
|
:0048F1B4 55 push ebp
:0048F1B5 8BEC mov ebp, esp
:0048F1B7 6A00 push 00000000
:0048F1B9 6A00 push 00000000
:0048F1BB 6A00 push 00000000
:0048F1BD 6A00 push 00000000
:0048F1BF 6A00 push 00000000
:0048F1C1 53 push ebx
:0048F1C2 56 push esi
:0048F1C3 894DFC mov dword ptr [ebp-04], ecx
:0048F1C6 8BF2 mov esi, edx
*//ESI=EDX=3E0D(下面要用到)
:0048F1C8 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名:华仔[CCG]
:0048F1CB E83C50F7FF call 0040420C
:0048F1D0 33C0 xor eax, eax
:0048F1D2 55 push ebp
:0048F1D3 68B2F24800 push 0048F2B2
:0048F1D8 64FF30 push dword ptr fs:[eax]
:0048F1DB 648920 mov dword ptr fs:[eax], esp
:0048F1DE 8D45F8 lea eax, dword ptr [ebp-08]
* Possible StringData Ref from Code Obj ->"Error"
|
:0048F1E1 BACCF24800 mov edx, 0048F2CC
:0048F1E6 E8854CF7FF call 00403E70
:0048F1EB 85F6 test esi, esi
:0048F1ED 0F8499000000 je 0048F28C
:0048F1F3 837DFC00 cmp dword ptr [ebp-04], 00000000
:0048F1F7 0F848F000000 je 0048F28C
*//如果没有输入用户名,那就免谈。
:0048F1FD 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名:华仔[CCG]
:0048F200 E8534EF7FF call 00404058
*//取用户名位数并送给EAX:EAX=9
:0048F205 8BD8 mov ebx, eax
*//EBX=EAX=9
:0048F207 0FAFDE imul ebx, esi
*//带符号数乘法:EBX=EBX*ESI=9*3E0D=22E75(ESI的值前面有说明)
:0048F20A 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名:华仔[CCG]
:0048F20D 0FB600 movzx eax, byte ptr [eax]
*//取用户名第一位ASCII码并送给EAX:EAX=BB
:0048F210 69C09A020000 imul eax, 0000029A
*//带符号数乘法:EAX=EAX*29A=BB*29A=1E67E
:0048F216 03D8 add ebx, eax
*//EBX=EBX+EAX=22E75+1E67E=414F3
*//414F3转换为十进制数:267507
:0048F218 8D55F4 lea edx, dword ptr [ebp-0C]
:0048F21B 8BC3 mov eax, ebx
*//EAX=EBX=414F3
:0048F21D E8C6A0F7FF call 004092E8
:0048F222 8B55F4 mov edx, dword ptr [ebp-0C]
:0048F225 8D45F8 lea eax, dword ptr [ebp-08]
:0048F228 B9DCF24800 mov ecx, 0048F2DC
*//ECX=2D(2D是“-”的ASCII码)
:0048F22D E8724EF7FF call 004040A4
:0048F232 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名:华仔[CCG]
:0048F235 0FB600 movzx eax, byte ptr [eax]
*//取用户名第一位ASCII码并送给EAX:EAX=BB
:0048F238 F7EE imul esi
*//带符号数乘法:EAX=EAX*ESI=BB*3E0D=2D537F
:0048F23A 6BD87B imul ebx, eax, 0000007B
*//带符号数乘法:EBX=EAX*7B=2D537F*7B=15C71E05
*//15C71E05转换为十进制数:365370885
:0048F23D FF75F8 push [ebp-08]
:0048F240 8D55F0 lea edx, dword ptr [ebp-10]
:0048F243 8BC3 mov eax, ebx
:0048F245 E89EA0F7FF call 004092E8
:0048F24A FF75F0 push [ebp-10]
:0048F24D 68DCF24800 push 0048F2DC
*//2D是“-”的ASCII码
:0048F252 8D45F8 lea eax, dword ptr [ebp-08]
:0048F255 BA03000000 mov edx, 00000003
:0048F25A E8B94EF7FF call 00404118
:0048F25F 8B45FC mov eax, dword ptr [ebp-04]
*//取输入的用户名:华仔[CCG]
:0048F262 E8F14DF7FF call 00404058
*//取用户名位数并送给EAX:EAX=9
:0048F267 8B55FC mov edx, dword ptr [ebp-04]
*//取输入的用户名:华仔[CCG]
:0048F26A 0FB612 movzx edx, byte ptr [edx]
*//取用户名第一位ASCII码并送给EDX:EDX=BB
:0048F26D F7EA imul edx
*//带符号数乘法:EAX=EAX*EDX=9*BB=693
:0048F26F 69D8D5190000 imul ebx, eax, 000019D5
*//带符号数乘法:EBX=EAX*19D5=693*19D5=A9D34F
:0048F275 03DE add ebx, esi
*//EBX=EBX+ESI=A9D34F+3E0D=AA115C
*//AA115C转换为十进制数:11145564
:0048F277 8D55EC lea edx, dword ptr [ebp-14]
:0048F27A 8BC3 mov eax, ebx
:0048F27C E867A0F7FF call 004092E8
:0048F281 8B55EC mov edx, dword ptr [ebp-14]
:0048F284 8D45F8 lea eax, dword ptr [ebp-08]
:0048F287 E8D44DF7FF call 00404060
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048F1ED(C), :0048F1F7(C)
|
:0048F28C 8B4508 mov eax, dword ptr [ebp+08]
:0048F28F 8B55F8 mov edx, dword ptr [ebp-08]
*//将完整的注册码:267507-365370885-11145564 送给EDX
:0048F292 E8954BF7FF call 00403E2C
:0048F297 33C0 xor eax, eax
:0048F299 5A pop edx
:0048F29A 59 pop ecx
:0048F29B 59 pop ecx
:0048F29C 648910 mov dword ptr fs:[eax], edx
:0048F29F 68B9F24800 push 0048F2B9
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048F2B7(U)
|
:0048F2A4 8D45EC lea eax, dword ptr [ebp-14]
:0048F2A7 BA05000000 mov edx, 00000005
:0048F2AC E84B4BF7FF call 00403DFC
:0048F2B1 C3 ret
二、注册算法:
1、序列号:(假设为“1974923”)
取你输入的序列号,只取6位,超过6位其后的位数忽略不计,如:
1974923 ==> 197492
为便于大家看清楚,我先将这个序列号依次赋值给SN1...SN6:
SN1=1
SN2=9
SN3=7
SN4=4
SN5=9
SN6=2
依次变换取位后:SN4 SN1 SN6 SN3 SN2 SN5
4 1 2 7 9 9
变换取位后所得数:412799
每两位为一组中间用/隔开:41/27/99
再和你的主板BIOS数据日期比较,不等于就错了。
如果你不知道你的主板BIOS数据日期的话可以查看注册表键:
WIN9X系统:
[HKEY_LOCAL_MACHINE\Enum\Root\*PNP0C01\0000]
"BIOSDate"="11/06/00"(我的是2000年11月06日)
WIN2000系统:
[HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System]
"SystemBiosDate"="11/06/00"
这个数据只在安装操作系统时生成,以后如果升级BIOS这个日期是不会变的,
所以如果你不介意的话也可以用我的序列号、用户名和注册码:)!
由以上反推序列号:
主板BIOS数据日期 ==> 11/06/00 ==> 110600 ==> 106100
当BIOS数据日期为2011年11月11日时,你就偷着笑了,6个1就可以搞定序列号。
2、注册码:(假设为“华仔[CCG]”)
注册码形式为:REG1-REG2-REG3
计算REG1:
REG1=用户名位数*3E0D+用户名第一位ASCII码*29A,(注意:一个汉字占两位)如:
REG1=9*3E0D+BB*29A=414F3 ==> 转换为十进制数为:267507
计算REG2:
REG2=用户名第一位ASCII码*3E0D*7B,如:
REG2=BB*3E0D*7B=15C71E05 ==> 转换为十进制数为:365370885
计算REG3:
REG3=用户名位数*用户名第一位ASCII码*19D5+3E0D,如:
REG3=9*BB*19D5+3E0D=AA115C ==> 转换为十进制数为:11145564
三、结果:
1、完整的注册信息:
序列号:106100
用户名:华仔[CCG]
注册码:267507-365370885-11145564
2、注册成功后程序将注册信息写入MusRea.ini:
[Register]
MySerial=106100
Username=华仔[CCG]
Serial=267507-365370885-11145564
3、程序记录使用次数在windows\system\mfc42ens.dll中,并且注册表中也有暗桩,
只要发现mfc42ens.dll与注册表中的记录不一致,你就到期了。还有,如果注册表中
有使用记录,而没有找到mfc42ens.dll这个文件,那么你就不能再成功启动软件了。
