⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdel-lib.cpp

📁 linux内核 相当好的不得了的书 非常以及很特别的使用
💻 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 + -