机密文件的有效销毁程序
用DOS命令DEL或ERASE删除一个DOS文件时,其实并未从磁盘上擦掉什么,只是简单地作了以下两方面的工作:
⑴将该文件目录登记项的第一个字节改为E5H,⑵将该文件在文件分配表簇号链下的各个簇域清零;而对磁盘
上存储的文件内容未做丝毫的改动,用DOS 5.0及以上版本提供的UNDELETE命令、PCTOOLS和
NORTONUTILITIES的UNERASE均可以轻易地将已删除的文件原样恢复,这对因误操作而删除的文件来说无疑是
一个极好的补救工具,但是,对于一些重要的机密文件来说,极易被不法用户恢复而导致泄密。怎样才能将磁
盘文件从物理上删除,而不能被别有用心的人恢复呢?
Norton Utilities和PC Tools都提供有实用程序,能够从物理上真正删除文件,而避免文件被恢复,导致泄
密。假如手头没有这类软件,使用下面的WIPE.C程序,可以实现同样的功能。
一、WIPE程序的设计原理
WIPE程序是按照美国国防部DOD5220.22M标准来擦掉需要删除的机密数据的,即首先将要删除的文件内容全
部写为'0',再被写为'1',如此重复3次,接着被写上一个随机值;再加上一个DOD标准中未说明的步骤,即
在删除文件之前,先将文件长度置为0,这使恢复机密文件的希望更为渺茫。
二、WIPE程序的使用方法
WIPE程序的命令行格式为:
WIPE <文件名>
WIPE程序需要将欲删除的文件名作为命令行参数。程序开始执行后,首先要求用户确认是否真的希望删除该文
件,如果您确认删除,那么就依照上述方法执行文件的删除操作。
三、源程序清单
/**********************************************************/
/* 程序名称: WIPE.C 1.00 */
/* 作 者: 董占山 */
/* 完成日期: 1992,1995 */
/* 用 途: 彻底删除磁盘文件 */
/* 编译方法: 用下列命令编译连接可以得到WIPE.COM: */
/* tcc -mt wipe */
/* tlink c:\tc\lib\c0t+wipe,wipe,,c:\tc\lib\cs\lib /t */
/**********************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
FILE *f;
int pass;
char ch;
/* 回答是否的函数 */
int YesNo(s)
char *s;
{
char c;
printf("%s (Y/N)?",s);
do {
c = toupper(getchar());
} while ((c!='Y') && (c!='N'));
if (c=='Y') return 1;
else return 0;
}
/* 显示程序的使用方法 */
void help()
{
printf("%s\n%s\n",
"Usage : Wipe a file's data absolutely",
"Syntex : WIPE <filename>");
exit(1);
}
/* 显示错误信息 */
void error(errno)
int errno;
{
printf("Error : ");
switch (errno) {
case 0 : printf("File not opened !\n");break;
case 1 : printf("File not renamed !\n");break;
case 2 : printf("File not read/writen !\n");break;
case 3 : printf("file not erased !\n");
}
exit(1);
}
/* 彻底擦除磁盘文件内容 */
void WipeWith(filename,c)
char *filename,c;
{
FILE *f;
long i,l;
unsigned int r=1;
if ((f = fopen(filename,"rb+"))==NULL) error(0);
do {
if (fwrite(c,1,r,f) != 1) error(2); /* 写文件 */
} while (!feof(f));
fclose(f);
}
/* 主程序 */
main(argc,argv)
int argc;
char *argv[];
{
char filename[MAXDIR];
printf("WIPE Version 1.0 Copyright (c) 1992,95 Dong Zhanshan\n");
if (argc!=2) help();
if (YesNo("Are you sure")==1) {
randomize();
strcpy(filename,argv[1]);
for (pass=0;pass<3;pass++) {
WipeWith(filename,'\0'); /* 将文件内容置0 */
WipeWith(filename,0x1); /* 将文件内容置1 */
WipeWith(filename,random(256)); /* 将文件内容置为一个随机值 */
f = fopen(filename,"w"); /* 将文件长度置零 */
fclose(f);
if (unlink(filename)!=0) error(3); /* 删除文件 */
printf("Done!");
}
}
|