- UID
- 59317
注册时间2009-1-28
阅读权限40
最后登录1970-1-1
独步武林
TA的每日心情 | 无聊 2024-1-15 22:57 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
|
本帖最后由 zaas 于 2010-12-19 10:36 编辑
软件本身是vc的程序,注册过程都是字符串操作。
本来用delphi写过一个。但delphi的字符串起始位置为1,c字符串起始位置为0,因此写起来要去填补这个位置差,写的很累。
学了这么多天的c,昨天改用c改写了一遍,果然要容易不少。。。
算法描述:
注册码去掉“-”为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
依据这个写出注册机:- #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[i]=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;
- }
- }
- }
复制代码
|
|