
Автоматизированный сканер для поиска кандидатов на перехват порядка поиска DLL в исполняемых файлах Windows, с функциями разбора таблицы импорта, перечисления модулей во время выполнения и перехвата API с помощью Microsoft Detours.
DLL Hijack SCanner — инструмент для генерации зацепок и автоматизации поиска кандидатов для перехвата порядка поиска DLL (DLL Search Order Hijacking).
В этом репозитории размещены файлы проекта Visual Studio для инструмента (DLLHSC), файл проекта для функциональности перехвата API (detour), файл проекта для полезной нагрузки (payload) и, наконец, скомпилированные исполняемые файлы для архитектур x86 и x64 (в разделе release этого репозитория). Код написан и скомпилирован с помощью Visual Studio Community 2019.
Если вы решите скомпилировать инструмент из исходников, вам потребуется скомпилировать проекты DLLHSC, detour и payload. DLLHSC реализует основную функциональность этого инструмента. Проект detour генерирует DLL, используемую для перехвата API. Проект payload генерирует DLL, используемую в качестве доказательства концепции для проверки, может ли тестируемый исполняемый файл загрузить её через перехват порядка поиска. Сгенерированная полезная нагрузка должна быть помещена в тот же каталог, что и DLLHSC, и переименована в payload32.dll для архитектуры x86 и payload64.dll для архитектуры x64.
Инструмент реализует три режима работы, описанные ниже.
Загружает образ исполняемого файла в память, анализирует таблицу импорта и затем заменяет любую DLL, указанную в таблице импорта, на DLL-полезную нагрузку.
Инструмент помещает в каталог приложения только тот модуль (DLL), который отсутствует в каталоге приложения, не принадлежит к WinSxS и не входит в список KnownDLLs.
DLL-полезная нагрузка при выполнении создаёт файл по следующему пути:
C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSC.tmp в качестве доказательства выполнения. Инструмент запускает приложение и сообщает, была ли выполнена DLL-полезная нагрузка, проверяя наличие временного файла. Поскольку некоторые исполняемые файлы импортируют функции из загружаемых ими DLL, могут появляться окна сообщений об ошибках, когда предоставленная DLL не экспортирует эти функции и, таким образом, не удовлетворяет зависимостям предоставленного образа. Однако появление окон сообщений указывает на то, что DLL может быть хорошим кандидатом для выполнения полезной нагрузки, если зависимости будут удовлетворены. В этом случае требуется дополнительный анализ. Заголовки таких окон могут содержать строки: Ordinal Not Found или Entry Point Not Found. DLLHSC ищет окна, содержащие эти строки, закрывает их сразу после появления и сообщает результаты.
Создаёт процесс с предоставленным образом исполняемого файла, перечисляет модули, загруженные в адресное пространство этого процесса, и сообщает результаты после применения фильтров.
Инструмент сообщает только о модулях, загруженных из системного каталога (System directory) и не входящих в список KnownDLLs. Полученные результаты являются зацепками, требующими дополнительного анализа. Аналитик может затем поместить отмеченные модули в каталог приложения и проверить, загрузит ли приложение предоставленный модуль вместо оригинального.
Перехватывает API LoadLibrary и LoadLibraryEx с помощью Microsoft Detours и сообщает о модулях, загружаемых во время выполнения.
Каждый раз, когда сканируемое приложение вызывает LoadLibrary или LoadLibraryEx, инструмент перехватывает вызов и записывает запрошенный модуль в файл C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSCRTLOG.tmp. Если LoadLibraryEx вызывается с флагом LOAD_LIBRARY_SEARCH_SYSTEM32, вывод в файл не производится. После завершения всех перехватов инструмент считывает файл и выводит результаты. Для дальнейшего анализа представляют интерес модули, отсутствующие в ключе реестра KnownDLLs, модули, отсутствующие в системном каталоге, и модули без полного пути (для этих модулей загрузчик применяет обычный порядок поиска).
Если вы решите скомпилировать инструмент из исходников, рекомендуется делать это в Visual Studio 2019. Для корректной работы инструмента проекты DLLHSC, detour и payload должны быть скомпилированы для одной архитектуры, а затем помещены в один каталог. Обратите внимание, что DLL, сгенерированная из проекта payload, должна быть переименована в payload32.dll для 32-битной архитектуры или payload64.dll для 64-битной архитектуры.
Меню помощи данного приложения
NAME
dllhsc - DLL Hijack SCanner
SYNOPSIS
dllhsc.exe -h
dllhsc.exe -e <executable image path> (-l|-lm|-rt) [-t seconds]
DESCRIPTION
DLLHSC scans a given executable image for DLL Hijacking and reports the results
It requires elevated privileges
OPTIONS
-h, --help
display this help menu and exit
-e, --executable-image
executable image to scan
-l, --lightweight
parse the import table, attempt to launch a payload and report the results
-lm, --list-modules
list loaded modules that do not exist in the application's directory
-rt, --runtime-load
display modules loaded in run-time by hooking LoadLibrary and LoadLibraryEx APIs
-t, --timeout
number of seconds to wait for checking any popup error windows - defaults to 10 seconds
В этом разделе приведены примеры того, как можно запустить DLLHSC, и результаты, которые он сообщает. Для этой цели использовалась легитимная утилита Microsoft OleView.exe (MD5: D1E6767900C85535F300E08D76AAC9AB). Для лучших результатов рекомендуется сканировать предоставленный образ исполняемого файла в его каталоге установки.
Флаг -l анализирует таблицу импорта предоставленного исполняемого файла, применяет фильтры и пытается «вооружить» импортированные модули, помещая DLL-полезную нагрузку в текущий каталог приложения. Сканируемый исполняемый файл может показывать окно ошибки, когда зависимости для DLL-полезной нагрузки (экспортируемые функции) не удовлетворены. В этом случае появляется окно сообщения об ошибке. По умолчанию DLLHSC проверяет в течение 10 секунд (или в течение количества секунд, указанного пользователем с флагом -t), было ли открыто окно сообщения. Окно сообщения об ошибке указывает, что если зависимости будут удовлетворены, модуль можно «вооружить».
На следующем скриншоте показано окно сообщения об ошибке, возникающее при загрузке OleView.dll через DLL-полезную нагрузку:

Инструмент ожидает максимальное время 10 секунд или -t секунд, чтобы убедиться, что инициализация процесса завершена и любое окно сообщения было сгенерировано. Затем он обнаруживает окно сообщения, закрывает его и сообщает результат:

Флаг -lm запускает предоставленный исполняемый файл и выводит модули, которые он загружает и которые не принадлежат ни списку KnownDLLs, ни зависимостям WinSxS. Этот режим предназначен для того, чтобы дать представление о DLL, которые могут быть использованы в качестве полезной нагрузки, и существует только для генерации зацепок для аналитика.

Флаг -rt выводит модули, которые предоставленный образ исполняемого файла загружает в своё адресное пространство при запуске в качестве процесса. Это достигается перехватом API LoadLibrary и LoadLibraryEx с помощью Microsoft Detours.

Для любой обратной связи по этому инструменту используйте раздел Issues на GitHub.