www.pudn.com > hhdlock.rar > LOCKMAIN.C
//******************************************** //文件名:LOCKMAIN.C //功能:1. 调用显示汉字函数 // 2. 调用字符处理函数 // 3. 调用读扇区汇编子程序 // 4. 调用写扇区汇编子程序 // 5. 建立扇区数据备份文件 // 6. 将扇区清零对硬盘实行加锁 // 7. 将数据写回扇区对硬盘实行解锁 //******************************************** #include//1. #include //2. #include //3. #include //4. #include //5. #include //6. #include //7. #include //8. #include"port.h" //9.包含硬盘序列号头文件 #include"pw.h" //10.包含密钥头文件 extern RHD(int,int,int,int,char *); //11.声明读扇区汇编子程序 extern WHD(int,int,int,int,char *); //12.声明写扇区汇编子程序 int outhz(int,int,char *,int); //13.声明汉字显示函数 void finame(int,int); //14.声明字符处理函数 void jia(void); //15.声明加密函数 void jie(void); //16.声明解密函数 void copyf(void); //17.声明拷贝文件函数 void cle(void); //18.声明扇区清零函数 char name[13]; //19. //20. void main(int argc,char *argv[]) //21.带命令行参数的主函数 { //22. FILE *tmfp,*fp; //23. char ch; //24. char tmp[30]; //25. char pwh[11]; //26. int i,j,k,l; //27. unsigned num=48059; //28. long flag1,flag2,flag3; //29. unsigned long m; //30. unsigned char s1,s2,s3,s4; //31. char sh[21]; //32. unsigned id; //33. unsigned cw[257]; //34. long port=135792468; //35.设定序列号基数 long pw=135798642; //36.设定密钥基数 extern char gsh[16]; //37. int gdriver=DETECT,gmode; //38. registerbgidriver(EGAVGA_driver); //39. initgraph(&gdriver,&gmode,""); //40. setbkcolor(0); //41. cleardevice(); //42. //43. if(argc==1) //44.若命令行参数为1 strcpy(name,argv[0]); //45. else //46.否则 { //47. strcpy(tmp,"多余的参数:"); //48. strcat(tmp,argv[1]); //49. setviewport(0,20,200,60,0); //50. outhz(0,0,tmp,7); //51.调用汉字显示函数 outhz(0,20,"按任一键退出",7); //52. getch(); //53. closegraph(); //54. exit(0); //55. } //56. m=0; //57. outp(0x1f6,0xa0); //58. outp(0x1f7,0xec); //59. while(inp(0x1f7)!=0x58 && m++<0xffff) //60. ; //61. for(id=0;id!=256;id++) //62. cw[id]=inpw(0x1f0); //63. for(j=10,k=0;j<=19;j++) //64. { //65. sh[k++]=(char)(cw[j]/256); //66. sh[k++]=(char)(cw[j]%256); //67. } //68. sh[k]='\0'; //69. l=strlen(sh); //70. //71. for(i=0;i 0) //93. ; //94. flag1=0; //95. while(1) //96. { //97. setviewport(0,20,200,40,0); //98. outhz(0,0,"输入密钥:",7); //99.调用汉字显示函数 finame(90,20); //100.调用字符处理函数 strcpy(pwh,gsh); //101. strcpy(pwh,strupr(pwh)); //102.字符串转大写 for(i=0;i<10;i++) //103. { //104. srand(pw); //105. ch=rand(); //106. hdpw[i]=hdpw[i]^ch; //107. pw=pw+7; //108. } //109. j=0; //110. for(i=0;i<10;i++) //111. { //112. if(pwh[i]==hdpw[i]) //113.密钥字符若相等 j++; //114. else //115.否则 { //116. flag1=88; //117. break; //118. } //119. } //120. if(flag1==88) //121. { //122. fp=fopen("hhdlock.exe","rb+"); //123.以添加方式打开文件 fseek(fp,2362,0); //124.移动文件指针 fread(&id,2,1,fp); //125.读两个字节的值 if((id-48059)>=2) //126. { //127. cleardevice(); //128. setviewport(0,20,200,40,0); //129. outhz(0,0,"非法用户!",14); //130. remove(name); //131. while(1) //132. ; //133. } //134. setviewport(0,40,200,100,0); //135. outhz(0,0,"输入的密钥错误!",15); //136. strcpy(tmp,"剩余的输入密钥的次数:"); //137. i=2-(id-48059); //138. itoa(i,pwh,10); //139. strcat(tmp,pwh); //140. outhz(0,20,tmp,15); //141. id++; //142. rewind(fp); //143. fseek(fp,2362,0); //144. fwrite(&id,2,1,fp); //145. fclose(fp); //146. outhz(0,40,"按任一键退出",7); //147. getch(); //148. closegraph(); //149. exit(0); //150. } //151. printf("\n"); //152. if(j==10) //153. { //154. id=48059; //155. fp=fopen("hhdlock.exe","rb+"); //156. fseek(fp,2362,0); //157. fwrite(&id,2,1,fp); //158.恢复原来的值 fclose(fp); //159. break; //160. } //161. } //162. //163. m=63; //164. tmfp=tmpfile(); //165. fwrite(&m,4,1,tmfp); //166. rewind(tmfp); //167. fread(&s4,1,1,tmfp); //168. fread(&s3,1,1,tmfp); //169. fread(&s2,1,1,tmfp); //170. fread(&s1,1,1,tmfp); //171. fclose(tmfp); //172. tmpnam(tmp); //173. RHD(s1,s2,s3,s4,tmp); //174. flag1=0; //175. fp=fopen(tmp,"rb"); //176. for(i=0;i<=511;i++) //177. { //178. ch=fgetc(fp); //179. flag1+=ch; //180. } //181. fclose(fp); //182. remove(tmp); //183. m=64; //184. tmfp=tmpfile(); //185. fwrite(&m,4,1,tmfp); //186. rewind(tmfp); //187. fread(&s4,1,1,tmfp); //188. fread(&s3,1,1,tmfp); //189. fread(&s2,1,1,tmfp); //190. fread(&s1,1,1,tmfp); //191. fclose(tmfp); //192. tmpnam(tmp); //193. RHD(s1,s2,s3,s4,tmp); //194. flag2=0; //195. fp=fopen(tmp,"rb"); //196. for(i=0;i<=511;i++) //197. { //198. ch=fgetc(fp); //199. flag2+=ch; //200. } //201. fclose(fp); //202. remove(tmp); //203. m=65; //204. tmfp=tmpfile(); //205. fwrite(&m,4,1,tmfp); //206. rewind(tmfp); //207. fread(&s4,1,1,tmfp); //208. fread(&s3,1,1,tmfp); //209. fread(&s2,1,1,tmfp); //210. fread(&s1,1,1,tmfp); //211. fclose(tmfp); //212. tmpnam(tmp); //213. RHD(s1,s2,s3,s4,tmp); //214. flag3=0; //215. fp=fopen(tmp,"rb"); //216. for(i=0;i<=511;i++) //217. { //218. ch=fgetc(fp); //219. flag3+=ch; //220. } //221. fclose(fp); //222. remove(tmp); //223. if((flag1==0)&&(flag2==0)&&(flag3==0)) //224. { //225. setviewport(0,40,200,80,0); //226. outhz(0,0,"正在解锁,请稍等",10); //227. jie(); //228. outhz(0,40,"解锁成功",15); //229. outhz(0,60,"按任一键退出",7); //230. getch(); //231. closegraph(); //232. } //233. else //234. { //235. if((fp=fopen("data.hd","rb"))!=NULL) //236.检测文件名 { //237. fclose(fp); //238. cleardevice(); //239. setviewport(0,20,620,60,0); //240. outhz(0,20,"[data.hd]文件已在当前" //241. "目录中,请先将其删除或移走,再" //242. "运行程序",7); //243. outhz(0,40,"按任一键退出",7); //244. getch(); //245. closegraph(); //246. exit(0); //247. } //248. setviewport(0,40,200,60,0); //249. outhz(0,0,"正在加锁,请稍等",13); //250. jia(); //251. copyf(); //252. cle(); //253. setviewport(0,80,200,120,0); //254. outhz(0,20,"加锁成功",15); //255. outhz(0,40,"按任一键退出",7); //256. getch(); //257. closegraph(); //258. } //259. } //260. char gsh[16]; //261. //262. void jia() //263. { //264. FILE *tmfp,*hdfp,*fp; //265. char h[512]; //266. char tmp[13]; //267. int i,j; //268. int fat; //269. unsigned long sec[120]; //270. unsigned number=0; //271. unsigned long k=0,m; //272. unsigned long data1,data2; //273. unsigned char s1,s2,s3,s4; //274. char ch; //275. //276. hdfp=fopen("data.hd","ab+"); //277.以添加方式打开文件 tmfp=tmpfile(); //278. fwrite(&k,4,1,tmfp); //279. rewind(tmfp); //280. fread(&s4,1,1,tmfp); //281. fread(&s3,1,1,tmfp); //282. fread(&s2,1,1,tmfp); //283. fread(&s1,1,1,tmfp); //284. fclose(tmfp); //285. tmpnam(tmp); //286. RHD(s1,s2,s3,s4,tmp); //287. sec[number]=k; //288. number++; //289. fp=fopen(tmp,"rb"); //290. for(i=0;i<=511;i++) //291. { //292. ch=fgetc(fp); //293. fputc(ch,hdfp); //294. } //295. fseek(fp,470,0); //296. fread(&data1,4,1,fp); //297.读扇区数字段值 fseek(fp,450,0); //298. fat=fgetc(fp); //299.读分区格式字段值 fclose(fp); //300. remove(tmp); //301. //302. m=k=k+63; //303. for(j=1;j<=5;j++) //304. { //305. tmfp=tmpfile(); //306. fwrite(&k,4,1,tmfp); //307. rewind(tmfp); //308. fread(&s4,1,1,tmfp); //309. fread(&s3,1,1,tmfp); //310. fread(&s2,1,1,tmfp); //311. fread(&s1,1,1,tmfp); //312. fclose(tmfp); //313. tmpnam(tmp); //314. RHD(s1,s2,s3,s4,tmp); //315. sec[number]=k; //316. number++; //317. fp=fopen(tmp,"rb"); //318. for(i=0;i<=511;i++) //319. { //320. ch=fgetc(fp); //321. fputc(ch,hdfp); //322. } //323. fclose(fp); //324. remove(tmp); //325. k++; //326. } //327. if(fat==0x0b) //328.若是FAT32分区 { //329. k=m+32; //330. for(j=1;j<=6;j++) //331. { //332. tmfp=tmpfile(); //333. fwrite(&k,4,1,tmfp); //334. rewind(tmfp); //335. fread(&s4,1,1,tmfp); //336. fread(&s3,1,1,tmfp); //337. fread(&s2,1,1,tmfp); //338. fread(&s1,1,1,tmfp); //339. fclose(tmfp); //340. tmpnam(tmp); //341. RHD(s1,s2,s3,s4,tmp); //342. sec[number]=k; //343. number++; //344. fp=fopen(tmp,"rb"); //345. for(i=0;i<=511;i++) //346. { //347. ch=fgetc(fp); //348. fputc(ch,hdfp); //349. } //350. fclose(fp); //351. remove(tmp); //352. k++; //353. } //354. } //355. if(data1==0) //356. ; //357. else //358. { //359. k=data1; //360. while(1) //361. { //362. tmfp=tmpfile(); //363. fwrite(&k,4,1,tmfp); //364. rewind(tmfp); //365. fread(&s4,1,1,tmfp); //366. fread(&s3,1,1,tmfp); //367. fread(&s2,1,1,tmfp); //368. fread(&s1,1,1,tmfp); //369. fclose(tmfp); //370. tmpnam(tmp); //371. RHD(s1,s2,s3,s4,tmp); //372. sec[number]=k; //373. number++; //374. fp=fopen(tmp,"rb"); //375. for(i=0;i<=511;i++) //376. { //377. ch=fgetc(fp); //378. fputc(ch,hdfp); //379. } //380. fseek(fp,470,0); //381. fread(&data2,4,1,fp); //382. fseek(fp,450,0); //383. fat=fgetc(fp); //384. fclose(fp); //385. remove(tmp); //386. //387. m=k=k+63; //388. for(j=1;j<=5;j++) //389. { //390. tmfp=tmpfile(); //391. fwrite(&k,4,1,tmfp); //392. rewind(tmfp); //393. fread(&s4,1,1,tmfp); //394. fread(&s3,1,1,tmfp); //395. fread(&s2,1,1,tmfp); //396. fread(&s1,1,1,tmfp); //397. fclose(tmfp); //398. tmpnam(tmp); //399. RHD(s1,s2,s3,s4,tmp); //400. sec[number]=k; //401. number++; //402. fp=fopen(tmp,"rb"); //403. for(i=0;i<=511;i++) //404. { //405. ch=fgetc(fp); //406. fputc(ch,hdfp); //407. } //408. fclose(fp); //409. remove(tmp); //410. k++; //411. } //412. if(fat==0x0b) //413. { //414. k=m+32; //415. for(j=1;j<=6;j++) //416. { //417. tmfp=tmpfile(); //418. fwrite(&k,4,1,tmfp); //419. rewind(tmfp); //420. fread(&s4,1,1,tmfp); //421. fread(&s3,1,1,tmfp); //422. fread(&s2,1,1,tmfp); //423. fread(&s1,1,1,tmfp); //424. fclose(tmfp); //425. tmpnam(tmp); //426. RHD(s1,s2,s3,s4,tmp); //427. sec[number]=k; //428. number++; //429. fp=fopen(tmp,"rb"); //430. for(i=0;i<=511;i++) //431. { //432. ch=fgetc(fp); //433. fputc(ch,hdfp); //434. } //435. fclose(fp); //436. remove(tmp); //437. k++; //438. } //439. } //440. if(data2==0) //441. break; //442. k=data1+data2; //443. } //444. } //445. fclose(hdfp); //446. } //447. //448. void copyf() //449.拷贝文件函数 { //450. FILE *fp; //451. int i; //452. char ch; //453. unsigned l,u; //454. char datahd[30720]; //455. //456. i=open("data.hd",O_CREAT); //457. l=filelength(i); //458. close(i); //459. fp=fopen("data.hd","rb"); //460. for(u=0;u