欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

破解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", &regcode);

printf("你的注册号是: ");
printf("h%lxp\n", regcode);
}