⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 install.c

📁 安装时修改执行文件记录硬件配置参数从而做唯一安装标志防止非法复制
💻 C
字号:
#include <stdio.h>
#include <dos.h>
#include <io.h>
#include <string.h>
#define T 1
#define F 0
#define PASSLEN 8
FILE *fp1,*fp2,*fpout;
union REGS in,out;

union{
  unsigned axreg;
  struct
   {   unsigned diskette:1;
       unsigned ndp:1;
       unsigned  sys_ram:2;
       unsigned video_mode:2;
       unsigned drive_num:2;
       unsigned dma:1;
       unsigned serial_ports:3;
       unsigned game_adapter:1;
       unsigned pcjr_printer:1;
       unsigned printer_num:2;
   }flags;
     }equip;
void inputpassword( char *key);
void  writepassword(char *key);
void  testhardware();
void makepassword(char *key);
void readpassword(char *key);
void installware();
char buff1[20],key1[9],buff2[20],key2[9];
unsigned long int len;
int flag;
main(int argc,char *argv[])
{
int newdisk,olddisk,m;
 if(argc<2||argc>3)
  {
   printf("\n\n\t\t Usage:[drive][path] install [targetdrive]\n");
   exit(0);
  }
olddisk=getdisk();
newdisk=toupper(argv[1][0])-'A';
setdisk(newdisk);
flag=testflag();
if(!flag)
  {
    setflag();
    inputpassword(key1);
    makepassword(key1);
    writepassword(key1);
    testhardware();
    installware();
  }
else
  {
    testhardware();
    m=readhardware();
    if(m)  /* 比较硬件改变没有 */
       installware();
    else
       {
	inputpassword(key1);
	readpassword(key2);
	if(!strcmp(key1,key2))
	  {
	   makepassword(key1);
	   writepassword(key1);
	   installware();
	  }
	else
	 exit(-2);
       }

   }
setdisk(olddisk);
}

int testflag()  /* 以字母A的ASCII码作为是否安装的标志, A为已安装
		   非A为未安装  */
{
char c,j;
 if((fp1=fopen("ch.exe","rb"))==NULL)
   exit(-1);
 c=65;
 fseek(fp1,-1,2);
 fread(&j,sizeof(char),1,fp1);
 fclose(fp1);
 if(c==j)
   return T;
 else
   return F;
}

int setflag()   /* 在文件CH.EXE的末尾写上字母A,作为已安装标志  */
{
char c;
 if((fp1=fopen("ch.exe","a+"))==NULL)
   exit(-1);
 c=65;
 fseek(fp1,0,2);  /* 将字母A写在CH.EXE文件的末尾 */
 fwrite(&c,sizeof(char),1,fp1);
 fclose(fp1);
}

void inputpassword( char *key)  /* 要求用户输入安装密码 */
{
 char k[PASSLEN],l[PASSLEN],c;
 int i;
 strcpy(k,'\0');
 strcpy(l,'\0');
 clrscr();
 printf("\n\n\n\n\n\n\n\n\t\tPlease Input Your Password: ");
 for(i=0;i<PASSLEN;i++)
   {
    c=getch();
    strcat(k,&c);
    }
 strcat(k,'\0');
 clrscr();
 printf("\n\n\n\n\n\n\n\n\t\tPlease Verfiy Your Password: ");
 for(i=0;i<PASSLEN;i++)
   {
    c=getch();
    strcat(l,&c);
    }
 strcat(l,'\0');
 if(strcmp(k,l))
   {
   printf("Please Try Again!\n");
   printf("Press any key to continue......\n");
   getch();
   inputpassword(k);
   }
 else
   strcpy(key,k);
}

void makepassword(char *key) /* 经过矩阵变换,产生新密码 */
{
   static char word[]={'a','b','c','d','e','f','g','h','i','j','k','l',
   'm','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C',
   'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
   'U','V','W','X','Y','Z','\0'};
  static int passkey[]={4,3,5,10,23,7,11,37};
  int i,j,k,l,m[PASSLEN];
  char s[PASSLEN],c;
  l=strlen(word);
  k=PASSLEN;
  for(i=0;i<k;i++)
    {
     for(j=0;j<l;j++)
      if(key[i]==word[j])
	 m[i]=j;
    }
 for(i=0;i<k;i++)
   {
     m[i]*=passkey[i];
     if(m[i]>51)
       m[i]=m[i]%52;
   }
 strcpy(s,'\0');
 for(i=0;i<k;i++)
   {
    c=word[m[i]];
    strcat(s,&c);
   }
 strcat(s,'\0');
 strcpy(key,s);
}

void  writepassword(char *key)  /* 将新密码写入set.exe文件 */
{
 if((fp2=fopen("set.exe","a+"))==NULL)
   {
    printf("Can not Open File........\n");
    printf("press any key to continue\n");
    getch();
    exit(-1);
   }
 fseek(fp2,0,2);
 len=ftell(fp2);   /* 记录SET.EXE文件的原始长度 */
 fwrite(key,PASSLEN,1,fp2); /* 将密码写在SET.EXE文件的末尾 */
 fseek(fp2,0,2); /* 将SET.EXE的原始长度写在SET.EXE文件的末尾 */
 fwrite(&len,sizeof(unsigned long int),1,fp2);
 fclose(fp2);
}

void  testhardware()  /* 测试并记录硬件参数 */
{
int x[6],i;
if((fpout=fopen("ch.exe","a+"))==NULL)
exit(0);
fseek(fpout,0,2);
len=ftell(fpout);  /* 记录硬件参数存放位置 */
int86(0x11,&in,&out);
equip.axreg=out.x.ax;
if(equip.flags.game_adapter==0)
  x[0]=0;
  else if(equip.flags.game_adapter==1)
      x[0]=1;
      else if(equip.flags.game_adapter==2)
       x[0]=2;
	else x[0]=0;
if(equip.flags.serial_ports==0)
  x[1]=0;
  else if(equip.flags.serial_ports==1)
      x[1]=1;
      else if(equip.flags.serial_ports==2)
       x[1]=2;
	else x[1]=0;
if(equip.flags.dma==0)
  x[2]=0;
  else if(equip.flags.dma==1)
      x[2]=1;
      else if(equip.flags.dma==2)
       x[2]=2;
	else x[2]=0;
if((equip.flags.drive_num+1)==0)
  x[3]=1;
  else if((equip.flags.drive_num+1)==1)
      x[3]=2;
      else if((equip.flags.drive_num+1)==2)
       x[3]=3;
	else x[3]=1;
if(equip.flags.video_mode==0)
  x[4]=0;
else if(equip.flags.video_mode==1)
      x[4]=1;
      else if(equip.flags.video_mode==2)
       x[4]=2;
	else x[4]=0;

x[5]=0;
for(i=0;i<5;i++)
  fprintf(fpout,"%d",x[i]);
in.h.ah=0x08;
in.h.dl=0x80;
int86(0x13,&in,&out);
for(i=0;i<out.h.dl;i++)
  {
   in.h.dl=0x80+i;
   int86(0x13,&in,&out);
   fprintf(fpout,"%d",++out.h.dh);
   out.h.bh=(out.h.cl&0xc0)>>6;
   out.h.bl=out.h.ch;
   fprintf(fpout,"%d",out.x.bx);
   fprintf(fpout,"%d",out.h.cl&0x3f);
  }
fwrite(&len,sizeof(unsigned long int),1,fpout);
fclose(fpout);
}

int readhardware()  /* 读硬件参数并与机器硬件参数进行比较,
		   相同返回T,否则返回F */
{
  int i,j,k,l;
  char x[PASSLEN],y[PASSLEN];
 union REGS in,out;
 if((fp1=fopen("ch.obj","rb"))==NULL)
     exit(-1);
 l=sizeof(unsigned long int);
 fseek(fp1,-l,2);
 fread(&len,l,1,fp1);  /* 读硬件参数存放位置 */
 fseek(fp1,len,0);
 fread(y,sizeof(int)*5,1,fp1);

 int86(0x11,&in,&out);
 equip.axreg=out.x.ax;
if(equip.flags.game_adapter==0)
  x[0]=0;
  else if(equip.flags.game_adapter==1)
      x[0]=1;
      else if(equip.flags.game_adapter==2)
       x[0]=2;
	else x[0]=0;
if(equip.flags.serial_ports==0)
  x[1]=0;
  else if(equip.flags.serial_ports==1)
      x[1]=1;
      else if(equip.flags.serial_ports==2)
       x[1]=2;
	else x[1]=0;
if(equip.flags.dma==0)
  x[2]=0;
  else if(equip.flags.dma==1)
      x[2]=1;
      else if(equip.flags.dma==2)
       x[2]=2;
	else x[2]=0;
if((equip.flags.drive_num+1)==0)
  x[3]=1;
  else if((equip.flags.drive_num+1)==1)
      x[3]=2;
      else if((equip.flags.drive_num+1)==2)
       x[3]=3;
	else x[3]=1;
if(equip.flags.video_mode==0)
  x[4]=0;
else if(equip.flags.video_mode==1)
      x[4]=1;
      else if(equip.flags.video_mode==2)
       x[4]=2;
	else x[4]=0;

x[5]=0;
for(i=0;i<5;i++)
    if(x[i]!=y[i])
       return F;
in.h.ah=0x08;
in.h.dl=0x80;
int86(0x13,&in,&out);
for(i=0;i<out.h.dl;i++)
  {
   in.h.dl=0x80+i;
   int86(0x13,&in,&out);
   fscanf(fp1,"%d",&k);
   if(k!=++out.h.dh)
     return F;
   out.h.bh=(out.h.cl&0xc0)>>6;
   out.h.bl=out.h.ch;
   fscanf(fp1,"%d",&k);
   if(k!=out.x.bx)
     return F;
   fscanf(fp1,"%d",&k);
   if(k!=(out.h.cl&0x3f))
      return F;
  }
 in.h.ah=0x08;
 in.h.dl=0x80;
 int86(0x13,&in,&out);
 for(i=0;i<out.h.dl;i++)
   {

    in.h.dl=0x80+i;
    int86(0x13,&in,&out);
    j=++out.h.dh;
    fread(&k,sizeof(int),1,fp1);
    if(j!=k)
      return F;
    out.h.bh=(out.h.cl&0xc0)>>6;
    out.h.bl=out.h.ch;
    fread(&j,sizeof(int),1,fp1);
    if(j!=out.x.bx)
      return F;
    fread(&j,sizeof(int),1,fp1);
    k=out.h.cl&0x3f;
    if(j!=k)
      return F;
   }
  fclose(fp1);
  return T;
}

void readpassword(char *key)   /* 读记录在文件中的密码 */
{
 if((fp2=fopen("set.exe","r"))==NULL)
   {
    printf("Can not Open File........\n");
    printf("press any key to continue\n");
    getch();
    exit(-1);
   }
 fseek(fp2,0,2);  /* 读密码存放位置 */
 fread(&len,sizeof(unsigned long int ),1,fp2);
 fseek(fp2,len,0);
 fread(key,PASSLEN,1,fp2);  /* 读密码 */
 fclose(fp2);
 }

void installware()
{  /*  在此模块中,可将软件进行解压或复制有关文件到
       硬盘的指定目录中;当然,在主要的可执行文件中
       应包含对硬件配置进行测试并比较的函数,如本程
       序中的testhardware(),readhardware()等,如发现硬
       件配置改变则拒绝执行,否则可正常运行程序 */

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -