zaas 发表于 2010-12-19 10:21:30

Power Copy 1.92 注册机源码

本帖最后由 zaas 于 2010-12-19 10:36 编辑

软件本身是vc的程序,注册过程都是字符串操作。
本来用delphi写过一个。但delphi的字符串起始位置为1,c字符串起始位置为0,因此写起来要去填补这个位置差,写的很累。
学了这么多天的c,昨天改用c改写了一遍,果然要容易不少。。。

算法描述:
注册码去掉“-”为15位,设为str:0123456789ABCDE;
str和str除以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的位置=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={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=ref_str;        //第7位
                rnd_b=rand()%24;
                code=ref_str;        //第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=rand()%8+1;
                result_a +=position;
                position=rand()%8+1;
                result_b +=position;
                position=24-position-position;//9,5,11位的坐标之和等于24
                code=ref_str];        //第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;        //前插入位
                code=ref_str;        //后插入位
                k=0;
                for (m=0;m<5;m++)        //前6位的排序
                {
                        if (code !=0x31)        k=1;
                        *(code+m+k)=ref_str[*(position+m)];       
                }
                k=0;
                for (m=14;m>9;m--)        //后6位的排序,逆序
                {
                        if (code !=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?\n");
                char redo;
                scanf("%c",&redo);
                getchar();
                printf("----------------------\n");
                if (redo !='y' && redo != 'Y')
                {
                        printf("Bye~good luck.........\n");
                        break;
                }
        }
}

whypro 发表于 2010-12-19 10:53:26

很给力,学习了!

Finder 发表于 2010-12-19 10:56:53

zaas,你真厉害,以后要向你学习破解了,

sdnyzjzx 发表于 2010-12-21 19:25:26

水平真高,算法都分析出来了./:good

316325 发表于 2010-12-22 19:13:07

z大大,支持原创。

FER 发表于 2010-12-23 12:08:58

thanks you good try

zhuangd 发表于 2010-12-24 09:22:14

支持原创

cfc1680 发表于 2010-12-24 10:26:23

楼主太给力了,感谢了,学习

doudou8308 发表于 2011-2-23 08:40:33

             

唉,没抢到沙发沙发。。。











http://www.discuz.net/static/image/common/sigline.gif
燃文
页: [1]
查看完整版本: Power Copy 1.92 注册机源码