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 de LoadLibraryA (función del kernel32).

  • CreateRemoteThread(..., loadLibraryAddress, dllPathAddressInRemoteMemory, ...) — crea un hilo en el proceso objetivo que comienza en LoadLibraryA y recibe como parámetro la ruta escrita; ese hilo ejecuta LoadLibraryA("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 Manager

  • En el panel de la derecha buscar el valor SafeDllSearchMode. Si no existe, click derecho sobre un espacio en blanco, seleccionar New, y DWORD (32-bit) Value. Llamarlo SafeDllSearchMode.

  • Doble click sobre SafeDllSearchMode y modificar el campo Value a 1 para habilitarlo o 0 para deshabilitarlo.

  1. Identificar una DLL que el objetivo está intentando localizar con Process Explorer o PE Explorer.

  2. Identificar que funciones se quieren modificar con herramientas de ingeniería inversa.

  3. 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.

  1. Crear una nuevo librería

  2. Cargar una función del programa original

  3. Manipular la función

  4. 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