Скрытие файла от других программ - PullRequest
6 голосов
/ 07 ноября 2010

Мне нужно, чтобы файл не появлялся в другой программе. Например, когда другая программа получает список файлов в папке, я хочу, чтобы один конкретный файл не отображался. Я внедряю DLL, из которой мой код запускается в процесс, от которого я хочу скрыть файл DLL в файловой системе. Я использую Microsoft Visual C ++ 2010 и Windows 7.

Ответы [ 2 ]

11 голосов
/ 07 ноября 2010

Да, как вы упомянули, вам необходимо перехватить 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

0 голосов
/ 07 ноября 2010

Самый простой способ сделать это - использовать Microsoft Detours для переопределения необходимых вам функций.Его также можно использовать для внедрения DLL, но это уже есть.Если есть другая функция, используемая другим известным вам процессом, подключите ее.Если нет, вам нужно подключить строительные блоки всех функций, используемых для отображения файлов или открыть их.Достаточно просто создать CreateFile / FindFirst / FindFirstFile / etc, так как они просто вызывают внутреннюю функцию.Например, если вы подключите CreateFile, который фактически отображается в CreateFileA, процесс все равно сможет получить доступ к файлу с помощью CreateFileW.Итак, вы хотите подключить NtCreateFile и друзей.Но я думаю, вы знаете, с каким процессом вы работаете, так что вы точно знаете, с какими функциями связываться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...