
C++ DLL, die Import Address Table Hooking durchführt, indem sie PE-Header parst und importierte Funktionsadressen auf einen benutzerdefinierten Hook innerhalb eines Zielprozesses umleitet.
Hooking ist eine Technik, die es einem Benutzer ermöglicht, den Ausführungsfluss eines Programms umzuleiten. Meistens verwenden wir Function Hooking. Wir ersetzen oder leiten eine Funktion auf unsere eigene um, dies ist sehr nützlich und hat mehrere Anwendungsfälle. Es gibt mehrere Möglichkeiten des Hookings, hier betrachten wir IAT Hooking, es steht für Import Address Table. Es besteht darin, die Adresse einer Funktion durch unsere eigene in einer großen Tabelle zu ersetzen, die zur Laufzeit gefüllt wird. Wie ich bereits in einem anderen Repo erwähnt habe, empfehle ich Ihnen, mehr über das PE Format zu lesen, um den IAT-Parsing-Teil dieses Codes zu verstehen.
Hier ist ein einfaches Diagramm, wie IAT Hooking funktioniert. In diesem Beispiel wird die ursprüngliche Funktion aufgerufen, nachdem der bösartige Code ausgeführt wurde. In diesem Beispiel rufen wir einfach eine andere Funktion anstelle der ursprünglichen auf. Der Vorteil dieser Technik besteht darin, dass sie nicht den Body einer Funktion ändern muss, im Gegensatz zu einem regulären Detours-.text-Patch-Hook, der die Anweisungen am Anfang einer Funktion ändern muss, um beispielsweise einen jmp zu platzieren.
Es ist tatsächlich viel einfacher, als es klingt. Wir werden intern vorgehen, um die Dinge einfacher zu machen, was bedeutet, dass dieses Repo zu einer DLL kompiliert wird, die mit meinen LoadLibraryA- oder Manual Mapping-Injektoren in den Zielprozess injiziert werden kann.
Zuerst parsen wir die PE Headers des Zielprozesses, um den Import Descriptor zu lokalisieren, wie folgt:
process_base + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
Wir können dann jedes importierte Modul durchlaufen, jede Funktion in diesem Modul durchlaufen (Grund für die verschachtelten Schleifen) und die Adresse dieser Funktion finden, die zur Laufzeit gefüllt wurde. In diesem Beispiel werden wir TranslateMessage hooken, das von Windows verwendet wird, um Ereignisse in GUIs zu verarbeiten. Sobald wir also die Adresse dieser Funktion gefunden haben, ersetzen wir sie durch die Adresse unserer eigenen Funktion, die wir zuvor definiert haben und die im Kontext des Remote-Prozesses existiert, da wir intern sind. Vergessen Sie nicht, VirtualProtect zu verwenden, um sicherzustellen, dass Sie die Berechtigung haben, an diese Stelle zu schreiben.
VirtualProtect(&firstThunk->u1.Function, sizeof(uint64_t), PAGE_READWRITE, &old_protection);
firstThunk->u1.Function = (uint64_t)hookfunction;
Wie Sie sehen können, wenn Notepad TranslateMessage aufruft (so gut wie die ganze Zeit), wird unsere Hook-Funktion ausgeführt, die schließlich eine Message Box anzeigt!
image