Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #65, МАЙ 2004 г.

Куда уходят файлы

Дубовцев Алексей

Xakep, номер #065, стр. 065-114-4


Наша прога всех сотрет

Специально для тебя я написал приложение-уничтожитель файлов. Первая его версия была консольной, но редактор сказал, что я недоразвитый, и нормальные пацаны пользоваться консолью не должны (ударьте меня :) – прим. Dr.). Именно поэтому я решил забацать какой-нибудь интерфейс. И придумал следующее – программа состоит из одного маленького окна с изображением милого человечка. В этом окне даже нет ни одной кнопки. Для того чтобы удалить файл или группу файлов, достаточно перетащить их на окно нашей программы. После чего она обязательно спросит, хотим ли мы удалять файлы. Если ты вынесешь положительный вердикт, будет запущен механизм уничтожения файлов. Первым делом управление попадет в функцию OnDropFiles, которая находится в файле XWipeDlg.cpp. Она отвечает за обработку файлов, сброшенных на диалоговое окно нашего приложения. Далее обрати внимание на вызов Wipe::EraseFile(szFileName), именно он запрашивает наш суперский движок уничтожить файл, имя которого лежит в переменной szFileName.

Сам движок я поместил в два отдельных файла WipeEngine.cpp, WipeEngine.h. Сделал я это не случайно, а специально для тебя. Если тебе когда-нибудь в твоих прогах понадобится возможность уничтожать файлы, то можешь смело подключать этот модуль и юзать функцию Wipe::EraseFile. Дополнительных шаманских действий тебе совершать не придется, я старался сделать все максимально примитивным.

Движок изнутри

Особо продвинутым небезынтересно будет узнать, как устроен движок внутри. Хотя я бы советовал разобраться в этом всем – вдруг пригодится. Работа по уничтожению файла начинается с определения типа файловой системы раздела, на котором он расположен. Для этого от имени файла отрезаются первые три символа – путь к корню раздела (C:\, D:\) - и передаются на растерзание функции GetVolumeInformation. Она в предпоследнем своем параметре возвращает имя файловой системы раздела, а нам остается только сравнить его с аббревиатурой NTFS. Если файл располагается на не NTFS-разделе, то все просто. Данный файл содержит лишь один основной поток, следовательно, нужно лишь тупо открыть его и переписать случайно сгенеренной чушью. Если же файл располагается на томе NTFS, все несколько сложнее. Как известно, по умолчанию подобные тома поддерживают только Windows NT. А как следствие, специальные функции для работы с файлами на разделах NTFS существуют только на этих системах. Таким образом, если мы будем жестко прилинковываться к этим функциям, то наше приложение только на них и будет работать, не запускаясь на 9x-системах по причине отсутствия необходимых динамических библиотек. Для того чтобы обойти это ограничение, мне пришлось создать механизм динамического связывания с необходимыми функциями. Он расположен внутри функции InitEngine. После того как необходимые функции прилинкованы к программе, можно смело обращаться к функции EraseFileOnNTFS, которая отвечает за уничтожение многопоточных файлов на NTFS. Она перебирает все потоки, прикрепленные к файлу, и вызывает для каждого из них функцию EraseFileInternal, которая записывает туда случайную информацию.

Назад на стр. 065-114-3  Содержание  Вперед на стр. 065-114-5