
RefleXXion — это утилита, предназначенная для обхода user-mode хуков, используемых AV/EPP/EDR и т. п. Чтобы обойти user-mode хуки, она сначала собирает номера системных вызовов (syscall) для NtOpenFile, NtCreateSection, NtOpenSection и NtMapViewOfSection из массива LdrpThunkSignature.

RefleXXion — это утилита, предназначенная для обхода пользовательских хуков, используемых AV/EPP/EDR и т.д. Чтобы обойти пользовательские хуки, она сначала собирает номера системных вызовов NtOpenFile, NtCreateSection, NtOpenSection и NtMapViewOfSection, найденных в массиве LdrpThunkSignature. После этого пользователь может выбрать один из двух методов для обхода пользовательских хуков.
Метод 1: читает NTDLL как файл из C:\Windows\System32\ntdll.dll. После парсинга секция .TEXT уже загруженной NTDLL (где установлены хуки) в памяти заменяется секцией .TEXT чистой NTDLL.
Метод 2: NTDLL читается как секция из KnownDlls, \KnownDlls\ntdll.dll (поскольку DLL-файлы кэшируются в KnownDlls как секция). После парсинга секция .TEXT уже загруженной NTDLL (где установлены хуки) в памяти заменяется секцией .TEXT чистой NTDLL.
Подробный поток методологии и всех методов приведен ниже.

Вы можете открыть и скомпилировать проект с помощью Visual Studio. Весь проект поддерживает архитектуру x64 как для режима Debug, так и для Release.
Решение RefleXXion-EXE генерирует EXE для целей PoC. Если вы хотите понять, как проект работает шаг за шагом, это облегчит вашу задачу. Основная функция содержит определения функций Technique1 и Technique2. Закомментируйте одну из них и скомпилируйте. Не используйте обе функции одновременно.
Решение RefleXXion-DLL генерирует DLL, которую вы внедряете в процесс, для которого хотите обойти пользовательские хуки NTDLL. В начале файла main.cpp находятся определения того, какой метод использовать. Вы можете выбрать один из них и скомпилировать. Не устанавливайте все значения одновременно, задайте только нужный метод. Пример конфигурации приведен ниже.
// Techniques configuration section
#define FROM_DISK 1 // If you set it to 1, the Technique-1 will be used. For more information; https://github.com/hlldz/RefleXXion
#define FROM_KNOWNDLLS 0 // If you set it to 1, the Technique-2 will be used. For more information; https://github.com/hlldz/RefleXXion
В настоящее время RefleXXion поддерживает только архитектуру x64.
RefleXXion снимает хуки только с функций NTDLL; возможно, вам также потребуется снять хуки с других DLL (kernel32.dll, advapi32.dll и т.д.). Для этого вы можете легко отредактировать необходимые места в проекте.
RefleXXion использует область памяти RWX только в процессе перезаписи секции .TEXT. Для этого процесса новая область памяти не создается: существующая область (секция TEXT уже загруженной NTDLL) получает права RWX, а затем преобразуется в RX.
ULONG oldProtection;
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, PAGE_EXECUTE_READWRITE, &oldProtection);
memcpy()...
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, oldProtection, &oldProtection);
Примечание: RefleXXion вызывает API NtProtectVirtualMemory поверх чисто установленной NTDLL. Для этого используется функция CustomGetProcAddress, поскольку чистая NTDLL не находится в списке InLoadOrderModuleList, даже если она загружена в память. Поэтому такое решение, как здесь (https://stackoverflow.com/questions/6734095/how-to-get-module-handle-from-func-ptr-in-win32), не сработает. Именно поэтому существует и используется пользовательская функция GetProcAddress.
Вы можете загрузить RefleXXion DLL с диска в целевой процесс. Для чувствительной работы, такой как операции Red Team, такой запуск может быть нежелателен. Поэтому вы можете преобразовать RefleXXion DLL в шелл-код с помощью проекта sRDI или интегрировать код RefleXXion в свой собственный загрузчик или проект.
Даже если NTDLL (как файл или как секция) перезагружается во внедренный процесс, она не остаётся загруженной. RefleXXion закрывает все открытые дескрипторы (файловые и секционные) для своих процессов.