二、注册机 开发者得到用户提供的注册源数据之后,就需要利用注册机生成注册码并返回给用户。注册机利用既定的位操作和不可逆算法,形成用户比较容易操作的字符串注册码,注册码的长度一般为8-16位为宜,用户只需注册一次就可以长期使用,所以注册码的长度不会影响用户的注册操作。当然注册机的算法应与共享软件中的算法部分基本相同。对于远程用户,注册机应该具有从键盘和内存两种取得注册源数据的功能,所以注册机的加密算法实际为两个分支:第一个分支是从键盘获取注册源数据后直接根据注册算法形成注册码的过程,是直接给远程用户反馈注册码的过程;第二个分支是直接从ROM BIOS中根据注册源算法取得注册源数据,再根据注册算法形成注册码的过程,是直接读取本地机注册码的。 用户得到注册码后,根据共享发布软件的注册方法进行一次注册,应用程序会自动将这个注册码存放到软件的特定位置处,当应用程序被他人拷贝到其它机器中去后,由于注册码因不同机器而异,所以应用程序的功能或使用次数仍然受限,要在其它机器中使用该应用程序,还必须进行重新注册,达到共享软件发布目的。同时由于注册源数据的算法和注册码算法均可因人而异,因此这种方法非常可靠。本人实现的注册机带参数时接受键盘输入注册源;不带任何参数时从本地机器内直接采集注册源数据。我的注册机示例程序如下: 代码:
| #include <conio.h> #include <dos.h> #include <io.h> #include <dir.h> #include <alloc.h> #include <string.h> #include <stdio.h> #include <process.h> #include <fcntl.h> #include <ctype.h> #include <stdlib.h> unsigned char Buff[18]; unsigned char Buff1[18]; unsigned int keyrom[9]; unsigned int sum,sum1,sumi,sumj; unsigned int far *pt=(unsigned int far *)0xf000fff6L; unsigned int i=0,j=0,m,imecom; unsigned char p; unsigned int nn,nn1,nn2; unsigned char rbuff[100],cc,cc1,cc2; int fp; void main(int argc,char *argv[]) { if(argc>=2){ printf("KEYID:"); scanf("%s",rbuff);//接受键盘输入远程注册源 j=strlen(rbuff); if(j!=20) exit(1); for(i=0;i<20;i++){//读入20位注册源数据 if((rbuff[i]>='a')&&(rbuff[i]<='f')) rbuff[i]&=0xdf; if((rbuff[i]>='A')&&(rbuff[i]<='F')) rbuff[i]-=0x37; else if((rbuff[i]>='0')&&(rbuff[i]<='9')) rbuff[i]-=0x30; else exit(1); } for(i=0;i<5;i++){//形成字符串 cc1=rbuff[i*4]&0xf; cc2=rbuff[i*4+1]&0xf; cc=(cc1<<4)|cc2; nn1=(unsigned int)cc; cc1=rbuff[i*4+2]&0xf; cc2=rbuff[i*4+3]&0xf; cc=(cc1<<4)|cc2; nn2=(unsigned int)cc; nn=(nn1<<8)|nn2; keyrom[i]=nn; } |
|