2010-11-06 2 views
6

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

+0

Это звучит довольно хитроумный! Я бы рискнул предположить и сказать, что это невозможно. –

ответ

10

Да, как вы уже упоминали, вам необходимо перехватить API перечисления файлов/папок и отфильтровать конкретный файл/папку из результата перечисления, чтобы «скрыть» этот файл/папку. Это можно сделать либо в режиме пользователя, либо в режиме ядра.

Пользовательский режим: Зацепка с пользовательским режимом включает в себя DLL-инъекцию. Есть много мест, где вы можете подключить:

  • IAT зацепляющие исполняемых файлов: Выясните запись FindXxx в импорт таблицы адресов целевого процесса и перезаписать его с адресом батут функции, присутствующей в нагнетаемой DLL.
  • EAT-подключение DLL, загружаемых исполняемыми файлами: найдите запись API-интерфейсов FindXxx в таблице адресов экспорта загруженной DLL (в данном случае kernel32.dll) и перепишите ее с адресом функции trampoline, присутствующей в инъецированной 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.

Kernel mode: Это связано с написанием драйвера. Опять же, в режиме ядра есть много мест, где вы можете установить крюк:

  • SSDT крюк: Установите SSDT крюк для требуемого ZwXxx API (ZwQueryDirectoryFile в данном случае), переписав соответствующий SSDT индекса с адресом батут в вашем драйвере.
  • Внутренний крючок ядра: перезапишите первые несколько инструкций API ядра ядра NT, экспортированных ядром (NtQueryDirectoryFile в этом случае), с JMP, чтобы указать на функцию батута в вашем драйвере.
  • Драйвер фильтра файловой системы: это более чистый подход и никаких крючков не задействован. Установите драйвер фильтра файловой системы и перехватите IOCTLs для чтения/записи/перечисления и отфильтруйте результаты, чтобы скрыть/заблокировать определенный файл/папку.

Клерковый режим крюка, как правило, более чист, поскольку они обычно устанавливаются в одном «централизованном месте». Тем не менее, вы должны быть очень осторожны, поскольку небольшая ошибка/неправильное обращение в коде драйвера может закончиться BSOD.

PS: Для облегчения написания кода доступно множество библиотек/фреймворков для подключения. Некоторые популярные из них являются:
http://www.madshi.net/madCodeHookDescription.htm
http://easyhook.codeplex.com/

PPS: скрытие файлов/папок с помощью таких методов без согласия пользователя может быть под вопросом действия и может стать проблематичным (Помните Sony DRM выпуск программного обеспечения защиты;)). Это то, что делают руткиты! Существует много пользовательских режимов и руткитов режима ядра, которые используют упомянутые выше методы, чтобы скрыть файлы/папки. Существуют различные антируткитные программы, доступные для обнаружения и восстановления всех видов перехвата, описанных выше. Многие антивирусные программы поднимают флаг, когда они обнаруживают такое руткит, как поведение (например, API подсекать, скрытые файлы, SSDT крючки и т.д.)

Несколько ресурсов:
http://www.codeproject.com/KB/threads/APIHooking.aspx
http://www.codeproject.com/KB/DLL/funapihook.aspx
http://www.codeproject.com/KB/system/api_spying_hack.aspx
http://www.codeproject.com/KB/system/hide-driver.aspx
http://www.uc-forum.com/forum/c-and-c/59147-writing-drivers-perform-kernel-level-ssdt-hooking.html
http://www.security.org.sg/code/apihookcheck.html

+0

Ничего себе, тщательный ответ. –

0

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

+0

Я уже подключил FindFirstFile и FindFirstFileEx, но они не вызывается, когда программа перечисляет файлы. Есть ли другая функция, которую он может использовать? И когда вы говорите: «Я думаю, вы знаете, с каким процессом вы возитесь, поэтому знаете ...» На самом деле это проблема, поскольку я могу перехватывать функции, но я не уверен, что зацепить. –

+0

Подключили ли вы FindFirstFileA и FindFirstFileW? Вы пробовали API Monitor http://www.apimonitor.com/? Если вы не знаете, что он использует, и вы не хотите разбирать, чтобы копать глубже, вы всегда можете поймать их с помощью функции самого низкого уровня - NtQueryDirectoryFile и, вероятно, NtQueryDirectoryObject. – kichik

+0

Нет, я не зацепил FindFirstFileA и W. И NtQueryDirectory * - хорошая идея, я не знал об этом, спасибо. –

Смежные вопросы