Инжекторы DLL: принципы работы и применение¶
Инжекторы DLL — это класс программных средств, предназначенных для внедрения динамически подключаемых библиотек (DLL) в адресное пространство запущенных процессов операционной системы Windows. Процесс внедрения, называемый инжекцией DLL, позволяет выполнить код библиотеки в контексте целевого процесса, что даёт доступ к его памяти, API-функциям и внутренним структурам данных.
¶Принципы работы
Инжекция DLL основана на механизме загрузки библиотек операционной системой. Windows предоставляет функции для работы с DLL, такие как LoadLibrary и GetProcAddress, однако они предназначены для использования внутри самого процесса. Задача инжектора — инициировать вызов LoadLibrary в удалённом процессе.
Существует несколько базовых техник внедрения, различающихся по сложности и уровню контроля:
¶1. Использование функции CreateRemoteThread
Классический и наиболее распространённый метод. Инжектор выполняет следующие шаги:
- Открывает целевой процесс с правами на создание потока (
PROCESS_CREATE_THREAD) и запись в память (PROCESS_VM_WRITE,PROCESS_VM_OPERATION). - Выделяет память в целевом процессе с помощью
VirtualAllocEx. - Записывает полный путь к DLL в выделенную память через
WriteProcessMemory. - Создаёт удалённый поток с помощью
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 →


