
RefleXXion es una utilidad diseñada para ayudar a evadir los hooks de modo usuario utilizados por AV/EPP/EDR, etc. Para evadir los hooks de modo usuario, primero recopila los números de syscall de NtOpenFile, NtCreateSection, NtOpenSection y NtMapViewOfSection que se encuentran en el array LdrpThunkSignature.

RefleXXion es una utilidad diseñada para ayudar a evadir los hooks en modo usuario utilizados por AV/EPP/EDR, etc. Para evadir los hooks en modo usuario, primero recopila los números de syscall de NtOpenFile, NtCreateSection, NtOpenSection y NtMapViewOfSection encontrados en el array LdrpThunkSignature. Después de eso, hay dos técnicas que el usuario puede elegir para evadir los hooks en modo usuario.
Técnica-1: lee NTDLL como un archivo desde C:\Windows\System32\ntdll.dll. Después de analizarlo, la sección .TEXT de la NTDLL ya cargada (donde se realizan los hooks) en memoria se reemplaza con la sección .TEXT de la NTDLL limpia.
En la Técnica-2, NTDLL se lee como Sección desde KnownDlls, \KnownDlls\ntdll.dll. (porque los archivos DLL se almacenan en caché en KnownDlls como Sección). Después de analizarlo, la sección .TEXT de la NTDLL ya cargada (donde se realizan los hooks) en memoria se reemplaza con la sección .TEXT de la NTDLL limpia.
El flujo detallado de la metodología y todas las técnicas se muestra a continuación.

Puedes abrir y compilar el proyecto con Visual Studio. Todo el proyecto admite arquitectura x64 tanto para los modos Debug como Release.
La solución RefleXXion-EXE genera el EXE con fines de PoC. Si quieres entender cómo funciona el proyecto paso a paso, te facilitará el trabajo. La función Main contiene las definiciones de las funciones Technique1 y Technique2. Comenta una de ellas y compila. No uses ambas funciones al mismo tiempo.
La solución RefleXXion-DLL genera la DLL que inyectas en el proceso del cual deseas evadir los hooks en modo usuario para NTDLL. Al principio del archivo main.cpp, hay definiciones de qué técnica usar. Puedes elegir una de ellas y compilarla. No configures todos los valores al mismo tiempo, configura solo la técnica que deseas. A continuación se muestra un ejemplo de configuración.
// 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 actualmente solo es compatible con arquitectura x64.
RefleXXion solo desengancha las funciones de NTDLL, es posible que también necesites desenganchar otras DLL (kernel32.dll, advapi32.dll, etc.). Para ello, puedes editar fácilmente los lugares necesarios en el proyecto.
RefleXXion solo utiliza la región de memoria RWX cuando comienza el proceso de sobrescritura de la sección .TEXT. Para este proceso no se crea una nueva región de memoria, la región de memoria existente (la sección TEXT de la NTDLL ya cargada) se convierte en RWX y luego se convierte en RX.
ULONG oldProtection;
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, PAGE_EXECUTE_READWRITE, &oldProtection);
memcpy()...
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, oldProtection, &oldProtection);
P.D. RefleXXion invoca la API NtProtectVirtualMemory sobre la NTDLL limpia instalada. Utiliza la función CustomGetProcAddress para esto porque la NTDLL limpia no está en la lista InLoadOrderModuleList aunque está cargada en memoria. Por lo tanto, una solución como la de aquí (https://stackoverflow.com/questions/6734095/how-to-get-module-handle-from-func-ptr-in-win32) no funcionará. Por eso existe y se utiliza la función personalizada GetProcAddress.
Puedes cargar la DLL de RefleXXion desde el disco al proceso objetivo. Puede que no prefieras una ejecución así para trabajos sensibles como una operación de Red Team. Por lo tanto, puedes convertir la DLL de RefleXXion a shellcode usando el proyecto sRDI o integrar el código de RefleXXion en tu propio cargador o proyecto.
Incluso si NTDLL (como archivo o como sección) se recarga en el proceso inyectado, no permanece cargada. RefleXXion cierra todos los identificadores abiertos (identificadores de archivo y sección) para sus propios procesos.