www.pudn.com > hddlock.rar > LOCK.C


//******************************************** 
//文件名:LOCK.C 
//功能:1. 调用读扇区汇编子程序 
//      2. 调用写扇区汇编子程序 
//      3. 建立扇区数据备份文件 
//      4. 将扇区清零对硬盘实行加锁 
//      5. 将数据写回扇区对硬盘实行解锁 
//******************************************** 
#include                          //1. 
#include                           //2. 
#include                           //3. 
#include                           //4. 
#include                          //5. 
#include                           //6. 
#include                              //7. 
#include"port.h"                            //8.包含硬盘序列号头文件 
#include"pw.h"                              //9.包含密钥头文件 
extern RHD(int,int,int,int,char *);         //10.声明读扇区汇编子程序 
extern WHD(int,int,int,int,char *);         //11.声明写扇区汇编子程序 
void jia(void);                             //12.声明加密函数 
void jie(void);                             //13.声明解密函数 
void copyf(void);                           //14.声明拷贝文件函数 
void cle(void);                             //15.声明扇区清零函数 
char name[13];                              //16. 
                                            //17. 
void main(int argc,char *argv[])            //18.带命令行参数的主函数 
{                                           //19. 
  FILE *tmfp,*fp;                           //20. 
  char ch;                                  //21. 
  char tmp[13];                             //22. 
  char pwh[11];                             //23. 
  int i,j,k,l;                              //24. 
  unsigned num=48059;                       //25. 
  long flag1,flag2,flag3;                   //26. 
  unsigned long m;                          //27. 
  unsigned char s1,s2,s3,s4;                //28. 
  char sh[21];                              //29. 
  unsigned id;                              //30. 
  unsigned cw[257];                         //31. 
  long port=135792468;                      //32.设定序列号基数 
  long pw=135798642;                        //33.设定密钥基数 
                                            //34. 
  if(argc==1)                               //35.若命令行参数为1 
    strcpy(name,argv[0]);                   //36.拷贝字符串 
  else                                      //37.否则 
  {                                         //38. 
    printf("Extra parameter [%s]",argv[1]); //39.显示提示 
    exit(0);                                //40. 
  }                                         //41. 
  m=0;                                      //42. 
  outp(0x1f6,0xa0);                         //43. 
  outp(0x1f7,0xec);                         //44. 
  while(inp(0x1f7)!=0x58 && m++<0xffff)     //45. 
  ;                                         //46. 
  for(id=0;id!=256;id++)                    //47. 
    cw[id]=inpw(0x1f0);                     //48. 
  for(j=10,k=0;j<=19;j++)                   //49. 
  {                                         //50. 
    sh[k++]=(char)(cw[j]/256);              //51. 
    sh[k++]=(char)(cw[j]%256);              //52. 
  }                                         //53. 
  sh[k]='\0';                               //54. 
  l=strlen(sh);                             //55. 
                                            //56. 
  for(i=0;i0)                                 //80.辅助语句 
  ;                                         //81. 
  flag1=0;                                  //82. 
  while(1)                                  //83. 
  {                                         //84. 
    printf("Enter password: ");             //85. 
    scanf("%s",pwh);                        //86.输入密钥 
    strcpy(pwh,strupr(pwh));                //87.转为大写 
    for(i=0;i<10;i++)                       //88. 
    {                                       //89. 
      srand(pw);                            //90. 
      ch=rand();                            //91. 
      hdpw[i]=hdpw[i]^ch;                   //92. 
      pw=pw+7;                              //93. 
    }                                       //94. 
    j=0;                                    //95. 
    for(i=0;i<10;i++)                       //96. 
    {                                       //97. 
      if(pwh[i]==hdpw[i])                   //98. 
        j++;                                //99. 
      else                                  //100. 
      {                                     //101. 
        flag1=88;                           //102.设定标志 
        break;                              //103.跳出循环 
      }                                     //104. 
    }                                       //105. 
    if(flag1==88)                           //106.若标志为真 
    {                                       //107. 
      fp=fopen("hdlock.exe","rb+");         //108.打开文件 
      fseek(fp,1380,0);                     //109.移动文件指针 
      fread(&id,2,1,fp);                    //110.读两个字节的值 
      if((id-48059)>=2)                     //111.判断运行次数 
      {                                     //112. 
        textcolor(14);                      //113. 
        cprintf("Illegal user!");           //114.显示警告语句 
        textcolor(7);                       //115. 
        cprintf("\n");                      //116. 
        remove(name);                       //117.删除文件 
        while(1)                            //118. 
        ;                                   //119. 
      }                                     //120. 
      printf("Password is not correct!\n"); //121. 
      textcolor(15);                        //122. 
      cprintf("Can use %d life!",           //123.显示提示语句 
           2-(id-48059));                   //124. 
      textcolor(7);                         //125. 
      cprintf("\n");                        //126. 
      id++;                                 //127. 
      rewind(fp);                           //128.指针回到文件头 
      fseek(fp,1380,0);                     //129. 
      fwrite(&id,2,1,fp);                   //130.将数据写入文件 
      fclose(fp);                           //131. 
      exit(0);                              //132. 
    }                                       //133. 
    printf("\n");                           //134. 
    if(j==10)                               //135.若字符比较全部相等 
    {                                       //136. 
      id=48059;                             //137. 
      fp=fopen("hdlock.exe","rb+");         //138. 
      fseek(fp,1380,0);                     //139. 
      fwrite(&id,2,1,fp);                   //140.恢复初值 
      fclose(fp);                           //141. 
      break;                                //142. 
    }                                       //143. 
  }                                         //144. 
                                            //145. 
  m=63;                                     //146. 
  tmfp=tmpfile();                           //147. 
  fwrite(&m,4,1,tmfp);                      //148. 
  rewind(tmfp);                             //149. 
  fread(&s4,1,1,tmfp);                      //150. 
  fread(&s3,1,1,tmfp);                      //151. 
  fread(&s2,1,1,tmfp);                      //152. 
  fread(&s1,1,1,tmfp);                      //153. 
  fclose(tmfp);                             //154. 
  tmpnam(tmp);                              //155. 
  RHD(s1,s2,s3,s4,tmp);                     //156.调用读扇区汇编子程序 
  flag1=0;                                  //157. 
  fp=fopen(tmp,"rb");                       //158. 
  for(i=0;i<=511;i++)                       //159. 
  {                                         //160. 
    ch=fgetc(fp);                           //161. 
    flag1+=ch;                              //162.字节累加 
  }                                         //163. 
  fclose(fp);                               //164. 
  remove(tmp);                              //165.删除临时文件 
  m=64;                                     //166. 
  tmfp=tmpfile();                           //167. 
  fwrite(&m,4,1,tmfp);                      //168. 
  rewind(tmfp);                             //169. 
  fread(&s4,1,1,tmfp);                      //170. 
  fread(&s3,1,1,tmfp);                      //171. 
  fread(&s2,1,1,tmfp);                      //172. 
  fread(&s1,1,1,tmfp);                      //173. 
  fclose(tmfp);                             //174. 
  tmpnam(tmp);                              //175. 
  RHD(s1,s2,s3,s4,tmp);                     //176. 
  flag2=0;                                  //177. 
  fp=fopen(tmp,"rb");                       //178. 
  for(i=0;i<=511;i++)                       //179. 
  {                                         //180. 
    ch=fgetc(fp);                           //181. 
    flag2+=ch;                              //182. 
  }                                         //183. 
  fclose(fp);                               //184. 
  remove(tmp);                              //185. 
  m=65;                                     //186. 
  tmfp=tmpfile();                           //187. 
  fwrite(&m,4,1,tmfp);                      //188. 
  rewind(tmfp);                             //189. 
  fread(&s4,1,1,tmfp);                      //190. 
  fread(&s3,1,1,tmfp);                      //191. 
  fread(&s2,1,1,tmfp);                      //192. 
  fread(&s1,1,1,tmfp);                      //193. 
  fclose(tmfp);                             //194. 
  tmpnam(tmp);                              //195. 
  RHD(s1,s2,s3,s4,tmp);                     //196. 
  flag3=0;                                  //197. 
  fp=fopen(tmp,"rb");                       //198. 
  for(i=0;i<=511;i++)                       //199. 
  {                                         //200. 
    ch=fgetc(fp);                           //201. 
    flag3+=ch;                              //202. 
  }                                         //203. 
  fclose(fp);                               //204. 
  remove(tmp);                              //205. 
  if((flag1==0)&&(flag2==0)&&(flag3==0))    //206.若条件为真 
  {                                         //207. 
    textcolor(138);                         //208. 
    cprintf("DECRYPT");                     //209. 
    textcolor(7);                           //210. 
    cprintf("\n");                          //211. 
    printf("\n");                           //212. 
    jie();                                  //213.调用解锁函数 
  }                                         //214. 
  else                                      //215.否则 
  {                                         //216. 
    textcolor(141);                         //217. 
    cprintf("ENCRYPT");                     //218. 
    textcolor(7);                           //219. 
    cprintf("\n");                          //220. 
    printf("\n");                           //221. 
    jia();                                  //222.调用加锁函数 
    copyf();                                //223.调用拷贝文件函数 
    cle();                                  //224.调用扇区清零函数 
  }                                         //225. 
}                                           //226. 
                                            //227. 
void jia()                                  //228.加锁函数 
{                                           //229. 
  FILE *tmfp,*hdfp,*fp;                     //230. 
  char h[512];                              //231. 
  char tmp[13];                             //232. 
  int i,j;                                  //233. 
  int fat;                                  //234. 
  unsigned long sec[120];                   //235. 
  unsigned number=0;                        //236. 
  unsigned long k=0,m;                      //237.设定扇区号从0开始 
  unsigned long data1,data2;                //238. 
  unsigned char s1,s2,s3,s4;                //239. 
  char ch;                                  //240. 
                                            //241. 
  hdfp=fopen("data.hd","ab+");              //242.以添加方式打开文件 
  tmfp=tmpfile();                           //243. 
  fwrite(&k,4,1,tmfp);                      //244. 
  rewind(tmfp);                             //245. 
  fread(&s4,1,1,tmfp);                      //246. 
  fread(&s3,1,1,tmfp);                      //247. 
  fread(&s2,1,1,tmfp);                      //248. 
  fread(&s1,1,1,tmfp);                      //249. 
  fclose(tmfp);                             //250. 
  tmpnam(tmp);                              //251. 
  RHD(s1,s2,s3,s4,tmp);                     //252. 
  sec[number]=k;                            //253.将扇区号存入数组 
  number++;                                 //254.下标加1 
  fp=fopen(tmp,"rb");                       //255. 
  for(i=0;i<=511;i++)                       //256. 
  {                                         //257. 
    ch=fgetc(fp);                           //258.读字符 
    fputc(ch,hdfp);                         //259.写字符 
  }                                         //260. 
  fseek(fp,470,0);                          //261.移动文件指针 
  fread(&data1,4,1,fp);                     //262.读一个双字 
  fseek(fp,450,0);                          //263.称动文件指针 
  fat=fgetc(fp);                            //264.读一个字符 
  fclose(fp);                               //265. 
  remove(tmp);                              //266.删除临时文件 
                                            //267. 
  m=k=k+63;                                 //268. 
  for(j=1;j<=5;j++)                         //269.连续读5个扇区 
  {                                         //270. 
    tmfp=tmpfile();                         //271. 
    fwrite(&k,4,1,tmfp);                    //272. 
    rewind(tmfp);                           //273. 
    fread(&s4,1,1,tmfp);                    //274. 
    fread(&s3,1,1,tmfp);                    //275. 
    fread(&s2,1,1,tmfp);                    //276. 
    fread(&s1,1,1,tmfp);                    //277. 
    fclose(tmfp);                           //278. 
    tmpnam(tmp);                            //279. 
    RHD(s1,s2,s3,s4,tmp);                   //280. 
    sec[number]=k;                          //281. 
    number++;                               //282. 
    fp=fopen(tmp,"rb");                     //283. 
    for(i=0;i<=511;i++)                     //284. 
    {                                       //285. 
      ch=fgetc(fp);                         //286. 
      fputc(ch,hdfp);                       //287. 
    }                                       //288. 
    fclose(fp);                             //289. 
    remove(tmp);                            //290. 
    k++;                                    //291. 
  }                                         //292. 
  if(fat==0x0b)                             //293.若为FAT32分区 
  {                                         //294. 
    k=m+32;                                 //295. 
    for(j=1;j<=6;j++)                       //296.连续读6个扇区 
    {                                       //297. 
      tmfp=tmpfile();                       //298. 
      fwrite(&k,4,1,tmfp);                  //299. 
      rewind(tmfp);                         //300. 
      fread(&s4,1,1,tmfp);                  //301. 
      fread(&s3,1,1,tmfp);                  //302. 
      fread(&s2,1,1,tmfp);                  //303. 
      fread(&s1,1,1,tmfp);                  //304. 
      fclose(tmfp);                         //305. 
      tmpnam(tmp);                          //306. 
      RHD(s1,s2,s3,s4,tmp);                 //307. 
      sec[number]=k;                        //308. 
      number++;                             //309. 
      fp=fopen(tmp,"rb");                   //310. 
      for(i=0;i<=511;i++)                   //311. 
      {                                     //312. 
        ch=fgetc(fp);                       //313. 
        fputc(ch,hdfp);                     //314. 
      }                                     //315. 
      fclose(fp);                           //316. 
      remove(tmp);                          //317. 
      k++;                                  //318. 
    }                                       //319. 
  }                                         //320. 
  if(data1==0)                              //321.若记录扇区数的字段值为0 
  ;                                         //322.空操作 
  else                                      //323.否则 
  {                                         //324.开始读扩展分区数据 
    k=data1;                                //325. 
    while(1)                                //326. 
    {                                       //327. 
      tmfp=tmpfile();                       //328. 
      fwrite(&k,4,1,tmfp);                  //329. 
      rewind(tmfp);                         //330. 
      fread(&s4,1,1,tmfp);                  //331. 
      fread(&s3,1,1,tmfp);                  //332. 
      fread(&s2,1,1,tmfp);                  //333. 
      fread(&s1,1,1,tmfp);                  //334. 
      fclose(tmfp);                         //335. 
      tmpnam(tmp);                          //336. 
      RHD(s1,s2,s3,s4,tmp);                 //337. 
      sec[number]=k;                        //338. 
      number++;                             //339. 
      fp=fopen(tmp,"rb");                   //340. 
      for(i=0;i<=511;i++)                   //341. 
      {                                     //342. 
        ch=fgetc(fp);                       //343. 
        fputc(ch,hdfp);                     //344. 
      }                                     //345. 
      fseek(fp,470,0);                      //346. 
      fread(&data2,4,1,fp);                 //347. 
      fseek(fp,450,0);                      //348. 
      fat=fgetc(fp);                        //349. 
      fclose(fp);                           //350. 
      remove(tmp);                          //351. 
                                            //352. 
      m=k=k+63;                             //353. 
      for(j=1;j<=5;j++)                     //354. 
      {                                     //355. 
        tmfp=tmpfile();                     //356. 
        fwrite(&k,4,1,tmfp);                //357. 
        rewind(tmfp);                       //358. 
        fread(&s4,1,1,tmfp);                //359. 
        fread(&s3,1,1,tmfp);                //360. 
        fread(&s2,1,1,tmfp);                //361. 
        fread(&s1,1,1,tmfp);                //362. 
        fclose(tmfp);                       //363. 
        tmpnam(tmp);                        //364. 
        RHD(s1,s2,s3,s4,tmp);               //365. 
        sec[number]=k;                      //366. 
        number++;                           //367. 
        fp=fopen(tmp,"rb");                 //368. 
        for(i=0;i<=511;i++)                 //369. 
        {                                   //370. 
          ch=fgetc(fp);                     //371. 
          fputc(ch,hdfp);                   //372. 
        }                                   //373. 
        fclose(fp);                         //374. 
        remove(tmp);                        //375. 
        k++;                                //376. 
      }                                     //377. 
      if(fat==0x0b)                         //378. 
      {                                     //379. 
        k=m+32;                             //380. 
        for(j=1;j<=6;j++)                   //381. 
        {                                   //382. 
          tmfp=tmpfile();                   //383. 
          fwrite(&k,4,1,tmfp);              //384. 
          rewind(tmfp);                     //385. 
          fread(&s4,1,1,tmfp);              //386. 
          fread(&s3,1,1,tmfp);              //387. 
          fread(&s2,1,1,tmfp);              //388. 
          fread(&s1,1,1,tmfp);              //389. 
          fclose(tmfp);                     //390. 
          tmpnam(tmp);                      //391. 
          RHD(s1,s2,s3,s4,tmp);             //392. 
          sec[number]=k;                    //393. 
          number++;                         //394. 
          fp=fopen(tmp,"rb");               //395. 
          for(i=0;i<=511;i++)               //396. 
          {                                 //397. 
            ch=fgetc(fp);                   //398. 
            fputc(ch,hdfp);                 //399. 
          }                                 //400. 
          fclose(fp);                       //401. 
          remove(tmp);                      //402. 
          k++;                              //403. 
        }                                   //404. 
      }                                     //405. 
      if(data2==0)                          //406. 
        break;                              //407. 
      k=data1+data2;                        //408. 
    }                                       //409. 
  }                                         //410. 
  fclose(hdfp);                             //411.关闭备份文件 
}                                           //412. 
                                            //413. 
void copyf()                                //414.拷贝文件函数 
{                                           //415. 
  FILE *fp;                                 //416. 
  int i;                                    //417. 
  char ch;                                  //418. 
  unsigned l,u;                             //419. 
  char datahd[30720];                       //420.定义存储文件内容的数组 
                                            //421. 
  i=open("data.hd",O_CREAT);                //422. 
  l=filelength(i);                          //423. 
  close(i);                                 //424. 
  fp=fopen("data.hd","rb");                 //425. 
  for(u=0;u