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
...
Ich will hier 2 Methoden vorstellen:
Methode 1: IAT (Import Address Table) Hook
Methode 2: Funktionsumleitung
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
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
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
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!