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;i 0) //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