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);
if(strstr(argv,".EXE")==NULL){
printf("USAGE:READKEY 路径及文件名.\n");
exit(1);
}
if((fp=open(argv,O_RDWR | O_BINARY))==-1){
printf("File %s open error!",argv);
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);
}
四、应用程序中密钥的读取及限制
当应用程序进行电子注册之后,安装程序会将注册密钥写入到应用程序中。在应用程序中,判断是否进行注册的方法就是重新生成注册密钥并进行判断处理。注册密钥的读取函数如下:
void ImeCmpkey(void)
{//Windows下注册密钥的读取函数
static unsigned int sum,sumi,sumj;
static BOOL flag;
static unsigned int far *pt;
static UINT Sel1,Sel2;
static WORD Seg,Off,Start;
static DWORD Bas,Lim;
flag=TRUE;
sum=0x2020;
__asm mov Sel1,ds; //将DS作为
模板 Sel2=AllocSelector(Sel1); //分配一个新选择符
if(Sel2==NULL){
flag=FALSE;
pt=(unsigned int far*)0xf000fff0L;
} else {
Seg=0xffff; //绝对地址段址
Off=0x10; //绝对地址偏移
Start=0x0;
Bas=((unsigned long)Seg)<<4 | Start;
Lim=(unsigned long)Off-1;
SetSelectorBase(Sel2,Bas);
SetSelectorLimit(Sel2,Lim);
pt=(unsigned int far*)((((unsigned long)Sel2)<<16) | Start);
}
for(sumj=0;sumj<4;sumj+