Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
DllShimmer — Convierte en arma el secuestro de DLL fácilmente. Implementa una puerta trasera en cualquier función de cualquier DLL. | Kitploit
Herramientas/GitHubGitHub/print3m/dllshimmer
Mecanismos de PersistenciaPruebas de PenetraciónRed TeamingDesarrollo de PayloadsAtaque Adversario
GitHubprint3m/dllshimmer

DllShimmer

Convierte en arma el secuestro de DLL fácilmente. Implementa una puerta trasera en cualquier función de cualquier DLL.

Ver Repositorio
750855hace 1 añoRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

DllShimmer

Facilita el secuestro de DLLs. Inyecta tu código en cualquier función de cualquier DLL sin alterar el funcionamiento normal del proceso.

Diagrama de DllShimmer

Cómo funciona

DllShimmer analiza la DLL original y extrae información sobre las funciones exportadas (nombre, número ordinal e información de reenvío). Con esta información, DllShimmer crea un archivo C++ de plantilla (.cpp). El archivo generado te permite añadir tu propio código a cada función exportada por la DLL original sin alterar el funcionamiento normal del programa. No se requiere ingeniería inversa ni instrumentación, porque DllShimmer no depende de las firmas de las funciones (consulta más en “Limitaciones”).

El segundo archivo generado es un archivo .def, que garantiza que todas las DLL exportadas por el proxy tras la compilación tengan los mismos nombres y números ordinales que la DLL original.

Tras la compilación, el EAT de la DLL proxy es una copia exacta del EAT de la DLL original. Todos los nombres y números ordinales de las funciones exportadas coinciden, y las funciones reenviadas también se reenvían. DllShimmer no reenvía explícitamente todas las funciones (como hace la mayoría de las herramientas), creando así una estructura EAT completamente nueva y sospechosa.

Instalación

Compila el código fuente de Go o descarga el binario compilado.

Dependencias:

  • x86_64-w64-mingw32-g++
  • x86_64-w64-mingw32-dlltool

Uso

Ejemplo:

root@kitploit:~
# Backdoor a version.dll (proxy a ruta absoluta)
./DllShimmer -i version.dll -o project/ -x "C:/Windows/System32/version.dll" -m

# Backdoor a chat.dll aleatoria (proxy a ruta relativa)
./DllShimmer -i chat.dll -o project/ -x "lib/chat2.dll" -m

# Backdoor a app.dll aleatoria (enlace estático a la DLL original)
./DllShimmer -i app.dll -o project/ -x "app2.dll" -m --static

Parámetros:

-i / --input <ruta> [obligatorio]

La DLL original a la que quieres aplicar el backdoor.

-o / --output <ruta> [obligatorio]

La ruta al directorio donde DllShimmer guardará todos los archivos generados.

-x / --original <ruta> [obligatorio]

En caso de enlace dinámico (por defecto), indica la ruta donde la DLL proxy encontrará la DLL original en el sistema de destino.

En caso de enlace estático (--static), especifica únicamente el nombre de la DLL original. Se buscará según el orden de carga predeterminado de Windows.

-m / --mutex [opcional]

Al habilitar esta opción, se añadirá un mutex al archivo fuente que evita que tu backdoor se ejecute más de una vez durante una sola ejecución del programa. Todas las funciones originales seguirán funcionando con normalidad.

--static [opcional]

Habilita el enlace estático entre la DLL proxy (IAT) y la DLL original (EAT). Esto genera un archivo .lib adicional en el directorio de salida, que actúa como la DLL original para la compilación estática.

Esta técnica tiene algunas limitaciones importantes en comparación con el enlace dinámico:

  • No puedes definir una ruta completa o relativa a la DLL original. El cargador del sistema solo utiliza el nombre de la DLL del IAT del proxy y busca en las rutas predeterminadas.
  • Información de depuración limitada. Si la DLL original no se carga correctamente, el programa normalmente fallará sin información adicional.

Sin embargo, el enlace estático puede ser más sigiloso y natural en algunos escenarios.

Por defecto: DllShimmer siempre utiliza enlace dinámico con las funciones LoadLibraryA() y GetProcAddress().

--debug-file <ruta> [opcional]

Guarda los registros de depuración en un archivo. Los registros se escriben en un archivo de forma continua mientras el programa se ejecuta. Si se selecciona, los registros no se imprimen en STDOUT.

Por defecto: DllShimmer siempre escribe los registros de depuración en STDOUT.

Ejemplo de salida de depuración:

Ejemplo de salida de depuración

Limitaciones

  • Solo se admite la arquitectura x86-64 / AMD64.
  • Lo más probable es que el código proxy genérico no funcione con funciones que tengan parámetros de coma flotante, ya que usan registros diferentes a los enteros utilizados por DllShimmer. Si conoces la firma de la función, puedes ajustarla manualmente en el archivo generado.
  • Las funciones con más de 12 argumentos no funcionarán porque ese número está fijado en las plantillas de DllShimmer.
  • Hay algunas DLL ofuscadas de gran tamaño con alteraciones extrañas de nombres, convenciones de llamada y trucos (por ejemplo, DLL compiladas del framework Qt). No recomiendo usarlas como DLL proxy. DllShimmer probablemente generará código basura en ese caso.

Solución de problemas

Antes de empezar a solucionar problemas:

  1. Lee "Limitaciones".
  2. Asegúrate de que no usas enlace estático (--static). Es más fácil depurar con enlace dinámico (por defecto).
  3. Guarda la salida de depuración en un archivo (--debug-file).

En el archivo .cpp generado no veo todas las funciones exportadas de la DLL original.

Las funciones definidas en la DLL original como “reenviadas” no se incluyen en el archivo .cpp. Sin embargo, son visibles en el archivo .def. También se exportarán después de la compilación, exactamente igual que en la DLL original.

Error extraño del cargador (126) al cargar la DLL original

A veces, tu DLL proxy muestra un error al cargar la DLL original, y el código de error es 126, aunque teóricamente especificaste la ruta relativa correcta en el parámetro -x. ¿Por qué no funciona?

Las DLL se buscan en el Directorio actual. En el 98% de los casos, esto es simplemente la ubicación del archivo EXE principal, pero hay programas (sobre todo antiguos y heredados) que cambian arbitrariamente el Directorio actual usando, por ejemplo, SetCurrentDirectoryW(). El programa principal está al tanto de este cambio, por lo que carga tu DLL proxy correctamente, pero tú no lo estás y tratas de cargar la DLL original de forma relativa, mientras que el programa la busca en el Directorio actual modificado.

Esta regla se aplica tanto a la carga estática como a la dinámica de la DLL original. Desafortunadamente, con el enlace estático este problema es mucho más difícil de detectar porque no tenemos información de depuración. El cargador del sistema simplemente falla y ya está. Por eso siempre recomiendo usar primero el enlace dinámico predeterminado.

En el caso del enlace dinámico, tenemos dos opciones:

  1. Ajustar la ruta del parámetro -x a la nueva situación del Directorio actual.
  2. Cambiar dinámicamente el Directorio actual para buscar DLLs donde queramos.

En el caso del enlace estático, realmente solo tenemos una opción:

  1. Mover la DLL original al Directorio actual.

TODO

  • Soporte para nombres de función modificados (mangled) de C++
Descargar herramienta