Куда уходят файлы Дубовцев Алексей Xakep, номер #065, стр. 065-114-3 // Затирать файл будем пять раз for (int nWipeNum = 0; nWipeNum < 5; nWipeNum++) { // Произведем последовательную затирку случайными блоками for (int i = 0; i < nIteration ; i++) WriteFile(hWipedFile,aRandom,256,&dwWasWrite,NULL); // Скинем информацию из всех временных буферов и кэша на диск FlushFileBuffers(hWipedFile); // Установим текущий файловый указатель в начало SetFilePointer(hWipedFile,0,NULL,FILE_BEGIN); } Тут все примитивно – мы открыли файл и пять раз переписали его какой-то случайно сгенерированной чушью. После этой операции восстановить файл будет практически невозможно. Правда, стандарт DoD 5220.22-M все же несколько отличается от нашего алгоритма. Он требует строго регламентированных символов затирания, которые сведут к нулю вероятность восстановления даже случайных бит информации. Но для людей, не страдающих паранойей, его использование необязательно. По идее, здесь надо было бы заканчивать статью, однако существует еще один нелицеприятный случай, о котором я обязан тебе рассказать. Оказывается, что файловые системы типа NTFS поддерживают создание многопоточных файлов. В таких файлах, кроме основного потока данных, могут находиться еще несколько дополнительных потоков. То есть в одном файле как бы находятся несколько других. Если у тебя есть в распоряжении жесткий диск с установленной NTFS, можешь поэкспериментировать. Создай пустой файл с именем «Some.txt». Затем открой на редактирование файл «Some.txt:SomeStream», напиши в нем что-нибудь. Затем снова открой файл Some.txt – и с удивлением обнаружь, что он «пустой». Однако в его потоке SomeStream хранится информация. Но это еще не самое интересное. Оказывается, что директории, расположенные на томах типа NTFS, также могут содержать потоки. Возьми любую произвольную директорию, открой в ней поток и скопируй туда файл. К примеру, сюда: C:\windows:SomeStream. В директории появится новый поток, в котором будет находиться скрытый файл. Для того чтобы безопасно удалять подобные файлы, необходимо получить информацию обо всех потоках, содержащихся в файле или директории. А уже затем пройтись по всем ним и удалить информацию там. Мне пришлось написать специальную адаптированную функцию поиска потоков. Она использует специальные недокументированные системные сервисы, которые Microsoft потрудилась от нас скрыть. Они находятся в системной библиотеке ntdll.dll, о которой Microsoft официально вообще никому не рассказывает. Но тебя я раскрою эти сокровенные тайны. Получившийся код смотри на врезке. Как работает этот код. Первым делом он открывает файл (CreateFile) и получает его описатель (HANDLE). Затем он передает его функции NtQueryFileInformation с дополнительным параметром FileStreamInformation, который указывает на то, что нам необходима информация о потоках. Если размер буфера переданного функции NtQueryInformation недостаточен, то включается хитрый алгоритм масштабирования буфера. Он увеличивает буфер до тех пор, пока его размер не будет превышать общий объем информации по потокам, содержащимся в файле. После того как необходимая информация получена, остается лишь перебрать в цикле все файловые потоки и уничтожить каждый из них. |