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
HintInject — Ein PoC-Projekt zum Einbetten von Shellcode in die Hint/Name Table | Kitploit
Tools/GitHubGitHub/frkngksl/hintinject
Payload-GenerierungExploitationShellcodePenetrationstestsBinäranalysePayload-Entwicklung
GitHubfrkngksl/hintinject

HintInject

Ein PoC-Projekt zum Einbetten von Shellcode in die Hint/Name Table

Repository anzeigen
11422vor 4 MonatenVon 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

HintInject

HintInject ist ein Shellcode-Einbettungs- und Lade-Tool, das ich beim Spielen mit den PE-Datei- und Import Directory Table-Strukturen entwickelt habe. Es nimmt eine rohe Shellcode-Datei und legt den Shellcode in Teilen in die Hint/Name Table-Einträge ab, die über die Import Lookup Table eines gefälschten DLL-Eintrags im Loader-Executable erreichbar sind. Der Loader führt dann diese Teile zusammen, um den Shellcode auszuführen. Ich weiß nicht, ob es sich um eine neue Technik handelt oder nicht, aber ich wollte sie aus Spaß teilen.

DLL-Ladevorgang

Bevor ich erkläre, wie HintInject funktioniert, möchte ich kurz auf den DLL-Ladevorgang unter Bezugnahme auf einen Post auf Stack Overflow eingehen.

Um die Informationen zu benötigten DLLs und Funktionen/Imports zu erhalten, sollte man zuerst die Import Directory Table betrachten. Die Import Directory Table ist eine Tabelle mit Einträgen, ein Eintrag für jede importierte DLL. Diese Einträge enthalten einen Zeiger auf den Namen der importierten DLL, einen Zeiger auf die Import Lookup Table, einen Zeiger auf die Import Address Table und andere Felder für verschiedene Informationen.

Einfach ausgedrückt führt die Import Lookup Table zu den Informationen über die Imports, und die Import Address Table führt zu den Adressen der Imports. Wenn das Executable jedoch auf der Festplatte ist oder kurz vor dem DLL-Ladevorgang, ist die Import Address Table identisch mit der Import Lookup Table. Der Inhalt der Import Address Table wird während des DLL-Ladevorgangs mit der Adresse der Imports überschrieben.

Ohne ins Detail zu gehen, können wir uns das folgende Diagramm ansehen, um die Beziehung zwischen diesen drei Tabellen zu verstehen.

Wenn wir etwas tiefer einsteigen, enthält die Import Lookup Table die Namen der Imports nicht direkt. Für Funktionen, die nach Namen importiert werden, enthält sie RVAs von Hint/Name Table-Einträgen. Diese Einträge speichern die Funktionsnamen als nullterminierte ASCII-Strings. Daher ist die Strukturdefinition eines Hint/Name Table-Eintrags wie folgt:

root@kitploit:~
typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;
    CHAR   Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; 

Das Hint-Feld ist hier eigentlich ein Index in die Export-Name-Pointer-Tabelle der DLL. Es wird verwendet, um das Auffinden der Position dieses Imports zu beschleunigen. Daher können wir die Beziehung zwischen der Import Lookup Table und der Hint/Name-Tabelle mit dem folgenden Diagramm zusammenfassen.

Zusammenfassend muss man die folgenden Schritte ausführen, um eine DLL und ihre Imports zu finden:

  1. Zur Import Directory Table aus dem DataDirectory-Array des Optional Header gehen.
  2. Die Einträge der Import Directory Table durchlaufen, um die gewünschte DLL durch Überprüfung ihres Namensfeldes zu finden.
  3. Nachdem der richtige Eintrag gefunden wurde, mit dem Feld OriginalFirstThunk zur zugehörigen Import Lookup Table gehen.
  4. Alle Einträge in der Import Lookup Table durchlaufen, die Zeiger auf Hint/Name Table-Einträge sind.
  5. Importnamen aus dem Name-Feld der Hint/Name Table-Einträge überprüfen.

Wie funktioniert HintInject?

Vor kurzem habe ich bei der Untersuchung der ImportDLLInjection-Technik, die von x86matthew geteilt wurde, gesehen, wie man einen gefälschten Eintrag zum Import Directory von im Speicher geladenen DLLs hinzufügt. Danach wollte ich ein kleines Projekt entwickeln, das einen gefälschten Eintrag direkt der Importtabelle einer Binärdatei auf der Festplatte hinzufügt – sowohl aus Spaß als auch um mein Wissen aufzufrischen. Bei der Durchsicht des DLL-Ladevorgangs zur Entwicklung dieses Projekts ist mir das Hint-Feld in den dabei verwendeten Hint/Name Table-Einträgen aufgefallen.

Laut MSDN-Dokumentation habe ich erfahren, dass dieses Feld vom Windows-Loader verwendet wird, um die Adresse dieses Imports, der nach Namen importiert wird, direkt aus der Export-Name-Tabelle der DLL zu finden, in der er sich befindet. Im selben Dokument wurde jedoch auch darauf hingewiesen, dass, wenn die Funktion mit diesem Feld nicht gefunden werden kann, diese Funktion per binärer Suche in der Export-Name-Tabelle der DLL gesucht wird. Basierend auf diesem Satz dachte ich, dass das Einfügen eines falschen Werts für dieses Feld den DLL-Ladevorgang nicht stören würde.

Wie oben erwähnt, gibt es einen Eintrag in der Hint/Name-Tabelle, der jeder zu importierenden Funktion entspricht. Mit anderen Worten, wir haben 2 Bytes pro Import zur Verfügung. Durch die Kombination mehrerer Imports können genügend Hint-Felder erhalten werden, um bösartige Shellcodes zu speichern. Folglich kann man ein Loader-Binary verwenden, um den Shellcode in den Hint/Name-Einträgen des gefälschten Import-DLL-Eintrags einzubetten. Dieses Loader-Binary kann auf diese Einträge zugreifen, um den Shellcode, der zur Laufzeit ausgeführt werden soll, zusammenzuführen.

HintInject kann verwendet werden, um einen solchen Loader zu erstellen, der den Shellcode in seiner Hint/Name-Tabelle hält. Es erstellt zunächst einen neuen Abschnitt namens .rrdata und kopiert das aktuelle Importverzeichnis in diesen Abschnitt. Danach hängt es einen neuen gefälschten Eintrag an, dessen Imports verwendet werden, um den eingegebenen Shellcode zu speichern. Die restlichen Bytes des Abschnitts werden verwendet, um die Import Lookup Table, Import Address Table, den DLL-Namen und die Hint/Name-Tabelle des neuen gefälschten Eintrags zu speichern. Als letzten Schritt verwendet HintInject die Hint-Felder der Imports, um Teile des eingegebenen Shellcodes abzulegen.

Beispiel-Imports eines Loader-Binaries:

Screen Shot 2022-05-08 at 11 43 42

Verwendung

  1. Erstellen Sie das Projekt mit der Release-Option.
  2. Führen Sie HintInject.exe mit Ihrem Shellcode im rohen Format und einem Ausgabepfad aus, um einen Shellcode-Loader zu erstellen: HintInject.exe <Shellcode-Datei> <Ausgabename>
  3. Führen Sie den Loader aus, um den Shellcode direkt auszuführen, oder Sie können eine PID angeben, um Shellcode zu injizieren: Loader.exe <PID>
  4. Wenn Sie möchten, können Sie die Shellcode-Injektionsmethode ändern, indem Sie die Funktion InjectShellcode in der Datei HintInjectLoader/Main.cpp modifizieren.

Getestet auf Windows 10 19044 mit Visual Studio 2019:

Einschränkungen

  1. Im Hinblick auf die gefälschten DLL-Einträge im Loader, der den Shellcode ausführt, müssen sowohl die DLL als auch die importierten Funktionsnamen tatsächlich existieren. Andernfalls wird beim Starten des Loader-Executables ein Fehler wegen fehlender DLL ausgegeben. Daher habe ich im Projekt einige legitime DLLs aus dem System32-Ordner verwendet.
  2. Wenn Ihre Shellcode-Größe größer ist und kein Loader für Ihren Shellcode erstellt werden kann, können Sie dem Array dllNames in der Datei DllNamesForFakeImports.h andere DLLs hinzufügen.
  3. Für jeden erstellten Loader werden die importierten Funktionen zufällig ausgewählt. Wenn Sie jedoch die Reihenfolge der DLLs ändern möchten, die zur Erstellung gefälschter Einträge verwendet werden, sollten Sie auch das Array dllNames in der Datei DllNamesForFakeImports.h bearbeiten. Standardmäßig wählt HintInject Funktionen aus den DLLs gemäß der Array-Reihenfolge aus. Mit anderen Worten: Das Tool wählt zuerst exportierte Funktionen aus user32.dll aus; wenn die Shellcode-Größe größer als 2 * Anzahl der user32.dll-Exporte ist, beginnt es auch mit der Verwendung der Exporte von advapi32.dll und anderen.
root@kitploit:~
static LPCSTR dllNames[] = {"user32.dll","advapi32.dll","gdi32.dll","wininet.dll","comctl32.dll","shell32.dll","wsock32.dll","oleaut32.dll","ws2_32.dll","urlmon.dll"};

Referenzen

  • https://stackoverflow.com/questions/32841368/whats-the-difference-between-the-import-table-import-adress-table-and-import
  • https://0xrick.github.io/win-internals/pe6/
  • https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#hintname-table
  • https://www.x86matthew.com/view_post?id=import_dll_injection

Haftungsausschluss

Nur für autorisierte Sicherheitstests. Die missbräuchliche Verwendung dieses Tools gegen Systeme ohne ausdrückliche Genehmigung ist illegal.

Tool herunterladen