在Windows应用程序中实现电子注册功能
2010-04-03 20:35:47 来源:WEB开发网三、电子注册密钥生成程序
开发者得到用户提供的解密密钥原始数据后,需要利用专用的密钥生成程序将其转换成注册密钥,并将注册密钥交给用户。注册密钥的算法与应用程序中判断注册密钥的加密算法程序应该完全相同。该程序一般应具有以下三种取得注册密钥算法原始数据的方式,以方便进行密钥的处理。该程序的名称为READKEY.EXE,其功能如下:
(1)当READKEY不带参数时,则直接从当前机器中取得注册密钥;
(2)当READKEY带参数时,则从键盘输入解密密钥来获取注册密钥;
(3)当READKEY带EXE文件名参数时,则从相应应用程序的特定位置取得解密密钥,并生成注册密钥。
用户得到注册密钥后,重新安装一次应用程序或在需要输入注册密钥处直接输入密钥,则应用程序会自动将这个注册密钥存放到文件的特定位置处,当应用程序被他人拷贝到其它机器中之后,由于注册密钥随机器的不同而不同,所以应用程序的功能或使用次数仍然受限,要想在其它机器中使用该应用程序,则必须重新注册。
应用程序中解密密钥和注册密钥的位置,可先用特殊字符来标识,然后用DEBUG 等程序直接查找其位置,再修改其它程序中读取或写入数据的地址值。至于解密密钥显示和注册密钥的输入方式,可由开发者确定是用安装程序的方法还是在应用程序中直接处理的方法。
/*电子注册功能密钥读取程序清单READKEY.C*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void readser(void);
void readser1(void);
unsigned char Buff[18];
unsigned int keyrom[9];
unsigned int sum,sumi,sumj;
unsigned int far *pt=
(unsigned int far *)0xf000fff6L;
unsigned int i=0,j=0,m;
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>3)||((argc==2)&&(argv[1][1]!=':'))){
printf("USAGE:READKEY 程序路径及名称.n");
scanf("%s",rbuff); //手工输入加密密钥
printf("sss:%s,%un",rbuff,strlen(rbuff));
j=strlen(rbuff);
if(j!=20) exit(1);
for(i=0;i<20;i++){
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);
}
printf("num:");
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;
printf("%04x",keyrom[i]);
}
printf("n");
sum=0x2020;
for(sumj=0;sumj<4;sumj++){ //形成16位密钥
for(sumi=0;sumi<5;sumi++)
sum-=keyrom[sumi]; //形成解密密钥
sum^=0x0404< sprintf(Buff+4*sumj,"%04x",sum);
}
printf(Buff);
exit(1);
}
if(argc>1){
strlwr(argv[1]);
if(strstr(argv[1],".EXE")==NULL){
printf("USAGE:READKEY 路径及文件名.n");
exit(1);
}
if((fp=open(argv[1],O_RDWR|O_BINARY))==-1){
printf("File %s open error!",argv[1]);
exit(1);
}
lseek(fp,0xf040L,SEEK_SET);//ROM 10个数据地址+200H
read(fp,keyrom,0xaL); //读取数据
readser1(); //读文件中的注册密钥
} else readser(); //读机器中的注册密钥
}
void readser(void)
{
sum=0x2020;
for(sumj=0;sumj<4;sumj++){//形成16位密钥
for(sumi=0;sumi<5;sumi++)
sum-=(*(pt+sumi)-0x2020);//形成解密密钥
sum^=0x0404< sprintf(Buff+4*sumj,"%04x",sum);
}
printf(Buff);
}
void readser1(void)
{
sum=0x2020;
for(sumj=0;sumj<4;sumj++){//形成16位密钥
for(sumi=0;sumi<5;sumi++)
sum-=keyrom[sumi]; //形成解密密钥
sum^=0x0404< sprintf(Buff+4*sumj,"%04x",sum);
}
printf(Buff);
}
更多精彩
赞助商链接