📄 sdel-lib.cpp
字号:
#include "sdel-lib.h"
//
// STARTING FUNCTIONS
//
void __sdel_fill_buf(char pattern[3], unsigned long bufsize, char *buf)
{
int loop;
int where;
for (loop = 0; loop < (bufsize / 3); loop++)
{
where = loop * 3;
*buf++ = pattern[0];
*buf++ = pattern[1];
*buf++ = pattern[2];
}
}
void __sdel_random_buf(unsigned long bufsize, char *buf)
{
int loop;
if (devrandom == NULL)
for (loop = 0; loop < bufsize; loop++)
*buf++ = (unsigned char) (256.0*rand()/(RAND_MAX+1.0));
else
fread(buf, bufsize, 1, devrandom);//bufsize指出读的字节数,1个单位的bufsize;
}
void __sdel_random_filename(char *filename)
{
int i;
for (i = strlen(filename) - 1;
(filename[i] != DIR_SEPERATOR) && (i >= 0);
i--)
if (filename[i] != '.') /* keep dots in the filename */
filename[i] = 97+(int) ((int) ((256.0 * rand()) / (RAND_MAX + 1.0)) % 26);
}
void sdel_init(int secure_random)
{
(void) setvbuf(stdout, NULL, _IONBF, 0);//关闭标准输出文件的缓冲,程序不用缓冲输出
(void) setvbuf(stderr, NULL, _IONBF, 0);//关闭标准出错文件的缓冲,出错不用缓冲输出
if (BLOCKSIZE<16384)//BLOCKSIZE在config.h头文件中定义
fprintf(stderr, "Programming Warning: in-compiled blocksize is <16k !\n");
if (BLOCKSIZE % 3 > 0)
fprintf(stderr, "Programming Error: in-compiled blocksize is not a multiple of 3!\n");
srand( (getpid()+getuid()+getgid()) ^ time(0) );//播下一个随机发生器的种子
devrandom = NULL;
#ifdef RANDOM_DEVICE
if (secure_random)
{
if ((devrandom = fopen(RANDOM_DEVICE, "r")) != NULL)
if (verbose)
printf("Using %s for random input.\n", RANDOM_DEVICE);
}
#endif
__internal_sdel_init = 1;
}
void sdel_finnish()
{
if (devrandom != NULL)
{
fclose(devrandom);
devrandom = NULL;
}
if (! __internal_sdel_init)
{
fprintf(stderr, "Programming Error: sdel-lib was not initialized before calling sdel_finnish().\n");
return;
}
__internal_sdel_init = 0;
}
/*int Gutman_overwrite(int mode,int fd,long start,unsigned long bufsize,unsigned long length)
{
unsigned long writes;
unsigned long counter;
int turn;
int last;
char buf[65535];
FILE *f;
if(!__internal_sdel_init)
fprintf(stderr,"Programming Error:sdel_lib was not initialized before sdel_overwrite().\n");
if((f=fdopen(fd,"r+b"))==NULL)
return -1;
if(length>0)
writes=(1+(length/bufsize));
else
writes=0;
if(start==0)
rewind(f);
else
if(fseek(f,start,SEEK_SET)!=0)
return -1;
if(mode==0)
printf("Gutman's mothod:\n");
for(turn=1;turn<=35;turn++)
{
if(start==0)
rewind(f);
else
if(fseek(f,start,SEEK_SET)!=0)
return -1;
if((turn>=5)&&(turn<=31))
{
__sdel_fill_buf(write_modes[turn-5],bufsize,buf);
if(writes>0)
for(counter=1;counter<=writes;counter++)
fwrite(&buf,1,bufsize,f);
else
do{}while(fwrite(&buf,1,bufsize,f)==bufsize);
}
else
{
if(writes>0)
{
for(counter=1;counter<=writes;counter++)
{
__sdel_random_buf(bufsize,buf);
fwrite(&buf,1,bufsize,f);
}
}
else
{
do
{
__sdel_random_buf(bufsize,buf);
}while(fwrite(&buf,1,bufsize,f)==bufsize);
}
}
fflush(f);
if(fsync(fd)<0)
FLUSH;
printf("*");
}
(void)fclose(f);
FLUSH;
return 0;
}*/
/*int Acpos_overwrite(int mode,int fd,long start,unsigned long bufsize,unsigned long length)
{
unsigned long writes;
unsigned long counter;
int turn;
int last;
char buf[65535];
FILE *f;
if(!__internal_sdel_init)
fprintf(stderr,"Programming Error:sdel_lib was not initialized before sdel_overwrite().\n");
if((f=fdopen(fd,"r+b"))==NULL)
return -1;
if(length>0)
writes=(1+(length/bufsize));
else
writes=0;
if(start==0)
rewind(f);
else
if(fseek(f,start,SEEK_SET)!=0)
return -1;
if(mode==1)
printf("American country peaceful overall situation method:\n");
for(turn=1;turn<=7;turn++)
{
if(start==0)
rewind(f);
else
if(fseek(f,start,SEEK_SET)!=0)
return -1;
if(writes>0)
{
for(counter=1;counter<=writes;counter++)
{
__sdel_random_buf(bufsize,buf);
fwrite(&buf,1,bufsize,f);
}
}
else
{
do
{
__sdel_random_buf(bufsize,buf);
}while(fwrite(&buf,1,bufsize,f)==bufsize);
}
fflush(f);
if(fsync(fd)<0)
FLUSH;
printf("*");
}
(void)fclose(f);
FLUSH;
return 0;
}*/
/*int Bruce_schneier_overwrite(int mode,int fd,long start,unsigned long bufsize,unsigned long length)
{
unsigned long writes;
unsigned long counter;
int turn;
int last;
char buf[65535];
FILE *f;
if(!__internal_sdel_init)
fprintf(stderr,"Programming Error:sdel_lib was not initialized before sdel_overwrite().\n");
if((f=fdopen(fd,"r+b"))==NULL)
return -1;
if(length>0)
writes=(1+(length/bufsize));
else
writes=0;
if(start==0)
rewind(f);
else
if(fseek(f,start,SEEK_SET)!=0)
return -1;
if(mode==2)
printf("Bruce schneier method:\n");
for(turn=1;turn<=7;turn++)
{
if(start==0)
rewind(f);
else
if(fseek(f,start,SEEK_SET)!=0)
return -1;
if(turn==1)
{
__sdel_fill_buf(std_array_00,bufsize,buf);
if(writes>0)
for(counter=1;counter<=writes;counter++)
fwrite(&buf,1,bufsize,f);
else
do{}while(fwrite(&buf,1,bufsize,f)==bufsize);
}
else if(turn==2)
{
__sdel_fill_buf(std_array_ff,bufsize,buf);
if(writes>0)
for(counter=1;counter<=writes;counter++)
fwrite(&buf,1,bufsize,f);
else
do{}while(fwrite(&buf,1,bufsize,f)==bufsize);
}
else
{
if(writes>0)
{
for(counter=1;counter<=writes;counter++)
{
__sdel_random_buf(bufsize,buf);
fwrite(&buf,1,bufsize,f);
}
}
else
{
do
{
__sdel_random_buf(bufsize,buf);
}while(fwrite(&buf,1,bufsize,f)==bufsize);
}
}
fflush(f);
if(fsync(fd)<0)
FLUSH;
printf("*");
}
(void)fclose(f);
FLUSH;
return 0;
}*/int Dob_overwrite(int mode ,int fd,long start,unsigned long bufsize,unsigned long length){ unsigned long writes;
unsigned long counter;
int turn;
int last;
char buf[65535];
FILE *f;
if(!__internal_sdel_init)
fprintf(stderr,"Programming Error:sdel_lib was not initialized before sdel_overwrite().\n");
if((f=fdopen(fd,"r+b"))==NULL)
return -1;
if(length>0)
writes=(1+(length/bufsize));
else
writes=0;
if(start==0)
rewind(f);
else
if(fseek(f,start,SEEK_SET)!=0)
return -1;
if(mode==3)
printf("Dob's method:\n");
for(turn=1;turn<=3;turn++)
{
if(start==0)
rewind(f);
else
if(fseek(f,start,SEEK_SET)!=0)
return -1;
if(writes>0)
{
for(counter=1;counter<=writes;counter++)
{
__sdel_random_buf(bufsize,buf);
fwrite(&buf,1,bufsize,f);
}
}
else
{
do
{
__sdel_random_buf(bufsize,buf);
}while(fwrite(&buf,1,bufsize,f)==bufsize);
}
fflush(f);
if(fsync(fd)<0)
FLUSH;
printf("*");
}
(void)fclose(f);
FLUSH;
return 0;
}
int sdel_overwrite(int mode,int fd,long start,unsigned long bufsize,unsigned long length)
{
/*if(mode==0)
return Gutman_overwrite(mode,fd,start,bufsize,length);
if(mode==1)
return Acpos_overwrite(mode,fd,start,bufsize,length);
if(mode==2)
return Bruce_schneier_overwrite(mode,fd,start,bufsize,length);*/ if(mode==3) return Dob_overwrite(mode,fd,start,bufsize,length);
else
return -1;
}
int sdel_unlink(char *filename, int directory, int truncate, int slow)
{
int fd;
int turn = 0;
int result;
char newname[strlen(filename) + 1];
struct stat filestat;//与文件相关的机构体
/* open + truncating the file, so an attacker doesn't know the diskblocks */
if (! directory && truncate)
if ((fd = open(filename, O_WRONLY | O_TRUNC | slow)) >= 0)
close(fd);
/* Generate random unique name, renaming and deleting of the file */
strcpy(newname, filename); // not a buffer overflow as it has got the exact length
do
{
__sdel_random_filename(newname);
if ((result = lstat(newname, &filestat)) >= 0)//lstat返回文件链接信息
turn++;
} while ((result >= 0) && (turn <= 100));
if (turn <= 100)
{
result = rename(filename, newname);//重命名文件,成功返回0
if (result != 0)
{
fprintf(stderr, "Warning: Couldn't rename %s - ", filename);
perror("");
strcpy(newname, filename);
}
}
else
{
fprintf(stderr,"Warning: Couldn't find a free filename for %s!\n",filename);
strcpy(newname, filename);
}
if (directory)
{
result = rmdir(newname);//rmdir删除文件目录,成功返回0
if (result)
{
printf("Warning: Unable to remove directory %s - ", filename);
perror("");
(void) rename(newname, filename);
}
else
if (verbose)
printf("Removed directory %s ...", filename);
}
else
{
result = unlink(newname);
if (result)
{
printf("Warning: Unable to unlink file %s - ", filename);
perror("");
(void) rename(newname, filename);
} else
if (verbose)
printf(" Removed file %s ...", filename);
}
if (result != 0)
return -1;
return 0;
}
/*void sdel_wipe_inodes(char *loc, char **array) { char *template = malloc(strlen(loc) + 16); int i = 0; int fail = 0; int fd; if (verbose) printf("Wiping inodes ..."); array = malloc(MAXINODEWIPE * sizeof(template)); strcpy(template, loc); if (loc[strlen(loc) - 1] != '/') strcat(template, "/"); strcat(template, "xxxxxxxx.xxx"); while(i < MAXINODEWIPE && fail < 5) { __sdel_random_filename(template); if (open(template, O_CREAT | O_EXCL | O_WRONLY, 0600) < 0) fail++; else { array[i] = malloc(strlen(template)); strcpy(array[i], template); i++; } } FLUSH; if (fail < 5) { fprintf(stderr, "Warning: could not wipe all inodes!\n"); } array[i] = NULL; fd = 0; while(fd < i) { unlink(array[fd]); free(array[fd]); fd++; } free(array); array = NULL; FLUSH; if (verbose) printf(" Done ... ");}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -