Esta biblioteca y herramienta CLI escrita en Rust demuestra un método alternativo para encontrar la dirección base de DLL cargadas sin utilizar un recorrido del Process Environment Block (PEB). Esta técnica es particularmente útil en escenarios donde el recorrido del PEB podría ser detectado o bloqueado.
Diferencias entre ramas
Este repositorio contiene dos ramas con enfoques diferentes:
Rama principal
Usa la crate winapi y VirtualQuery para la validación de memoria
Las funciones de la biblioteca (lib.rs) no tienen sentencias de impresión para una integración limpia
La herramienta CLI (main.rs) incluye salida de depuración como prueba de concepto
Ideal para aprender y comprender la técnica
Rama OPSEC
Sin dependencias externas: completamente autocontenida
Sin llamadas a la API de Windows: usa acceso directo a memoria con manejo de excepciones en lugar de VirtualQuery
Sin sentencias de impresión en las funciones de la biblioteca
Sigilo mejorado: no realiza llamadas a la API
Mejor para implantes/herramientas: deja menos rastros y es más difícil de detectar
Ambas ramas son seguras de usar, pero la rama OPSEC proporciona beneficios adicionales de seguridad operativa para escenarios donde las llamadas a la API podrían ser monitoreadas o bloqueadas.
Cómo funciona
El programa utiliza un enfoque de recorrido de pila para localizar DLL mediante:
Acceso al Thread Environment Block (TEB):
Usa ensamblador en línea para leer el puntero TEB desde el registro de segmento GS (GS:[0x30])
Recupera la base de la pila (GS:[0x08]) y el límite de la pila (GS:[0x10]) del TEB
Recorrido de pila:
Comienza desde el puntero de pila actual (RSP)
Recorre la pila hacia arriba buscando direcciones de retorno
Comprueba cada dirección en busca de memoria ejecutable
Rama principal: usa VirtualQuery para validar las regiones de memoria
Rama OPSEC: usa acceso directo a memoria con manejo de excepciones
Identificación de módulos:
Para cada posible dirección de retorno, comprueba si apunta a memoria ejecutable
Cuando se encuentra memoria ejecutable, retrocede para encontrar el encabezado PE
Valida el módulo comprobando:
Firma MZ (encabezado DOS)
Firma PE
Características de DLL
Arquitectura de 64 bits
Nombre del módulo desde el directorio de exportaciones
Validación:
Verifica que el módulo sea la DLL objetivo comprobando su nombre en el directorio de exportaciones
Confirma que todas las estructuras del encabezado PE son válidas
¿Por qué este enfoque?
Los métodos tradicionales para encontrar DLL suelen implicar recorrer la lista de módulos del PEB. Si bien es efectivo, este enfoque puede ser:
Detectado por el software de seguridad
Bloqueado en ciertos entornos
Este método de recorrido de pila ofrece una alternativa que:
No depende del PEB
Puede funcionar en entornos donde el recorrido del PEB está bloqueado