Мне нужно, чтобы файл не отображался в другой программе. Например, когда другая программа получает список файлов в папке, я хочу, чтобы один конкретный не отображался. Я вставляю DLL, из которой мой код будет запущен в процессе, из которого я хочу скрыть DLL-файл в файловой системе. Я использую Microsoft Visual C++ 2010 и Windows 7.Скрытие файла из других программ
ответ
Да, как вы уже упоминали, вам необходимо перехватить 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
Ничего себе, тщательный ответ. –
Самый простой способ сделать это - использовать Microsoft Detours, чтобы переопределить нужные функции. Его также можно использовать для вставки DLL, но у вас уже есть это. Если есть определенная функция, используемая другим процессом, который вам известен, подключитесь к этому. Если нет, вам нужно зацепить блоки всех функций, используемых для отображения файлов или их открытия. Приобретение только CreateFile/FindFirst/FindFirstFile/etc будет достаточно, поскольку они просто вызовут внутреннюю функцию. Например, если вы зацепите CreateFile, который фактически отобразится в CreateFileA, процесс все равно сможет получить доступ к файлу с помощью CreateFileW. Поэтому вы хотите подключить NtCreateFile и друзей. Но я думаю, вы знаете, с каким процессом вы возитесь, поэтому вы точно знаете, с какими функциями тоже можно возиться.
Я уже подключил FindFirstFile и FindFirstFileEx, но они не вызывается, когда программа перечисляет файлы. Есть ли другая функция, которую он может использовать? И когда вы говорите: «Я думаю, вы знаете, с каким процессом вы возитесь, поэтому знаете ...» На самом деле это проблема, поскольку я могу перехватывать функции, но я не уверен, что зацепить. –
Подключили ли вы FindFirstFileA и FindFirstFileW? Вы пробовали API Monitor http://www.apimonitor.com/? Если вы не знаете, что он использует, и вы не хотите разбирать, чтобы копать глубже, вы всегда можете поймать их с помощью функции самого низкого уровня - NtQueryDirectoryFile и, вероятно, NtQueryDirectoryObject. – kichik
Нет, я не зацепил FindFirstFileA и W. И NtQueryDirectory * - хорошая идея, я не знал об этом, спасибо. –
- 1. Скрытие других окон/программ от Electron App
- 2. Скрытие SoftKeyboard из других приложений
- 3. Чтение файла из Запуск других программ от Tcl
- 4. Запуск моделей brightway2 из других программ
- 5. Программа для вызова других программ
- 6. Простой способ получить данные из других программ?
- 7. Java: Как получить значения из других программ?
- 8. Как принимать входные данные из других программ
- 9. PyQt5 Получить выделенный текст из других программ
- 10. Получите выделенный текстовый контент из других программ
- 11. Скрытие формы из-за других форм javascript
- 12. Скрытие переменной из других приложений и классов
- 13. программа для мониторинга других программ
- 14. Запуск других программ с Java
- 15. Запуск командного файла ПОСЛЕ всех других программ при инициализации Windows
- 16. Интерфейс vim для других программ
- 17. Скрытие и отображение программ Eclipse программно
- 18. Запуск других программ в Haskell/Линейный пакет программ
- 19. Использование других программ как часть другой программы
- 20. Расширение переменной Powershell при вызове других программ
- 21. Внесение других программ в приложение Electron
- 22. Использование python для запуска других программ
- 23. Скрытие файла SINGLE (Apahe)
- 24. получить активное окно из других программ, используя java
- 25. Функция загрузки JSON считывает ключи из других программ
- 26. Может ли Java контролировать положение окон из других программ?
- 27. Создание программы, которая управляет меню других программ
- 28. Переключение раскладки клавиатуры для других программ
- 29. NSNotification для обнаружения сбоев других программ
- 30. Программа Python для написания других программ
Это звучит довольно хитроумный! Я бы рискнул предположить и сказать, что это невозможно. –