Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
DllShimmer — Weaponisez facilement le détournement de DLL. Installez une porte dérobée dans n'importe quelle fonction de n'importe quelle DLL. | Kitploit
Outils/GitHubGitHub/print3m/dllshimmer
Mécanismes de PersistanceTests d'IntrusionRed TeamingDéveloppement de Charges UtilesAttaque Adversariale
GitHubprint3m/dllshimmer

DllShimmer

Weaponisez facilement le détournement de DLL. Installez une porte dérobée dans n'importe quelle fonction de n'importe quelle DLL.

Voir le dépôt
75085il y a 11 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

DllShimmer

Transformez le détournement de DLL en arme facilement. Installez une backdoor dans n'importe quelle fonction de n'importe quelle DLL sans perturber le fonctionnement normal du processus.

DllShimmer flowchart

Comment ça fonctionne

DllShimmer analyse la DLL d'origine et extrait des informations sur les fonctions exportées (nom, numéro ordinal et informations de forwarder). Sur la base de ces informations, DllShimmer crée un fichier C++ générique (.cpp). Le fichier généré vous permet d'ajouter votre propre code à chaque fonction exportée par la DLL d'origine sans perturber le fonctionnement normal du programme. Aucune rétro-ingénierie ni instrumentation n'est requise, car DllShimmer ne repose pas sur les signatures de fonctions (voir plus dans « Limitations »).

Le deuxième fichier généré est un fichier .def, qui garantit que toutes les DLL exportées par le proxy après compilation auront les mêmes noms et numéros ordinaux que dans la DLL d'origine.

Après compilation, l'EAT de la DLL proxy est une copie exacte de l'EAT de la DLL d'origine. Tous les noms et numéros ordinaux des fonctions exportées correspondent, et les fonctions redirigées (forwarders) le sont également. DllShimmer ne redirige pas explicitement toutes les fonctions (comme la plupart des outils), créant ainsi une structure EAT entièrement nouvelle et suspecte.

Installation

Compilez le code source Go ou téléchargez le binaire compilé.

Dépendances :

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

Utilisation

Exemple :

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

# Backdoor random chat.dll (proxy to relative path)
./DllShimmer -i chat.dll -o project/ -x "lib/chat2.dll" -m

# Backdoor random app.dll (static linking to the original DLL)
./DllShimmer -i app.dll -o project/ -x "app2.dll" -m --static

Paramètres :

-i / --input <path> [obligatoire]

La DLL d'origine que vous souhaitez backdoorer.

-o / --output <path> [obligatoire]

Le chemin vers le répertoire où DllShimmer enregistrera tous les fichiers générés.

-x / --original <path> [obligatoire]

En cas de liaison dynamique (par défaut), fournissez le chemin où la DLL proxy trouvera la DLL d'origine sur le système cible.

En cas de liaison statique (--static), spécifiez uniquement le nom de la DLL d'origine. Elle sera recherchée selon l'ordre de chargement par défaut de Windows.

-m / --mutex [optionnel]

L'activation de cette option ajoute un mutex au fichier source, ce qui empêche votre backdoor d'être exécutée plus d'une fois lors d'une seule exécution du programme. Toutes les fonctions d'origine continueront de fonctionner normalement.

--static [optionnel]

Active la liaison statique entre la DLL proxy (IAT) et la DLL d'origine (EAT). Cela génère un fichier .lib supplémentaire dans le répertoire de sortie, qui agit comme la DLL d'origine pour la compilation statique.

Cette technique présente de sérieuses limitations par rapport à la liaison dynamique :

  • Vous ne pouvez pas définir un chemin complet ou relatif vers la DLL d'origine. Le chargeur système n'utilise que le nom de DLL de l'IAT proxy et recherche dans les chemins par défaut.
  • Informations de débogage limitées. Si la DLL d'origine ne parvient pas à se charger, le programme plantera généralement sans information supplémentaire.

Cependant, la liaison statique peut être plus furtive et plus naturelle dans certains scénarios.

Par défaut : DllShimmer utilise toujours la liaison dynamique avec les fonctions LoadLibraryA() et GetProcAddress().

--debug-file <path> [optionnel]

Enregistre les journaux de débogage dans un fichier. Les journaux sont écrits dans un fichier en continu pendant l'exécution du programme. Si cette option est sélectionnée, les journaux ne sont pas affichés sur STDOUT.

Par défaut : DllShimmer écrit toujours les journaux de débogage sur STDOUT.

Exemple de sortie de débogage :

Example debug output

Limitations

  • Seule l'architecture x86-64 / AMD64 est prise en charge.
  • Selon toute vraisemblance, le code proxy générique ne fonctionnera pas pour les fonctions avec des paramètres à virgule flottante, car ils utilisent des registres différents de ceux des entiers employés par DllShimmer. Si vous connaissez la signature de la fonction, vous pouvez l'ajuster manuellement dans le fichier généré.
  • Les fonctions avec plus de 12 arguments ne fonctionneront pas, car ce nombre a été codé en dur dans les modèles de DllShimmer.
  • Certaines énormes DLL obfusquées utilisent des techniques de name mangling, des conventions d'appel et des astuces étranges (par exemple les DLL du framework Qt compilé). Je ne recommande pas de les utiliser comme DLL proxy. DllShimmer générera très probablement des résultats inutilisables dans ce cas.

Dépannage

Avant de commencer le dépannage :

  1. Lisez la section « Limitations ».
  2. Assurez-vous de ne pas utiliser la liaison statique (--static). Il est plus facile de déboguer avec la liaison dynamique (par défaut).
  3. Enregistrez la sortie de débogage dans un fichier (--debug-file).

Dans le fichier .cpp généré, je ne vois pas toutes les fonctions exportées de la DLL d'origine.

Les fonctions définies comme « redirigées » (forwarded) dans la DLL d'origine ne sont pas incluses dans le fichier .cpp. Cependant, elles sont visibles dans le fichier .def. Elles seront également exportées après compilation, exactement comme dans la DLL d'origine.

Erreur de chargement étrange (126) lors du chargement de la DLL d'origine

Parfois, votre DLL proxy affiche une erreur lors du chargement de la DLL d'origine, avec le code d'erreur 126, même si vous avez théoriquement spécifié le chemin relatif correct dans le paramètre -x. Pourquoi cela ne fonctionne-t-il pas ?!?

Les DLL sont recherchées dans le Current Directory. Dans 98 % des cas, il s'agit simplement de l'emplacement du fichier EXE principal, mais certains programmes (principalement d'anciens programmes hérités) modifient arbitrairement le Current Directory en utilisant, par exemple, SetCurrentDirectoryW(). Le programme principal a connaissance de ce changement, il charge donc correctement votre DLL proxy, mais vous n'en avez pas connaissance et vous essayez de charger la DLL d'origine de manière relative, alors que le programme la recherche dans le Current Directory modifié.

Cette règle s'applique à la fois au chargement statique et dynamique de la DLL d'origine. Malheureusement, avec la liaison statique, ce problème est beaucoup plus difficile à détecter, car nous ne disposons pas d'informations de débogage. Le chargeur système échoue simplement et c'est tout. C'est pourquoi je recommande toujours d'utiliser d'abord la liaison dynamique par défaut.

En cas de liaison dynamique, nous avons deux options :

  1. Ajuster le chemin du paramètre -x à la nouvelle situation du Current Directory.
  2. Modifier dynamiquement le Current Directory pour rechercher les DLL là où nous le souhaitons.

En cas de liaison statique, nous n'avons vraiment qu'une seule option :

  1. Déplacer la DLL d'origine dans le Current Directory.

TODO

  • Prendre en charge les noms de fonctions C++ modifiés (mangling)
Télécharger l’outil