Index

API Hooking

Karabiner

Was ist API Hooking

Damit bezeichnet man allgemein den Vorgang, eine exportierte Funktion durch eine eigene zu ersetzen. Der Nutzen dieses ganzen Prozedere kann sein:

1) Debugging
2) Prozessweit API Calls überwachen
3) Internetdatenverkehr ausspionieren
...

Methoden

Ich will hier 2 Methoden vorstellen:

Methode 1: IAT (Import Address Table) Hook
Methode 2: Funktionsumleitung

IAT Hooking

Die Import Address Table trägt alle von einem Modul importierten Funktionen in sich.
Beim Laden eines Moduls liest der Windows Loader alle importierten Funktionsnamen aus
und füllt die IAT mit den Entry Points dieser. Wir können also, wenn wir den Eintrag der zu hookenden Funktion finden, diesen mit einem Pointer zu unserer eigenen Funktion überschreiben. Ein Vorteil dieser Methode ist, man kann gezielt einzelne Module (wie etwa Controls) hooken.

Vorgehensweise:
1) Die IAT RVA (relative virtual address) und Länge sind im PE Header zu finden.
2) Über GetProcAddress lässt sich die Adresse der gesuchten Funktion ermitteln.
3) Nun kann man einfach in der IAT nach der Adresse suchen und diese dann mit der eigenen überschreiben.

Download: IAT Hook Beispiel

Funktionsumleitung

Hier werden die ersten paar Bytes der gesuchten Funktion mit einer JMP Anweisung überschrieben. Bei Aufruf der Funktion wird der Pointer dann direkt auf unsere Funktion gesetzt. Anders als der IAT Hook gilt dieser prozessweit.

Vorgehensweise:
1) Über GetProcAddress die Adresse der gesuchten Funktion ermitteln.
2) Funktion mit JMP Instruktion überschreiben.

Download: Funktionsumleitung Beispiel

Systemweites API Hooking

Process Injection ist eigentlich nur für C`ler ein Begriff. Das liegt nicht zuletzt an VB`s Runtime Manko. Mit einigen Tricks jedoch können wir auch in VB Code in andere Prozesse injizieren und APIs hooken. Das heißt, wenn die anderen Prozesse auch mit VB erstellt wurden.

Vorgehensweise:
1) Zielprozesshandle ergattern
2) Entry Point von gesuchter Funktion ermitteln
3) Eigenes Modul in Prozess injizieren (Base Address muss verändert werden)
4) Funktion umleiten

Notizen:
1. Um die Base Address zu ändern, habe ich das Add-In "Compile Controller" beigelegt.
2. Da Code in anderen Prozessen nur über CreateRemoteThread ausgeführt werden kann, müssen wir den Hook von außen vornehmen. Danach wird die gehookte Funktion vom Programm aus dem Hauptthread aufgerufen, und wenn das eine VB EXE ist, sollte alles ohne Probleme laufen.

Download: Prozessinjection Beispiel

Obacht

Wer GetProcAddress hookt, sollte vorsichtig sein.
VB ruft GetProcAddress für jede deklarierte Funktion 1 mal auf, um deren Adresse zu speichern. Das allerdings erst beim ersten Aufruf der Funktion. Adressen von im GetProcAddress Proxy verwendeten Funktionen also besser vor dem Hook vorbereiten, sonst kommt es zum Deadlock!