|
软件本身是vc的程序,注册过程都是字符串操作。
算法描述:
注册码去掉“-”为15位,设为str:0123456789ABCDE;
str[6]和str[8]除以5求余分别得到前后6位中的一位,设为char_a和char_b
前后6位分别去掉char_a和char_b得到StrA和StrB
软件要成功注册要满足的条件:
1。StrA在密码表中的位置和经过运算得出的值等于char_a;
2。StrB在密码表中的位置和经过运算得出的值等于char_b;
3。StrA和StrB中字符在密码表中的位置经浮点运算的和加上str[7]的位置=0x798000,用数学公式表示为:
a*18H^4+b*18H^3+c*18H^2+d*18H^1+e*18H^0+x*18H^4+y*18H^3+z*18H^2+u*18H^1+v*18H^0+s=18H^5
条件1,2比较容易,条件三初看起来没有头绪,但实际分析一下,以上公式可以化简为:
(a+x)*51000+(b+y)*3600+(c+z)*240+(d+u)*18+(e+v+s)=798000
再次化简就很容易理解了,条件三等价于:
a+x=17
b+y=17
c+7=17
d+u=17
e+v+s=18
[mw_shl_code=c,true]#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void main()
{
char ref_str[]="BCDFGHJKMPQRTVWXY2346789";
int position[16]={0};
int rnd_a,rnd_b;
int i,k,m;
printf("----------------------\n");
printf("Power Copy 1.92 KeyGen\n");
printf("code by zaas ,20101216\n");
printf("----------------------\n");
while(1)
{
char code[]="111111111111111";
int result_a=0,result_b=0;
srand((unsigned) time(0));
rnd_a=rand()%24;
code[6]=ref_str[rnd_a]; //第7位
rnd_b=rand()%24;
code[8]=ref_str[rnd_b]; //第9位
for (i=0;i<4;i++) //1-5,11-15位在密码表中的坐标
{
*(position+i)=rand()%22;
*(position+14-i)=23-*(position+i);
result_a += *(position+i);
result_b += *(position+14-i);
}
position[4]=rand()%8+1;
result_a +=position[4];
position[10]=rand()%8+1;
result_b +=position[10];
position[7]=24-position[4]-position[10];//9,5,11位的坐标之和等于24
code[7]=ref_str[position[7]]; //第8位
i=rnd_a%5;
k=14-rnd_b%5;
result_a=(24-result_a%24)%24; //前插入位的坐标
result_b=23-result_b%24; //后插入位的坐标
code=ref_str[result_a]; //前插入位
code[k]=ref_str[result_b]; //后插入位
k=0;
for (m=0;m<5;m++) //前6位的排序
{
if (code[m] !=0x31) k=1;
*(code+m+k)=ref_str[*(position+m)];
}
k=0;
for (m=14;m>9;m--) //后6位的排序,逆序
{
if (code[m] !=0x31) k=1;
*(code+m-k)=ref_str[*(position+m)];
}
for (i=0;i<15;i++) //输出
{
if (!(i%5) && i) printf("-");
printf("%c",*(code+i));
}
printf("\n");
printf("----------------------\n");
printf("Want another one?[Y/N]\n");
char redo;
scanf("%c",&redo);
getchar();
printf("----------------------\n");
if (redo !='y' && redo != 'Y')
{
printf("Bye~good luck.........\n");
break;
}
}
}[/mw_shl_code] |
|