Да, как вы упомянули, вам необходимо перехватить API перечисления файлов / папок и отфильтровать конкретный файл / папку из результата перечисления, чтобы «скрыть» этот файл / папку.Это можно сделать либо в пользовательском режиме, либо в режиме ядра. Режим пользователя: Перехват режима пользователя включает внедрение DLL.Есть много мест, где вы можете подключить:
- Перехват исполняемых файлов IAT: найдите запись FindXxx в таблице адресов импорта целевого процесса и замените ее адресом функции батута, присутствующей во введенной DLL.
- EAT-перехват DLL-файлов, загружаемых исполняемыми файлами: найдите запись API-интерфейсов FindXxx в таблице адресов экспорта загруженной DLL (в данном случае kernel32.dll) и перезаписайте ее адресом функции батута, присутствующей во вставленной DLL.
- Inline hooking: перезаписывает первые несколько инструкций кода API в загруженной DLL с помощью JMP в функцию батута.
Как правило, пользовательский режим имеет тенденцию становиться «уродливым» (сложным в управлении), так как вам нужно внедрить вашу DLL во все запущенные процессы, если вы хотите подключить систему в целом (или, по крайней мере, в Explorer).exe или ваше целевое приложение).Многие приложения, такие как программное обеспечение безопасности, имеют механизмы защиты для обнаружения и запрета внедрения DLL.Более чистый способ реализации перехвата пользовательского режима - это перехват API в NTDLL.dll (с использованием EAT или встроенного перехвата).Все остальные API (например, FindFirstFile / FindNextFile) в конечном итоге вызывают эквивалентные API-интерфейсы NtXxx (например, NtQueryDirectoryFile), предоставляемые NTDLL.dll.API NtXxx - это точка, в которой элемент управления переходит в режим ядра, выполняя INT 2E / SYSENTER.
Режим ядра: Это включает в себя написание драйвера.Опять же, в режиме ядра есть много мест, где вы можете установить хук:
- Хук SSDT: Установите хук SSDT для необходимого API ZwXxx (в данном случае ZwQueryDirectoryFile), переписав соответствующий индекс SSDT адресом функции батута в вашем драйвере.
- Встроенный хук ядра: перезаписать первые несколько инструкций API ядра NT, экспортируемых ядром (в данном случае NtQueryDirectoryFile), JMP, чтобы указать на функцию батута в вашем драйвере.
- Драйвер фильтра файловой системы: это более понятный подход, и никаких зацепок не требуется.Установите драйвер фильтра файловой системы, перехватите операции чтения / записи / перечисления IOCTL и отфильтруйте результаты, чтобы скрыть / заблокировать определенный файл / папку.
Крюк в режиме ядра имеет тенденцию быть чище, так как он обычно устанавливается в одном «централизованном месте».Однако вы должны быть очень осторожны, так как небольшая ошибка / неправильное обращение с кодом драйвера может привести к BSOD.
PS: Существует множество библиотек / структур для перехвата, облегчающих работу по написанию кода.Некоторые популярные из них:http://www.madshi.net/madCodeHookDescription.htmhttp://easyhook.codeplex.com/
PPS: Скрытие файлов / папок с использованием таких методов без согласия пользователя может быть сомнительным действием и может стать проблемой (помните, проблема с программным обеспечением защиты Sony DRM?;)).Это то, что делают руткиты!Существует много руткитов пользовательского режима и режима ядра, которые используют методы, упомянутые выше, чтобы скрыть файлы / папки.Существуют различные анти-руткит-программы для обнаружения и восстановления всех видов перехватов, описанных выше.Многие антивирусные программы поднимают флаг, когда обнаруживают такие руткиты, как поведение (например, перехват API, скрытые файлы, перехват SSDT и т. Д.)
Несколько ресурсов:http://www.codeproject.com/KB/threads/APIHooking.aspxhttp://www.codeproject.com/KB/DLL/funapihook.aspxhttp://www.codeproject.com/KB/system/api_spying_hack.aspxhttp://www.codeproject.com/KB/system/hide-driver.aspxhttp://www.uc -forum.com / форум / с-и-с / 59147-письменные водители-Perform-уровня ядра-SSDT-hooking.html http://www.security.org.sg/code/apihookcheck.html