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

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.
Compila el código fuente de Go o descarga el binario compilado.
Dependencias:
x86_64-w64-mingw32-g++x86_64-w64-mingw32-dlltoolEjemplo:
# 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:
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:

Antes de empezar a solucionar problemas:
--static). Es más fácil depurar con enlace dinámico (por defecto).--debug-file)..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.
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:
-x a la nueva situación del Directorio actual.Directorio actual para buscar DLLs donde queramos.En el caso del enlace estático, realmente solo tenemos una opción:
Directorio actual.