Встала небольшая задача защиты инфы. А именно нужно программно перетирать файлы, которые удаляются разными программами. В МС ворде всегда создаются резеврные копии документов, и потом удаляются логически. Их можно восстановить известными способами. При этом, еще часть инфы сбрасывается во временную директорию пользователя. Я хочу написать 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) А вот дальше я не знаю ( Еще на форуме находил исходники драйвера, перехватывающешл удаление файла и что-то делающего. Но не разобрался. Спасибо.
test555 Обычно если нужно надежно удалить, то берут стандарт и соглассно алго в этом стандарте удаляют файл! Т.е. не просто взяли и DeleteFile, а еще это место много-много раз чем нить ерундовым перезаписали. К примеру под тотал-коммандер есть плагин , который как раз и удаляет таким образом.
EvilsInterrupt, уважаемый, прошу поточнее перечитать мой пост. Я и хочу написать софтину, которая ЛОВИТ удаление файлов, и перед удалением перетирает их содержимое. Достаточно одного цикла перезаписи, тут задача от полуделетантов которые умею восстанавливать инфу R-studio и прочими утилями. Мне нужно удалять мусор от всех приложений, ворд и ексель в процессе работы удаляет дублирует кучу документов и удаляет их только логически! Тут никакие шредеры и плагины не подойдут! Нужен именно монитор который ловит удаление. Может покать в сторону zwSetFileInformation ??
А почему-бы не юзать уже готовые продукты ? Например Drive Discovery. Отличная прога. При установке указываешь чтоб внедрился в explorer, и при удалении файлов перезапишет в начале в указанное количество рас удаляемый файл токо потом удаляет..
Если имя файла заранее известно то вполне сойдет NtNotifyChangeDirectoryFile, если же нет то можно перехватывать во всех процессах NtDeleteFile, собственно а что не понятно? В стеке будет указатель на ObjectAttributes, ObjectAttributes.Name - указатель на UNICODE_STRING имя файла в формате NtPath.
Flasher, момент: когда ворд удаляет служебные файлы, вряд ли эта прога поможет.. blast, именно как описать функцию, я и не знал.. Щас покопаюсь.. http://forum.shelek.ru/index.php/topic,9718.0.html Сделал ловлю функций zwDeleteFile - нифига не ловится. Судя по форуму, мне нужно работать с NtSetInformationFile Запутался, кто-то говорит что файл удаляется по закрытию на него хэндла.. Брр...
криво сделал, значит, отлаживать пробовал обработчик? как перехватываешь? перехват во всех процессах работает корректно?
Я чет не понимаю.. Разве 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
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 что я находил в описании функций.. И вообще, правильно ли я "описал функцию", и сопоставил параметрам нужные типы? (сори за кашу, завтра исправлюсь)
Небеда, чекать функции ZwCreateFile\ZwOpenFile на флаги "DELETE + SYNCHRONIZE", или на "FILE_SHARE_DELETE" если нашли, добавляем туды FILE_WRITE_DATA :P
мне кажеться некоректно удалять файл как только его открыли с флагом DELETE в голову приходит следующий вариант, возможно и не правильный: хукать NtClose, проверять тип обьекта, хендл которого закрывают, и если это файл проверять атрибуты, если находим DELETE зытираем файл по своему.