Глава – 15
Программирование для очистителей данных
Введение
Мы уже обсуждали это, когда мы удаляем любой файл с диска, информация с диска не стирается полностью, а помечается как доступная для записи новых данных поверх него.
Когда мы форматируем диск, вся информация о файлах и каталогах диска, такая как FAT и записи корневого каталога, стирается, но область данных остается неизменной, и ничего из области данных диска не стирается. Данные, удаленные или отформатированные с помощью операционной системы, остаются в области данных как есть и могут быть восстановлены с помощью некоторых усилий по восстановлению данных и программного обеспечения для восстановления данных.
Поэтому необходимость полного удаления данных с диска приводит к потребности в такой программе, которая полностью стирает данные с диска. Для этого недостаточно просто удалить файлы или просто отформатировать диск, данные на диске должны быть перезаписаны какими-то другими данными.
Программы, которые используются для полного удаления данных с диска, называются программами очистки данных. Эти программы записывают случайные символы в области данных, чтобы перезаписать данные и стереть всю информацию, ранее сохраненную на диске.
Когда данные становятся полностью невосстановимыми
Чтобы стереть данные, область данных на диске должна быть перезаписана некоторыми другими данными на нем, но проблема на этом не заканчивается. Еще больше усложняет ситуацию то, что склонность магнитных накопителей запоминать данные, которые были перезаписаны, требует, чтобы данные также несколько раз перезаписывались случайными последовательностями данных, чтобы их нельзя было восстановить даже с помощью сложных инструментов восстановления данных
Это так, потому что сегодня доступны технологии, которые могут восстанавливать данные даже после использования некоторых простых очистителей данных.
Некоторые продукты для удаления данных перезаписывают данные двоичными нулями и двоичными единицами. Запись серии двоичных нулей и двоичных единиц обеспечивает самый глубокий эффект перезаписи, поскольку эти значения являются минимальным и максимальным магнитными значениями соответственно.
Хотя это и есть теория идеальной программы для удаления данных, в целом достаточно перезаписывания данных случайным символом ASCII. Причина в том, что восстановление с помощью сложных инструментов и технологий восстановления не может быть использовано для восстановления данных любой организации для рутинного восстановления данных, потому что эти технологии очень дороги и стоят миллионы даже для одного восстановления. Не только это, но и эти технологии доступны только в нескольких странах мира.
Мы обсудим только простую перезапись данных для стирания данных с диска. Однако вы можете дополнительно модифицировать те же программы, чтобы записывать случайные символы, только с небольшими усилиями. Данные, уничтоженные этой идеей, также не могут быть восстановлены никаким программным обеспечением для восстановления данных.
Почему стирание данных так важно
Когда мы обсуждаем методы восстановления данных, мы заверяем пользователя, что данные могут быть восстановлены с помощью некоторых общих или определенных усилий по восстановлению данных. Но восстановление данных не всегда является желаемой и ожидаемой функцией для всех.
Может быть много людей или организаций, которые всегда готовы стереть данные со своего диска таким образом, чтобы их нельзя было восстановить каким-либо образом. В таких случаях на диске ранее могли храниться очень важные данные, которые, если попадут в чужие руки, могут нанести вред организации или пользователю из-за неправильного использования информации.
Как мы знаем, потребность во все большем и большем пространстве на жестких дисках растет день ото дня. В результате старые диски малой емкости заменяются новыми дисками большой емкости каждый год в больших масштабах почти в каждой организации. Если эти старые диски попадут в чужие руки, это может создать очень серьезную проблему для этой организации.
Согласно новостям, опубликованным CNET News.com, 16 января 2003 г. студенты Массачусетского технологического института Саймон Гарфинкель и Эбби Шелат покупали старые жесткие диски во имя исследований в Интернете и других бывших в употреблении устройствах. продажи, чтобы раскрыть огромное количество личной информации, которую люди не удосуживаются стереть.
После покупки 158 дисков примерно за 1000 долларов США им удалось собрать более 5000 номеров кредитных карт, медицинские записи, подробную личную и корпоративную финансовую информацию, а также несколько гигабайт электронных писем, исходные коды и другую информацию.
Эти студенты объединили свои выводы в отчет под названием "Воспоминание о переданных данных: исследование очистки диска" опубликовано в февральском выпуске IEEE Security and Privacy.
Основные выводы исследования заключаются в том, что рынок бывших в употреблении жестких дисков заполнен личной информацией, поэтому злоумышленнику очень легко выдать себя за другого человека.
Написание программы для неразрушающей очистки данных
Неразрушающий очиститель данных — это своего рода программа очистки данных, с помощью которой мы можем стереть все “нераспределенное пространство” объема диска, никоим образом не повреждая данные, хранящиеся на диске.
Сфера действия такой очистки данных — в тех случаях, когда вы хотите стереть все нераспределенное пространство тома диска, в то время как выделенные данные, хранящиеся в томе, должны оставаться нетронутыми. Этот тип программы очистки данных также стирает область данных удаленных файлов.
Программный код для типа не – Далее была дана деструктивная программа очистки данных:
///// Программа для неразрушающей очистки данных \\\\\
#include <stdio.h>
unsigned int file_num=0; /* Provides File Number
During the Auto Creation
of Temporary Data files */
float status=0; /* How Much Disk space is
still Written */
static char dbuf[40000]; /* Data Buffer to write
Temporary Files with */
char file_extension[5]=".ptt";/* Unique Extensions for
Temporary Files */
char temp[5]; /* File Number converted to
String */
char filename[40]; /* Temporary File name */
void main()
{
unsigned int i=0;
clrscr();
while(i<40000)
{
dbuf[i] = ' ';
i++;
}
gotoxy(10,14);cprintf(" MB Still Written...");
while(1)
{
/* Логика автоматического создания временных файлов с уникальным именем */
strcpy(filename,"TTPT");
itoa(file_num,temp,10);
strcat(filename,temp);
strcat(filename,file_extension);
file_num++;
write_to_temp(filename);
}
} //// End of Main \\\\
///// Функция для записи данных во временный файл \\\\\
write_to_temp(char *filename)
{
unsigned int i, count=1;
float buf_status=0;
FILE *tt;
if((tt=fopen(filename,"wb"))==NULL)
{
fclose(tt);
printf("\n Error occurred while creating temporary
file, ");
printf("\n Removing temporery Files After KEY BOARD
HIT");
getch();
remove_temp_file();/* Remove All temporary files */
}
while(1)
{
for(i=0;i<50;i++)
{
fprintf(tt,"%s",dbuf);
}
buf_status = (float)((40000*50*count)/512);
status= status+(40000*50);
count++;
gotoxy(10,14);
cprintf("%.0f",(float)(status/1000000));
if(kbhit())
{
fclose(tt);
printf("\n Removing Temporery Files, Please
Wait...");
remove_temp_file();
}
if(buf_status>=10000)
{
fclose(tt);
return;
}
}
}
/* Функция автоматического удаления временных файлов */
remove_temp_file()
{
int i=0;
for(i=0;i<=file_num;i++)
{
strcpy(filename,"TTPT");
itoa(i,temp,10);
strcat(filename,temp);
strcat(filename,file_extension);
remove(filename);
}
exit(1);
return 0;
}
Комментарии по логике и кодировке программы:
В этой программе в основном мы выполняем следующие два шага, чтобы стереть нераспределенное пространство диска:
- Автоматически создавать временные файлы данных: сначала мы создаем временные файлы с уникальными именами и содержащими в них некоторые данные до тех пор, пока объем диска не будет заполнен этими временными файлами данных. При этом вся нераспределенная область данных логического диска будет занята данными временных файлов, а все нераспределенные данные будут перезаписаны.
Для этого я выбрал имена временных файлов в формате TTPTxxxx.PTT, что означает, что первые четыре символа временных файлов — TTPT, а расширение файлов — .PTT. Это делается для того, чтобы предоставить временным файлам уникальные имена файлов.
Я установил максимальный размер одного временного файла, эквивалентный примерно 11 718 секторам данных, однако вы можете определить его по своему усмотрению. Я выбрал пробел “ ” (символ ASCII 32) для заполнения данных во временных файлах. Однако вместо пробела можно использовать и случайные символы.
- Удалить все временные файлы: когда логический диск заполнен временными файлами, это означает, что вся нераспределенная область данных теперь перезаписана. Теперь все временные файлы, созданные программой, удаляются автоматически. Таким образом достигается стирание нераспределенного пространства.
В коде программы имя файла массива символов хранит имя файла для автоматического создания временных файлов с разными именами.
Функция write_to_temp(имя файла); заполняет временный файл до 11 718 секторов (поскольку в указанной групповой записи буфера не встречается 10 000 секторов) эквивалентными данными с помощью буфера данных dbuf размером 40 000 байт. Буфер данных записывается 50 раз за раз для ускорения записи.
Временные файлы создаются до тех пор, пока не заполнится том диска и не возникнет ошибка создания файла. Функция remove_temp_file() удаляет все временные файлы, созданные программой.
Таким образом, все нераспределенное пространство стирается без ущерба для данных тома диска.
Написание программы для Destructive Data Wiper:
Программы деструктивной очистки данных — это программы, которые записывают данные непосредственно на поверхность диска. Этот тип программ очистки данных работает на более низком уровне, чем файловая система и операционная система, что означает, что все данные и другая логическая информация, включая ОС, файловые системы, запись в каталоге и все, что записано на диск, стираются.
Эти программы очистки данных стирают непосредственно секторы поверхности диска и стирают все записанное на нем. Поскольку все данные на диске, включая операционную систему, теряются, эти программы называются деструктивными программами очистки данных.
Эти типы программ очистки предпочтительны в тех случаях, когда пользователь хочет перезаписать все на диске, включая операционную систему и все данные на диске.
Однако у этого типа программ очистки данных есть еще несколько преимуществ. Поскольку эти деструктивные программы очистки данных работают совершенно независимо от операционной системы и файловой системы и записывают данные непосредственно на поверхность диска, они работают значительно быстрее, чем недеструктивные программы очистки данных.
Кроме того, если какие-либо логические сбойные сектора на диске создаются из-за незаконного хранения некоторых случайных данных, эти логические сбойные сектора также полностью стираются с данными на диске.
Далее указан код деструктивной программы очистки данных. Программа была написана для поддержки дисков большого размера. Программа стирает данные второго физического жесткого диска, подключенного к компьютеру.
///// Кодирование деструктивной программы очистки данных \\\\\
#include<stdio.h>
#include<dos.h>
/* Структура, используемая функцией getdrivegeometry с использованием расширения INT 13H, номер функции 0x48. */
struct geometry
{
unsigned int size ; /* (call) size of Buffer */
unsigned int flags ; /* Information Flags */
unsigned long cyl ; /* Number of Physical Cylinders on
Drive */
unsigned long heads ;/* Number of Physical Heads on
Drive */
unsigned long spt ; /* Number of Physical Sectors Per
Track */
unsigned long sectors[2] ; /* Total Number of
Sectors on Drive */
unsigned int bps ; /* Bytes Per Sector */
} ;
/* Структура формата пакета адреса диска, который будет использоваться функцией writeabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Size of Packet,
generally 10H */
char reserved ; /* Reserved (0) */
int blockcount ; /* Number of Blocks to
Transfer */
char far *bufferaddress ; /* address to Transfer
Buffer */
unsigned long blocknumber[2] ; /* Starting Absolute
Block Number */
} ;
///// Функция для получения параметров привода \\\\\
unsigned long getdrivegeometry (int drive)
{
union REGS i, o ;
struct SREGS s ;
struct geometry g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
i.h.ah = 0x48 ; /* Function Number 0x48 of INT 13H
Extensions */
i.h.dl = drive; /* Drive Number */
i.x.si = FP_OFF ( (void far*)&g ) ;
s.ds = FP_SEG ( (void far*)&g ) ;
/* Вызвать указанный номер функции расширения INT 13H со значениями регистра сегмента */
int86x ( 0x13, &i, &o, &s ) ;
printf("\n Head = %lu, Sectors Per Track = %lu, Cylinder =
%lu\n",
g.heads,g.spt,g.cyl);
/* Если получить функцию геометрии диска не удается, отобразите сообщение об ошибке и выйдите */
if(g.spt==0)
{
printf("\n Get Drive Geometry Function Fails....");
printf("\n Extensions Not Supported, Press any Key to
Exit...");
getch();
exit(1);
}
return *g.sectors; /* Return The Number of
Sectors on Drive */
}
void main()
{
unsigned long loop=0, Sectors_in_ HDD2=0;
unsigned char buffer[61440]; /* Data buffer of 61440
bytes Equivalent to
120 Sectors */
unsigned long i=0;
char choice;
clrscr();
/* Если общее количество подключенных жестких дисков меньше двух Показать сообщение об ошибке и выйти. */
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n You Must Have At least Two Hard Disks
Attached to your Computer To Run This");
printf("\n Program. This Program has been developed
to Wipe the Data of Second Hard Disk.");
printf("\n Press any Key to Exit... ");
getch();
exit(1);
}
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Total Sectors in Second Hard Disk =
%lu\n\n",
Sectors_in_HDD2);
///// Сначала подтвердите, затем продолжите \\\\\
printf("\n It is A Data Wiping Program, and Writes on
the Surface of the Disk,");
printf("\n After running this program, Data can not
be recovered by any Software,");
printf("\n All The Data in Second Hard Disk will be
lost !!!");
printf("\n Press \'Y\' to Continue, Else any key to
Exit... ");
choice = getche();
switch(choice)
{
case 'y':
case 'Y':
break;
default:
exit(0);
}
gotoxy(10,15);cprintf(" Initializing, Please Wait...");
for(i=0;i<61440;i++)
{
buffer[i]='\0';
}
gotoxy(10,15);cprintf(" ");
gotoxy(10,15);
printf("Currently Wiping Absolute Sector: ");
for(loop=0;loop<= Sectors_in_HDD2;loop=loop+120)
{
writeabsolutesectors (0x81, loop, 120, buffer);
gotoxy(44,15); printf("%ld",loop);
if(kbhit())
{
exit(0);
}
///// Показать сообщение по завершении \\\\\
printf("\n\n Data wiping is Now Completed, All the Data in
Second Hard Disk is now");
printf("\n Completely Erased, Press any Key to Exit...");
getch();
}
//// Функция для записи абсолютных секторов \\\\
int writeabsolutesectors ( int drive, unsigned long sectornumber, int numofsectors, void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* Packet Size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ;/* Number of Sectors to
be written */
/* для буфера данных */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ; /* Sector number
to be written*/
pp.blocknumber[1] = 0 ; /* Block number = 0 */
i.h.ah = 0x43 ; /* Function Number */
i.h.al = 0x00 ; /* Write Flags */
i.h.dl = drive ; /* Physical Drive
number */
i.x.si = FP_OFF ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
/* Вызвать указанную функцию INT 13H со значениями регистра сегмента */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; //failure
else
return 1 ; // success
}
Комментарии по кодированию:
Геометрия структуры используется функцией getdrivegeometry с расширением INT 13H, номер функции 0x48 для получения различных параметров диска.
Структура diskaddrpacket предназначена для формата пакета адреса диска, который будет использоваться функцией writeabsolutesectors.
Функция getdrivegeometry (int drive) предназначена для получения параметров диска с указанным номером физического диска. буфер [61440] — это буфер данных размером 61440 байт, что эквивалентно 120 секторам.
(char) peekb(0x0040, 0x0075) используется для поиска количества жестких дисков, подключенных к компьютеру, хранящихся в ячейке памяти, представленной сегментом 0040H: смещение 0075H. Если общее количество подключенных жестких дисков меньше двух, отобразить сообщение об ошибке и выйти.
writeabsolutesectors ( 0x81, loop, 120, buffer ) используется для записи данных буфера данных в 120 секторов за раз, начиная с абсолютного номера сектора, указанного в цикле.
Я выбрал ‘\0’ (символ NULL, код ASCII 0) для записи в секторах для перезаписи данных. Однако вы можете использовать случайные символы для перезаписи данных.
Подробное описание функций writeabsolutesectors и getdrivegeometry см. в главах, данных ранее в этой книге.
Очистка области данных определенного файла
Мы обсуждали программы очистки данных, которые стирают данные нераспределенного пространства диска или стирают весь диск. Но если пользователь желает стирать данные каждый раз, когда он удаляет данные, процесс очистки всего нераспределенного пространства диска может занять много времени.
Нам нужны программы для очистки данных такого типа, чтобы стирать область данных, занятую только этим конкретным файлом. Для этого мы получаем помощь от записей FAT и корневого каталога, чтобы найти область данных, занимаемую этими конкретными файлами
Даже в случае гибкого диска, если данные не фрагментированы, мы можем сделать это только с помощью информации о корневом каталоге. В следующей таблице показана информация, хранящаяся в записи корневого каталога размером 32 байта для любого файла:
Как мы видим в таблице содержания записи корневого каталога, мы можем найти начальный и конечный кластер файлов. Первый байт имени файла также может содержать некоторую важную информацию о файле. Информация, предоставляемая этим байтом, может быть одной из приведенных ниже:
Давайте попробуем с помощью этой информации стереть данные любого файла, хранящегося в 1,44 Мб, 3 ½ дюймовая дискета с помощью информации о корневом каталоге. Предполагая, что данные на гибком диске не фрагментированы, следующая программа стирает данные указанного файла из его области данных:
/* Программа для очистки области данных указанного файла на дискете */
#include<stdio.h>
#include<dos.h>
///// Структура для чтения 32 байт записи файла в корневом каталоге \\\\\
struct root
{
unsigned char filename[8]; /* File name Entry of
8 Bytes */
unsigned char extension[3]; /* Extension of File of
3 Bytes */
unsigned char attribute; /* File Attribute Byte */
unsigned char reserved[10]; /* Reserved Bytes 10 */
unsigned int time; /* Time, 2 Bytes */
unsigned int date; /* Date, 2 Bytes */
unsigned int starting_cluster;/* Starting Cluster of File,
2 Bytes */
unsigned long file_size; /* File Size in Bytes,
4 Bytes */
};
/* Следует использовать это, чтобы прочитать все записи корневого каталога */
//struct root entry[224];
/* Структура для чтения всех 16 файловых записей в одном секторе корневого каталога */
struct one_root_sector
{
struct root entry[16];
};
struct one_root_sector one;
void main()
{
int result, i, num_sectors,j;
char wipe_buf[512]; /* Data Buffer to be used to wipe
out the data Area of file */
clrscr();
result= absread(0x00, 1, 19, &one); /* Read Absolute Sector
19 (First Sector of Root Directory) */
if (result != 0)
{
perror("Error in Reading Sector, Press any key to
Exit...");
getch();
exit(1);
}
/* Отображение информации о файлах после чтения из корневого каталога */
printf(" FILE NO. FILENAME EXTENSION STARTING CLUSTER
FILESIZE \n\n");
for(i=1;i<16;i++)
{
printf("\n %5d %8.8s %3.3s %5u %10lu ",
i, one.entry[i].filename, one.entry[i].extension,
one.entry[i].starting_cluster, one.entry[i].file_size);
}
//// Получить пользовательский ввод, чтобы удалить файл \\\\
printf("\n\n Enter The File Number, you Want to Delete and
Wipe out Completely ");
scanf("%d", &i);
if(i<1 || i>15)
{
printf(" \"%d\" is an Invalid Choice..., Press any
Key to Exit...", i);
getch();
exit(1);
}
///// Сначала подтвердите, затем продолжите \\\\\\
printf("\n You are About to wipe-out,
The File \"%.8s.%s\"",
one.entry[i].filename,
one.entry[i].extension);
printf("\n Do you Want to Continue...(Y/N) ");
switch(getche())
{
case 'y':
case 'Y':
break;
default:
exit(0);
}
///// Вычислить размер файла в секторах \\\\\
num_sectors = one.entry[i].file_size/512;
if((one.entry[i].file_size%512)>0)
{
num_sectors = num_sectors+1;
}
/* Буфер данных 512 байт с 512 символами NULL */
for(j=0;j<512;j++)
{
wipe_buf[j] = '\0';
}
///// Начальный сектор файла \\\\\
j= one.entry[i].starting_cluster+31;
/* Сотрите область данных до конца файла */
while(j!=(one.entry[i].starting_cluster +
num_sectors+31) )
{
if((abswrite(0x00, 1, j, &wipe_buf))!=0)
{
printf("\n Error Writing on Disk Sectors");
getch();
exit(0);
}
j++;
}
printf("\n\n File \"%.8s.%.3s\" Deleted !!!" ,
one.entry[i].filename,
one.entry[i].extension);
one.entry[i].attribute = 0; /* Set the File Attribute
to 0 */
one.entry[i].time = 0; /* Wipe The Time information
of File */
one.entry[i].date = 0; /* Wipe The Date information
of File */
one.entry[i].starting_cluster = 0; /* Set the Starting cluster to 0
*/
one.entry[i].file_size = 0; /* Set the file Size to 0 */
one.entry[i].filename[0]=0xE5; /* Give the Deleted
file Status to the File */
///// Запишите вышеуказанную информацию в корневую директорию \\\\\\
result= abswrite(0x00, 1, 19, &one);
if (result != 0)
{
perror("Error in Reading Sector, Press any key to
Exit...");
getch();
exit(1);
}
}
Комментарии по логике и кодированию программы:
Структура root используется для чтения 32 байт записи файла в корневом каталоге, а структура one_root_sector считывает все 16 записей файла в одном секторе корневого каталога
Если вы хотите прочитать все сектора информации о корневом каталоге, вы должны использовать ее как struct root entry[224]; однако я написал программу для анализа 16 записей только одного сектора корневого каталога.
Начальный сектор файла был рассчитан следующим образом:
j= one.entry[i].starting_cluster+31;
Это сделано потому, что область данных размером 1,44 МБ, 3 ½ дюймовая дискета начинается после первых 32 секторов дискеты. А на дискете указанной емкости один кластер из одного сектора.
В следующей таблице показана логическая карта 1,44 МБ, 3½ дюймовая дискета:
Вывод программы отображается следующим образом:
Здесь мы удалили и стерли данные файла PARTBOOT.C. Когда мы видим содержимое дискеты командой DIR, файл PARTBOOT.C там не отображается. При дальнейшем выполнении программы запись удаленного файла отображается следующим образом:
Здесь символ “” (0xE5) означает, что файл был удален. (см. таблицу для первого символа имени файла).
Если вы хотите написать ту же программу для жесткого диска, вы также должны использовать FAT с корневым каталогом, чтобы получить информацию об области данных любого файла.
Это связано с тем, что скорость фрагментации данных на жестких дисках увеличивается со временем по мере удаления старых файлов и создания новых. Тогда нет необходимости, чтобы все кластеры данных любого файла на диске постоянно один за другим оставались в области данных. Получив доступ к FAT, вы можете получить доступ ко всем этим кластерам.
Страница изменена: 16/03/2022