编程技术、软件应用与系统模拟

(Programming, Applicaiton and Simulation)



本站目录

 

首页
ASP/Access/IIS
DELPHI/PASCAL
PASCAL高级编程
C语言编程实例
WORD
Excel
MATLAB
MINITAB讲座
Windows
DOS
SAS
生物系统模拟
土壤水分剖析器
其他



镜像站点

 

主站
北美镜象站
欧洲镜象站(1)
欧洲镜象站(2)

本站 Google

[搜索]  [站内导航]
座右铭:
只做有益人类的事
不做有害人类的事


机密文件的有效销毁程序

用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!");
     }
}

© 1998-, 董占山, 版权所有。
转载文章请注明出处(www.sunfinedata.com/articles)。