reflexión es una utilidad diseñada para ayudar a eludir los ganchos de modo de usuario utilizados por AV/EPP/EDR, etc. Para omitir el enlace del modo de usuario, primero recopila los números de llamada al sistema de NtOpenFile, NtCreateSection, NtOpenSection y NtMapViewOfSection en LdrpThunkSignature. Después de eso, el usuario puede elegir entre dos técnicas para eludir el enlace de modo de usuario.
Técnica 1, lea NTDLL como un archivo C:\Windows\System32\ntdll.dll
Después del análisis, la sección .TEXT del NTDLL cargado en la memoria (donde se ejecuta el gancho) se reemplaza con la sección .TEXT del NTDLL limpio.
En la técnica 2, NTDLL se lee como Sección de KnownDlls, \KnownDlls\ntdll.dll
(Porque los archivos DLL se almacenan en caché en KnownDlls como secciones).
El flujo detallado del método y todas las técnicas es el siguiente:
cómo utilizar
Puede usar Visual Studio para abrir y compilar proyectos. Todo el proyecto es compatible con la arquitectura x64 en los modos Depuración y Liberación.
La solución RefleXXion-EXE genera EXE para propósitos de PoC. Te facilitará el trabajo si quieres entender paso a paso cómo funciona el proyecto. La función Principal contiene las definiciones de las funciones Técnica1 y Técnica2. Comenta uno de ellos y compila. No utilice ambas funciones al mismo tiempo.
La solución RefleXXion-DLL genera una DLL que usted inyecta en el proceso que desea omitir los enlaces de modo de usuario de NTDLL.al principio main.cpp
En el documento, hay una definición de qué tecnología se utiliza. Puedes elegir uno de ellos y compilarlo. No establezca todos los valores a la vez, establezca solo la técnica que desee. A continuación se proporciona un ejemplo de configuración.
// sección de configuración técnica
define FROM_DISK 1 // Si se establece en 1, se utilizará la técnica 1. Obtenga más información; https://github.com/hlldz/RefleXXion
define FROM_KNOWNDLLS 0 // Si se establece en 1, se utilizará la técnica 2. Obtenga más información; https://github.com/hlldz/RefleXXion
Instrucciones de funcionamiento y preguntas de OPSEC
- RefleXXion actualmente solo es compatible con la arquitectura x64.
- RefleXXion solo descomprime funciones NTDLL, es posible que también deba descomprimir otras DLL (kernel32.dll, advapi32.dll, etc.). Para esto, puede editar fácilmente las ubicaciones necesarias en su proyecto.
- RefleXXion solo usa el área de memoria RWX al comienzo del proceso de sobrescribir la sección .TEXT. Para este proceso, no se crea ninguna región de memoria nueva, la región de memoria existente (la porción de TEXTO del NTDLL cargado) se RWX y luego se convierte a RX.
ULONG antigua protección;
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, PAGE_EXECUTE_READWRITE, &oldProtection);
memcpy()…
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, oldProtection, &oldProtection);
- PS RefleXXion llama a la API NtProtectVirtualMemory a través de un NTDLL limpio instalado. Utiliza la función CustomGetProcAddress para esto porque incluso si se carga un NTDLL limpio en la memoria, no está en la lista de módulos de orden de carga. Entonces, soluciones como esta (https://stackoverflow.com/questions/6734095/how-to-get-module-handle-from-func-ptr-in-win32) no funcionarán. Es por eso que existe y se usa una función GetProcAddress personalizada.
- Puede cargar la DLL de RefleXXion desde el disco en el proceso de destino. Para trabajos delicados como el equipo rojo, es posible que no le guste correr así. Por lo tanto, puede usar el proyecto sRDI para convertir la DLL de RefleXXion a shellcode, o integrar el código de RefleXXion en su propio cargador o proyecto.
- Incluso si el NTDLL (como archivo o sección) se vuelve a cargar en el proceso inyectado, no permanece cargado. RefleXXion cierra todos los identificadores abiertos (identificadores de archivos y secciones) para su propio proceso.