
C++ DLL, выполняющая перехват таблицы импорта адресов (IAT) путём разбора заголовков PE и перенаправления адресов импортируемых функций на пользовательский хук внутри целевого процесса.
Хукинг — это техника, позволяющая перенаправить поток выполнения программы. Чаще всего мы используем хукинг функций. Мы либо заменяем, либо перенаправляем функцию на нашу собственную — это очень полезно и имеет множество применений. Существует несколько способов хукинга, здесь мы рассматриваем IAT Hooking, что означает Import Address Table (Таблица адресов импорта). Он заключается в замене адреса функции на наш собственный в большой таблице, которая заполняется во время выполнения. Как я уже говорил в другом репозитории, рекомендую вам подробнее изучить PE Format, чтобы понять часть этого кода, связанную с парсингом IAT.
Вот базовая диаграмма того, как работает IAT Hooking. В этом примере оригинальная функция вызывается после выполнения вредоносного кода. В данном примере мы просто вызовем другую функцию вместо оригинальной. Преимущество этой техники в том, что она не требует модификации тела функции, в отличие от обычного хука через патч .text с использованием detours, который должен изменять инструкции в начале функции, чтобы разместить, например, jmp.
На самом деле это гораздо проще, чем звучит. Мы будем действовать изнутри процесса, чтобы упростить задачу — это означает, что данный репозиторий скомпилируется в DLL, которую можно внедрить в целевой процесс с помощью моих инжекторов LoadLibraryA или Manual Mapping.
Сначала мы парсим PE Headers целевого процесса, чтобы найти Import Descriptor следующим образом:
process_base + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
Затем мы можем пройтись в цикле по каждому импортированному модулю, пройтись по каждой функции в этом модуле (причина вложенных циклов) и найти адрес той функции, который был заполнен во время выполнения. В этом примере мы захукаем TranslateMessage, которая используется Windows для обработки событий в GUI. Итак, как только мы нашли адрес этой функции, мы заменяем его на адрес нашей собственной функции, которую мы определили ранее и которая существует в контексте удалённого процесса, поскольку мы работаем изнутри. Не забудьте использовать VirtualProtect, чтобы убедиться, что у вас есть разрешение на запись в это место.
VirtualProtect(&firstThunk->u1.Function, sizeof(uint64_t), PAGE_READWRITE, &old_protection);
firstThunk->u1.Function = (uint64_t)hookfunction;
Как видите, когда notepad вызывает TranslateMessage (практически постоянно), запускается наша хук-функция, которая в итоге отображает message box!
image