Перетирать удаляемый файлы..

Тема в разделе "WASM.WIN32", создана пользователем test555, 31 авг 2008.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Встала небольшая задача защиты инфы. А именно нужно программно перетирать файлы, которые удаляются разными программами.

    В МС ворде всегда создаются резеврные копии документов, и потом удаляются логически. Их можно восстановить известными способами.
    При этом, еще часть инфы сбрасывается во временную директорию пользователя.

    Я хочу написать DLL в 3 кольце (описано в статье МС-рема про перехвал АПИ Часть 1, там скрывали файлы и процессы) которая аналогичным образом перехватывает функцию zwDeletefile и предвариетльно заполняет файл фигней и потом сама его удаляет.

    Скрытности мне не надо, пользователь сам просит.

    Подскажите где поискать, как проще. Владею Делфи, асм - только книжки листал.
    Хочу просто в исходниках статьи переделать под эту функцию. Ведь при удалении этого файла все равно будет обращение к этой функции zwDeletefile ?

    Где взять описание функции, аналогичное:

    Function ZwQueryDirectoryFile(FileHandle: dword;
    Event: dword;
    ApcRoutine: pointer;
    ApcContext: pointer;
    IoStatusBlock: pointer;
    FileInformation: pointer;
    FileInformationLength: dword;
    FileInformationClass: dword;
    ReturnSingleEntry: bool;
    FileName: PUnicodeString;
    RestartScan: bool): NTStatus;
    stdcall; external 'ntdll.dll';

    То есть что бы я в делфе ее так же объявил, и потом анализируя параметры (названия файлов) их перетирал и удалял).

    Нашел http://msdn.microsoft.com/en-us/library/ms800909.aspx
    здесь вот

    ZwDeleteFile(
    IN POBJECT_ATTRIBUTES ObjectAttributes)

    А вот дальше я не знаю (
    Еще на форуме находил исходники драйвера, перехватывающешл удаление файла и что-то делающего. Но не разобрался.

    Спасибо.
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    test555
    Обычно если нужно надежно удалить, то берут стандарт и соглассно алго в этом стандарте удаляют файл! Т.е. не просто взяли и DeleteFile, а еще это место много-много раз чем нить ерундовым перезаписали. К примеру под тотал-коммандер есть плагин , который как раз и удаляет таким образом.
     
  3. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    EvilsInterrupt, уважаемый, прошу поточнее перечитать мой пост.
    Я и хочу написать софтину, которая ЛОВИТ удаление файлов, и перед удалением перетирает их содержимое. Достаточно одного цикла перезаписи, тут задача от полуделетантов которые умею восстанавливать инфу R-studio и прочими утилями.

    Мне нужно удалять мусор от всех приложений, ворд и ексель в процессе работы удаляет дублирует кучу документов и удаляет их только логически!

    Тут никакие шредеры и плагины не подойдут!
    Нужен именно монитор который ловит удаление.

    Может покать в сторону zwSetFileInformation ??
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А почему-бы не юзать уже готовые продукты ?
    Например Drive Discovery. Отличная прога.
    При установке указываешь чтоб внедрился в explorer, и при удалении файлов перезапишет в начале в указанное количество рас удаляемый файл токо потом удаляет..
     
  5. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Если имя файла заранее известно то вполне сойдет NtNotifyChangeDirectoryFile, если же нет то можно перехватывать во всех процессах NtDeleteFile, собственно а что не понятно? В стеке будет указатель на ObjectAttributes, ObjectAttributes.Name - указатель на UNICODE_STRING имя файла в формате NtPath.
     
  6. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Flasher, момент: когда ворд удаляет служебные файлы, вряд ли эта прога поможет..

    blast, именно как описать функцию, я и не знал..

    Щас покопаюсь..

    http://forum.shelek.ru/index.php/topic,9718.0.html

    Сделал ловлю функций zwDeleteFile - нифига не ловится.
    Судя по форуму, мне нужно работать с NtSetInformationFile
    Запутался, кто-то говорит что файл удаляется по закрытию на него хэндла..
    Брр...
     
  7. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    :lol: криво сделал, значит, отлаживать пробовал обработчик? как перехватываешь? перехват во всех процессах работает корректно?
     
  8. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Я чет не понимаю..
    Разве ZwDeleteFile не юзается для удаления директорий?
    А для файлов - ZwSetInformationFile с mov FILE_DISPOSITION_INFORMATION.DeleteFile, TRUE

    Глянь KmdKit\examples\basic\FileWorks\FileWorks.bat

    Хукаешь ZwSetInformationFile, по передаваемому хендлу открытого файла получаешь размер (ZwQueryInformationFile - FILE_STANDARD_INFORMATION.EndOfFile.LowPart), и записываешь туды "Капризи №25 - Николо Паганини" через ZwWriteFile :)

    p.s. Пусть просвещаются восстановители инфы ;)

    p.p.s Правда не факт что удаляемый файл открыт с флагом FILE_WRITE_DATA
     
  9. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    blast, взял рабочу ДЛЛ МС-Рема из первой статью по перехвату АПИ.
    Я ее переделывал чтобы она еще ловила функции которые файлы бы скрывали.
    Скрывали.
    И во всех процессах.

    Видимо копать в ZwSetInformationFile.
    Надо будет почитать документацию и эксперименты.

    Flasher, щас попробую.

    Видимо на сегодня уже устал разбираться, докатился до такого:

    Function NewZwSetInformationFile( FileHandle: dword; IoStatusBlock: pointer; FileInformation: pointer; ULONG: dword; FileInformationClass: dword ): NTStatus; stdcall;

    begin
    if FileInformationClass=13 then begin
    add2file('c:\filelof.txt',pchar(inttostr(FileInformationClass)+#13#10));
    // FileInformationClass:=14
    end;

    Result := TrueZwSetInformationFile( FileHandle, IoStatusBlock, FileInformation, ULONG, FileInformationClass );

    end;
    --------------
    Срабатывает, то есть при любой попытке удаления у меня в тектовом файле появляются циферки (опытным путем установлено что FileInformationClass== цифра 13 - на удаление, и если его принудилельно менять на 14, то файл не удаляется)

    Вопрос в следующем: вот я выловил нужную функцию, не могу понять, как мне получить размер файла..
    Или как мне вообще обработать, выяснить что файл удаляется, его размер и хотябы имя..

    Как вообще юзать
    FileInformationClass
    FileInformation

    что я находил в описании функций..
    И вообще, правильно ли я "описал функцию", и сопоставил параметрам нужные типы?

    (сори за кашу, завтра исправлюсь)
     
  10. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Flasher факт то что нету атрибута FILE_WRITE_DATA
     
  11. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Небеда, чекать функции ZwCreateFile\ZwOpenFile на флаги "DELETE + SYNCHRONIZE", или на "FILE_SHARE_DELETE" если нашли, добавляем туды FILE_WRITE_DATA :P
     
  12. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    мне кажеться некоректно удалять файл как только его открыли с флагом DELETE
    в голову приходит следующий вариант, возможно и не правильный: хукать NtClose, проверять тип обьекта, хендл которого закрывают, и если это файл проверять атрибуты, если находим DELETE зытираем файл по своему.
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    test555
    Почитай Неббета, там есть инфа про нужные тебе функции.