| 
注册时间2009-1-28
阅读权限40
最后登录1970-1-1UID59317 独步武林  
 
 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;
                }
        }
}
  | 
 |