破解MP3音乐管理大师
程序员文章站
2022-04-26 23:19:56
用SoftICE和SmartCheck结合将这个VB6程序搞定。
注册号是很好找的,用rtcMsgBox或MultiByteToWideChar设断点,
看见如下的判断:
0167:004C546D 50 ... 08-10-08...
用softice和smartcheck结合将这个vb6程序搞定。
注册号是很好找的,用rtcmsgbox或multibytetowidechar设断点,
看见如下的判断:
0167:004c546d 50 push eax
0167:004c546e ff1568104000 call [00401068]
0167:004c5474 8b45e4 mov eax,[ebp-1c]
0167:004c5477 50 push eax
0167:004c5478 ff1550104000 call [00401050]
0167:004c547e 8b3db4114000 mov edi,[004011b4]
0167:004c5484 8bd0 mov edx,eax
0167:004c5486 8d4de8 lea ecx,[ebp-18]
0167:004c5489 ffd7 call edi
0167:004c548b 8d4de4 lea ecx,[ebp-1c]
0167:004c548e ff15fc114000 call [004011fc]
0167:004c5494 8d4dd8 lea ecx,[ebp-28]
0167:004c5497 ff15f8114000 call [004011f8]
0167:004c549d e85ef5ffff call 004c4a00
0167:004c54a2 8b4de8 mov ecx,[ebp-18]
0167:004c54a5 8b1528704c00 mov edx,[004c7028]
0167:004c54ab 51 push ecx //错误的注册码
0167:004c54ac 52 push edx //正确的注册码
0167:004c54ad ff15d4104000 call [004010d4] //比较注册码
0167:004c54b3 85c0 test eax,eax
0167:004c54b5 0f85c5010000 jnz 004c5680
这个软件必须写注册机,先用softice跟一下,经过漫长的跟踪后发现它在下面的地方将你的软件编号的第k个字符乘以(k 1)。
0167:004c4b29 db856cffffff fild dword ptr [ebp-0094]
0167:004c4b2f c745a805000000 mov dword ptr [ebp-58],00000005
0167:004c4b36 dd9d64ffffff fstp real8 ptr [ebp-009c]
0167:004c4b3c dc8d64ffffff fmul real8 ptr [ebp-009c] //相乘
0167:004c4b42 dd5db0 fstp real8 ptr [ebp-50]
0167:004c4b45 dfe0 fstsw ax
0167:004c4b47 a80d test al,0d
0167:004c4b49 0f85a0020000 jnz 004c4def
比如我的软件编号为174078570,它在前面添个0,变成0174078570,然后就有:
0 乘以 1 =0
1 乘以 2 =2
7 乘以 3 =21
4 乘以 4 =16
0 乘以 5 =0
7 乘以 6 =42
8 乘以 7 =56
5 乘以 8 =40
7 乘以 9 =63
0 乘以 10 =0
之后用softice就跟丢了。改用smartcheck,发现它把上面的乘积串成一个字符串“0221160425640630”,
然后取该串的前9个字符“022116042”,然后将该串转换成相应的十进制数22116042,该数对应的十六进制表示为15176ca,再在十六进制表示的前面和后面各加上软件作者的姓名的声母h、p,就得到了注册号h15176cap。
注册机:
#include <stdio.h>
#include <string.h>
void main(void)
{
char buf[128] = "0";
char serialstr[128], codestr[128];
int k;
long regcode;
printf("请输入你的软件编号: ");
gets(serialstr);
strcat(buf, serialstr);
codestr[0] = ’\0’;
for (k = 0; k < strlen(buf); k )
{
sprintf(serialstr, "%d", ((buf[k] - ’0’) * (k 1)) & 0xff);
strcat(codestr, serialstr);
}
codestr[9] = ’\0’;
sscanf(codestr, "%lu", ®code);
printf("你的注册号是: ");
printf("h%lxp\n", regcode);
}
注册号是很好找的,用rtcmsgbox或multibytetowidechar设断点,
看见如下的判断:
0167:004c546d 50 push eax
0167:004c546e ff1568104000 call [00401068]
0167:004c5474 8b45e4 mov eax,[ebp-1c]
0167:004c5477 50 push eax
0167:004c5478 ff1550104000 call [00401050]
0167:004c547e 8b3db4114000 mov edi,[004011b4]
0167:004c5484 8bd0 mov edx,eax
0167:004c5486 8d4de8 lea ecx,[ebp-18]
0167:004c5489 ffd7 call edi
0167:004c548b 8d4de4 lea ecx,[ebp-1c]
0167:004c548e ff15fc114000 call [004011fc]
0167:004c5494 8d4dd8 lea ecx,[ebp-28]
0167:004c5497 ff15f8114000 call [004011f8]
0167:004c549d e85ef5ffff call 004c4a00
0167:004c54a2 8b4de8 mov ecx,[ebp-18]
0167:004c54a5 8b1528704c00 mov edx,[004c7028]
0167:004c54ab 51 push ecx //错误的注册码
0167:004c54ac 52 push edx //正确的注册码
0167:004c54ad ff15d4104000 call [004010d4] //比较注册码
0167:004c54b3 85c0 test eax,eax
0167:004c54b5 0f85c5010000 jnz 004c5680
这个软件必须写注册机,先用softice跟一下,经过漫长的跟踪后发现它在下面的地方将你的软件编号的第k个字符乘以(k 1)。
0167:004c4b29 db856cffffff fild dword ptr [ebp-0094]
0167:004c4b2f c745a805000000 mov dword ptr [ebp-58],00000005
0167:004c4b36 dd9d64ffffff fstp real8 ptr [ebp-009c]
0167:004c4b3c dc8d64ffffff fmul real8 ptr [ebp-009c] //相乘
0167:004c4b42 dd5db0 fstp real8 ptr [ebp-50]
0167:004c4b45 dfe0 fstsw ax
0167:004c4b47 a80d test al,0d
0167:004c4b49 0f85a0020000 jnz 004c4def
比如我的软件编号为174078570,它在前面添个0,变成0174078570,然后就有:
0 乘以 1 =0
1 乘以 2 =2
7 乘以 3 =21
4 乘以 4 =16
0 乘以 5 =0
7 乘以 6 =42
8 乘以 7 =56
5 乘以 8 =40
7 乘以 9 =63
0 乘以 10 =0
之后用softice就跟丢了。改用smartcheck,发现它把上面的乘积串成一个字符串“0221160425640630”,
然后取该串的前9个字符“022116042”,然后将该串转换成相应的十进制数22116042,该数对应的十六进制表示为15176ca,再在十六进制表示的前面和后面各加上软件作者的姓名的声母h、p,就得到了注册号h15176cap。
注册机:
#include <stdio.h>
#include <string.h>
void main(void)
{
char buf[128] = "0";
char serialstr[128], codestr[128];
int k;
long regcode;
printf("请输入你的软件编号: ");
gets(serialstr);
strcat(buf, serialstr);
codestr[0] = ’\0’;
for (k = 0; k < strlen(buf); k )
{
sprintf(serialstr, "%d", ((buf[k] - ’0’) * (k 1)) & 0xff);
strcat(codestr, serialstr);
}
codestr[9] = ’\0’;
sscanf(codestr, "%lu", ®code);
printf("你的注册号是: ");
printf("h%lxp\n", regcode);
}
推荐阅读