DLL (Dynamic Link Library) Injection
Involucra insertar una pieza de código, estructurada como un DLL, en un proceso en ejecución.
Permite al ćodigo insertado ejecutarse dentro del contexto del proceso, influyendo en su comportamiento y accediendo a sus recursos.
Los desarrolladores aprovechan legítimamente DLL injection para modificar o actualizar sin la necesidad de reiniciar un proceso en ejecución inmediatamente.
Esta ténica es efectiva evadiendo software de seguridad.
Métodos
LoadLibrary
Emplea la API de LoadLibrary para carga el DLL en el espacio de direcciones del proceso objetivo.
Carga una DLL en la memoria del proceso actual y devuelve un identificador que se puede usar para obtener las direcciones de las funciones dentro de la DLL.
#include <windows.h>
#include <stdio.h>
int main() {
// Using LoadLibrary to load a DLL into the current process
HMODULE hModule = LoadLibrary("example.dll");
if (hModule == NULL) {
printf("Failed to load example.dll\n");
return -1;
}
printf("Successfully loaded example.dll\n");
return 0;
}LoadLibrary para DLL injection
Su papel es colocar la ruta de la DLL en la memoria del proceso remoto y arrancar un hilo dentro de ese proceso que invoque LoadLibraryA(...), lo que hace que el loader de Windows mapee y ejecute la DLL maliciosa.
El uso de LoadLibrary es monitoreado por sistemas de seguridad y anti-cheat.
OpenProcess(...)— obtiene handle al proceso objetivo (acceso necesario).VirtualAllocEx(...)— reserva memoria dentro del proceso remoto para guardar la ruta de la DLL.WriteProcessMemory(...)— escribe la cadena con la ruta de la DLL en esa memoria remota.GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA")— obtiene la dirección deLoadLibraryA(función del kernel32).CreateRemoteThread(..., loadLibraryAddress, dllPathAddressInRemoteMemory, ...)— crea un hilo en el proceso objetivo que comienza enLoadLibraryAy recibe como parámetro la ruta escrita; ese hilo ejecutaLoadLibraryA("C:\\ruta\\a\\tu.dll")dentro del proceso objetivo, provocando la carga y ejecución de la DLL.
Manual Mapping
Es la técnica de cargar una DLL dentro del espacio de otro proceso sin usar el loader del sistema (no se llama LoadLibrary). Se realiza manualmente todo lo que el loader haría: mapear secciones, aplicar relocations, resolver imports y ejecutar inicializadores.
Reflective DLL Injection
Técnica para cargar una DLL en otro proceso sin usar el loader del sistema. Contiene un mini‑loader (ReflectiveLoader) que se ejecuta desde donde haya sido escrita en memoria y se encarga de “auto‑instalarse”.
DLL Hijacking
DLL hijacking es una técnica donde un programa carga una DLL maliciosa (o involuntaria) porque busca dependencias siguiendo un orden vulnerable: el atacante coloca una DLL con el mismo nombre en una ruta que el programa consulta antes que la ubicación legítima. Cuando el programa pide la DLL, el sistema carga la versión equivocada —y el atacante obtiene ejecución en el contexto del proceso.
El orden de búsqueda de DLL predeterminado utilizado por el sistema depende de si Safe DLL Search Mode está activado (predeterminado), ubica el directorio actual del usuario mas abajo en el órden de búsqueda.
Modificar Safe DLL Search Mode
Windows Key + R
Escribir Regedit y presionar Enter
Navegar a
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session ManagerEn el panel de la derecha buscar el valor
SafeDllSearchMode. Si no existe, click derecho sobre un espacio en blanco, seleccionarNew, yDWORD (32-bit) Value. LlamarloSafeDllSearchMode.Doble click sobre
SafeDllSearchModey modificar el campoValuea 1 para habilitarlo o 0 para deshabilitarlo.
Identificar una DLL que el objetivo está intentando localizar con Process Explorer o PE Explorer.
Identificar que funciones se quieren modificar con herramientas de ingeniería inversa.
Construir el DLL
Ejemplo de programa que carga una DLL de forma relativa
Proxying
DLL proxying (o DLL proxy) es una técnica donde una DLL “intermediaria” se coloca entre una aplicación y la DLL legítima que ésta espera. El proxy exporta las mismas funciones que la original, puede ejecutar código propio y luego redirige las llamadas a la DLL legítima real.
Crear una nuevo librería
Cargar una función del programa original
Manipular la función
Retornar la función modificada
Invalid Libraries
Reemplazar una librería válida que el programa intenta cargar pero no puede encontrar. Cambiar el filtro de procmon para enfocarse en entradas cuya ruta finaliza en .dll y tiene un status de NAME NOT FOUND.
Last updated