Разбираем Reflective DLL Injection

d0ppl4r

Старшина
Сообщения
49
Реакции
33
Разбираем Reflective DLL Injection — технику, которую используют злоумышленники для скрытой загрузки DLL-библиотеки.

Обычно для загрузки DLL-библиотеки в Windows мы вызываем функцию LoadLibrary, которая принимает в качестве аргумента путь к библиотеке. Для этого нужно, чтобы библиотека была на диске, с которого и производится загрузка.

Но злоумышленники загружают код другим, более интересным путем.

Их техника Reflective DLL Injection позволяет внедрить код DLL-библиотеки в процесс из памяти. Основное преимущество такого подхода заключается в том, что библиотека не регистрируется в системе. В результате ее практически невозможно обнаружить ни на уровне системы, ни на уровне процесса.

Reflective DLL Injection по шагам

1. Некоторый исполняемый файл считывает DLL-библиотеку с диска в адресное пространство своего процесса и передает управление на ее экспортируемую функцию ReflectiveLoader.

2. Поскольку теперь библиотека существует в произвольном месте в памяти, ReflectiveLoader вычисляет текущее местоположение самой DLL-библиотеки в памяти. Для этого ReflectiveLoader получает адрес текущей инструкции и, двигаясь в обратном направлении, ищет байты 4D5A, соответствующие MZ-сигнатуре. Это нужно, чтобы дать библиотеке возможность анализировать свои собственные заголовки для дальнейшего запуска.

3. ReflectiveLoader определяет адрес библиотеки kernel32.dll в текущем процессе, после чего анализирует таблицу ее экспорта и находит функции LoadLibrary, GetProcAddress и VirtualAlloc, необходимые для дальнейшей загрузки.

Теперь ReflectiveLoader выделяет непрерывный участок памяти (VirtualAlloc), где и размещает код DLL-библиотеки (заголовки и секции) в соответствии с виртуальными адресами. Затем ReflectiveLoader обрабатывает свою вновь загруженную таблицу импорта: загружает необходимые библиотеки (LoadLibrary) и импортируемые из них функции (GetProcAddress).

Наконец, ReflectiveLoader вызывает DllEntryPoint внедряемой библиотеки.



1609117029180.png