Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
DllShimmer — Machen Sie DLL-Hijacking ganz einfach zur Waffe. Bauen Sie eine Hintertür in jede Funktion einer beliebigen DLL ein. | Kitploit
Tools/GitHubGitHub/print3m/dllshimmer
PersistenzmechanismenPenetrationstestsRed TeamingPayload-EntwicklungAdversarial-Angriff
GitHubprint3m/dllshimmer

DllShimmer

Machen Sie DLL-Hijacking ganz einfach zur Waffe. Bauen Sie eine Hintertür in jede Funktion einer beliebigen DLL ein.

Repository anzeigen
75085vor 0 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

DllShimmer

Machen Sie DLL-Hijacking ganz einfach zur Waffe. Hintertürchen für jede Funktion in jeder DLL, ohne den normalen Prozessbetrieb zu stören.

DllShimmer flowchart

So funktioniert es

DllShimmer parst die ursprüngliche DLL und extrahiert Informationen über exportierte Funktionen (Name, Ordnungszahl und Weiterleitungsinformationen). Basierend auf diesen Informationen erstellt DllShimmer eine Boilerplate-C++-Datei (.cpp). Die generierte Datei ermöglicht es Ihnen, jeder Funktion, die aus der ursprünglichen DLL exportiert wird, eigenen Code hinzuzufügen, ohne den normalen Betrieb des Programms zu stören. Es ist kein Reverse Engineering oder Instrumentierung erforderlich, da DllShimmer nicht auf Funktionssignaturen angewiesen ist (siehe dazu „Einschränkungen“).

Die zweite generierte Datei ist eine .def-Datei, die sicherstellt, dass alle aus dem Proxy nach der Kompilierung exportierten DLLs dieselben Namen und Ordnungszahlen wie in der ursprünglichen DLL haben.

Nach der Kompilierung ist die EAT in der Proxy-DLL eine exakte Kopie der EAT in der ursprünglichen DLL. Alle Namen und Ordnungszahlen exportierter Funktionen stimmen überein, und weitergeleitete Funktionen werden ebenfalls weitergeleitet. DllShimmer leitet nicht explizit alle Funktionen weiter (wie die meisten Tools), wodurch eine völlig neue und verdächtige EAT-Struktur entsteht.

Installation

Kompilieren Sie den Go-Quellcode oder laden Sie die kompilierte Binärdatei herunter.

Abhängigkeiten:

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

Verwendung

Beispiel:

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

Parameter:

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

Die ursprüngliche DLL, die Sie mit einem Hintertürchen versehen möchten.

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

Der Pfad zu dem Verzeichnis, in dem DllShimmer alle generierten Dateien speichert.

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

Im Fall der dynamischen Verknüpfung (Standard) geben Sie den Pfad an, unter dem die Proxy-DLL die ursprüngliche DLL auf dem Zielsystem findet.

Bei statischer Verknüpfung (--static) geben Sie nur den Namen der ursprünglichen DLL an. Sie wird gemäß der Standard-Ladereihenfolge unter Windows gesucht.

-m / --mutex [optional]

Wenn Sie diese Option aktivieren, wird der Quelldatei ein Mutex hinzugefügt, der verhindert, dass Ihr Hintertürchen während eines einzelnen Programmlaufs mehr als einmal ausgeführt wird. Alle ursprünglichen Funktionen funktionieren weiterhin normal.

--static [optional]

Aktiviert die statische Verknüpfung zwischen der Proxy-DLL (IAT) und der ursprünglichen DLL (EAT). Dadurch wird eine zusätzliche .lib-Datei im Ausgabeverzeichnis erzeugt, die bei der statischen Kompilierung als ursprüngliche DLL fungiert.

Diese Technik hat im Vergleich zur dynamischen Verknüpfung einige ernsthafte Einschränkungen:

  • Sie können keinen vollständigen oder relativen Pfad zur ursprünglichen DLL angeben. Der Systemlader verwendet nur den DLL-Namen aus der Proxy-IAT und sucht in den Standardpfaden.
  • Begrenzte Debug-Informationen. Wenn die ursprüngliche DLL nicht geladen werden kann, stürzt das Programm normalerweise ohne weitere Informationen ab.

Allerdings kann die statische Verknüpfung in einigen Szenarien unauffälliger und natürlicher sein.

Standard: DllShimmer verwendet immer dynamische Verknüpfung mit den Funktionen LoadLibraryA() und GetProcAddress().

--debug-file <path> [optional]

Speichert Debug-Logs in einer Datei. Die Logs werden während der Laufzeit des Programms fortlaufend in eine Datei geschrieben. Wenn diese Option ausgewählt ist, werden die Logs nicht auf STDOUT ausgegeben.

Standard: DllShimmer schreibt Debug-Logs immer auf STDOUT.

Beispiel für Debug-Ausgabe:

Example debug output

Einschränkungen

  • Es wird nur die Architektur x86-64 / AMD64 unterstützt.
  • Höchstwahrscheinlich funktioniert der generische Proxy-Code nicht für Funktionen mit Gleitkomma-Parametern, da diese andere Register verwenden als die von DllShimmer genutzten Integer-Register. Wenn Sie die Funktionssignatur kennen, können Sie sie in der generierten Datei manuell anpassen.
  • Funktionen mit mehr als 12 Argumenten funktionieren nicht, da diese Anzahl fest in die DllShimmer-Vorlagen eingebaut ist.
  • Es gibt einige große, verschleierte DLLs mit seltsamem Name Mangling, Aufrufkonventionen und Tricks (z. B. kompilierte Qt-Framework-DLLs). Ich empfehle nicht, sie als Proxy-DLL zu verwenden. DllShimmer wird in diesem Fall höchstwahrscheinlich etwas Unsinn erzeugen.

Fehlerbehebung

Bevor Sie mit der Fehlerbehebung beginnen:

  1. Lesen Sie „Einschränkungen“.
  2. Stellen Sie sicher, dass Sie keine statische Verknüpfung (--static) verwenden. Mit dynamischer Verknüpfung (Standard) lassen sich Fehler leichter beheben.
  3. Speichern Sie die Debug-Ausgabe in einer Datei (--debug-file).

In der generierten .cpp-Datei sehe ich nicht alle exportierten Funktionen der ursprünglichen DLL.

Funktionen, die in der ursprünglichen DLL als „weitergeleitet“ (forwarded) definiert sind, sind nicht in der .cpp-Datei enthalten. Sie sind jedoch in der .def-Datei sichtbar. Sie werden nach der Kompilierung ebenfalls genau wie in der ursprünglichen DLL exportiert.

Seltsamer Laderfehler (126) beim Laden der ursprünglichen DLL

Manchmal zeigt Ihre Proxy-DLL beim Laden der ursprünglichen DLL einen Fehler an, und der Fehlercode lautet 126, obwohl Sie theoretisch den richtigen relativen Pfad im Parameter -x angegeben haben. Warum funktioniert das nicht?!?

DLLs werden im Current Directory gesucht. In 98 % der Fälle ist dies einfach der Speicherort der Haupt-EXE-Datei, aber es gibt Programme (meist alte Legacy-Programme), die das Current Directory willkürlich ändern, z. B. mit SetCurrentDirectoryW(). Das Hauptprogramm ist sich dieser Änderung bewusst, sodass es Ihre Proxy-DLL korrekt lädt, aber Sie wissen nichts davon und versuchen, die ursprüngliche DLL relativ zu laden, während das Programm in dem geänderten Current Directory nach ihr sucht.

Diese Regel gilt sowohl für das statische als auch für das dynamische Laden der ursprünglichen DLL. Leider ist dieses Problem bei statischer Verknüpfung viel schwerer zu erkennen, da wir keine Debug-Informationen haben. Der Systemlader schlägt einfach fehl, und das war es. Deshalb empfehle ich immer, zuerst die standardmäßige dynamische Verknüpfung zu verwenden.

Bei dynamischer Verknüpfung haben wir zwei Möglichkeiten:

  1. Passen Sie den Pfad im Parameter -x an die neue Situation des Current Directory an.
  2. Ändern Sie das Current Directory dynamisch, um DLLs dort zu suchen, wo wir es möchten.

Bei statischer Verknüpfung haben wir wirklich nur eine Möglichkeit:

  1. Verschieben Sie die ursprüngliche DLL in das Current Directory.

TODO

  • Unterstützung für C++-gemangelte Funktionsnamen
Tool herunterladen