Открыть сервис

Инжекторы DLL: принципы работы и применение

Инжекторы DLL — это класс программных средств, предназначенных для внедрения динамически подключаемых библиотек (DLL) в адресное пространство запущенных процессов операционной системы Windows. Процесс внедрения, называемый инжекцией DLL, позволяет выполнить код библиотеки в контексте целевого процесса, что даёт доступ к его памяти, API-функциям и внутренним структурам данных.

Принципы работы

Инжекция DLL основана на механизме загрузки библиотек операционной системой. Windows предоставляет функции для работы с DLL, такие как LoadLibrary и GetProcAddress, однако они предназначены для использования внутри самого процесса. Задача инжектора — инициировать вызов LoadLibrary в удалённом процессе.

Существует несколько базовых техник внедрения, различающихся по сложности и уровню контроля:

1. Использование функции CreateRemoteThread

Классический и наиболее распространённый метод. Инжектор выполняет следующие шаги:

  1. Открывает целевой процесс с правами на создание потока (PROCESS_CREATE_THREAD) и запись в память (PROCESS_VM_WRITE, PROCESS_VM_OPERATION).
  2. Выделяет память в целевом процессе с помощью VirtualAllocEx.
  3. Записывает полный путь к DLL в выделенную память через WriteProcessMemory.
  4. Создаёт удалённый поток с помощью CreateRemoteThread, передавая в качестве стартовой функции адрес LoadLibraryW (или LoadLibraryA), а в качестве аргумента — адрес записанного пути.

Поток начинает выполняться в целевом процессе, вызывая LoadLibrary, что приводит к загрузке DLL и выполнению её кода (например, в функции DllMain).

2. Использование SetWindowsHookEx

Метод основан на механизме хуков Windows. Инжектор устанавливает глобальный хук (например, WH_GETMESSAGE), передавая в SetWindowsHookEx дескриптор DLL. Система автоматически загружает эту DLL в процессы, которые обрабатывают соответствующие сообщения. Метод не требует прав администратора для внедрения в процессы, связанные с графическим интерфейсом, но имеет ограничения: DLL загружается не во все процессы, а только в те, что используют оконные сообщения.

3. Использование AppInit_DLLs

Реестровый механизм Windows. В ветке реестра HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows существует параметр AppInit_DLLs, в который можно записать путь к DLL. При запуске любого процесса, загружающего user32.dll, система загружает указанные библиотеки. Требует прав администратора и перезагрузки системы или перезапуска процессов. В современных версиях Windows (начиная с Windows 8) механизм требует наличия подписи кода у DLL и отключён по умолчанию для большинства приложений.

4. Использование Windows Hooks (WH_*)

Разновидность метода с SetWindowsHookEx, но с использованием других типов хуков (например, WH_KEYBOARD, WH_MOUSE). Принцип аналогичен: система загружает DLL в процесс, который обрабатывает событие. Отличается от AppInit_DLLs тем, что не требует прав администратора и действует только для процессов с GUI.

5. Использование QueueUserAPC

Метод, основанный на асинхронных вызовах процедур (APC). Инжектор выделяет память в целевом процессе и записывает туда путь к DLL, после чего вызывает QueueUserAPC, передавая адрес LoadLibraryW. Выполнение происходит, когда целевой поток входит в состояние ожидания (alertable wait). Метод считается более скрытным, но требует, чтобы целевой процесс находился в подходящем состоянии.

6. Использование драйверов режима ядра

Наиболее низкоуровневый метод. Драйвер, работающий в режиме ядра, может напрямую манипулировать структурами процессов и загружать DLL в контексте любого процесса, обходя большинство защит. Требует наличия подписанного драйвера и прав администратора. Применяется в сложных руткитах и античит-системах.

Применение

Инжекторы DLL находят применение как в легитимных, так и во вредоносных целях.

Легитимное использование

  • Модификация игр: внедрение библиотек для изменения графики, добавления функций (например, шейдеров) или создания читов (хотя последнее часто нарушает правила игр).
  • Расширение функциональности приложений: добавление плагинов в программы, не поддерживающих их официально (например, в старые редакторы или офисные пакеты).
  • Отладка и тестирование: перехват вызовов API для анализа поведения программы, поиска ошибок или сбора статистики.
  • Системы защиты информации: антивирусы и DLP-системы используют инжекцию для мониторинга действий приложений.
  • Инструменты автоматизации: внедрение DLL для управления сторонними приложениями без использования официальных API.

Вредоносное использование

  • Сокрытие вредоносного кода: загрузка вредоносной DLL в легитимный процесс (например, explorer.exe) для маскировки под доверенное приложение и обхода файрволов.
  • Кража данных: перехват ввода с клавиатуры (кейлоггеры), чтение памяти других процессов, перехват сетевого трафика.
  • Постоянство в системе: внедрение в автозагружаемые процессы для сохранения присутствия после перезагрузки.

Методы противодействия

Для защиты от нежелательной инжекции DLL используются следующие подходы:

  • Проверка целостности процессов: антивирусы и EDR-системы отслеживают вызовы CreateRemoteThread и WriteProcessMemory.
  • Защита от внедрения: приложения могут вызывать SetProcessMitigationPolicy для запрета удалённого создания потоков или загрузки DLL из недоверенных источников.
  • Подпись кода: требование подписанных DLL при загрузке (например, через AppInit_DLLs).
  • Мониторинг памяти: проверка списка загруженных модулей на предмет подозрительных DLL.

Интересные факты

  • Механизм инжекции DLL был официально задокументирован Microsoft для создания хуков и расширения функциональности, но его же используют злоумышленники.
  • В Windows 10 и 11 компания Microsoft значительно усложнила жизнь инжекторам, добавив функции защиты целостности кода (например, ProcessHacker и другие инструменты требуют прав администратора для внедрения в защищённые процессы).
  • Существуют библиотеки-обёртки, такие как Detours от Microsoft Research, которые упрощают перехват функций и внедрение DLL для разработчиков.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →