API Hooking mit MS

Microsoft selber bietet ein sehr schönes Werkzeug an um APIs und andere Dinge in einem Prozess zu hooken. Detours 2.1 kann sich jeder kostenlos und Open-Source hier runterladen: http://research.microsoft.com/en-us/projects/detours/ und damit nach Herzenslust hooken.
In diesem Artikel möchte ich euch zeigen wie man mit diesem Werkzeug meinen Assembler SFT Hook schnell und einfach nachbauen kann, siehe hierzu: http://blog.raidrush.ws/2010/02/28/sft-loader-2009-hook/

Detours 2.1 installieren

Setup downloaden und installieren, dann muss man es nur noch compilen. Am besten geht das natürlich mit Visual C++ 2008. Mit der Visual Studio Konsole in den Installationspfad SRC wechseln und einfach mit Befehl nmake kompilieren. Ich musste noch den Resourcecompiler rc.exe & rcdll.dll in den Pfad kopieren für eine erfolgreiche Erstellung. Danach einfach die detours.lib und detours.h Dateien in die Standard VC++ Include bzw. Lib Ordner kopieren.
Die Hilfe Datei bei Detours ist schon sehr gut und leicht verständlich, sollte man sich mal durchlesen. Dieses mächtige Werkzeug lässt also fast keine Wünsche offen beim Hooken. Trotzdem sollte man verstehen wie es funktioniert und mit einem Debugger nachvollziehen was alles gemacht wird. Man kann die Methoden natürlich auch mal selber schreiben was eine sehr gute Übung darstellt zum Verständnis.

SFT Hook (zum Teil) nachbauen

Der Kopf der neuen Cpp Datei muss man um die detours Header + Lib erweitern, ungefähr so:

#pragma comment(lib,"detours.lib")
#include <detours.h>

Der eigentliche Hook findet in der DLLMain Methode statt bei Prozess Attach, ungefähr so:

DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)orig_connect, my_connect);
DetourTransactionCommit();

orig_connect ist die originale connect Methode, der Prototyp sieht so aus:

static int (WINAPI *orig_connect)(SOCKET s, const struct sockaddr *name, int namelen) = connect;

Wer das nicht versteht sollte die detours Hilfe lesen.

Zu guter letzt noch die gehookte Methode mit der wir arbeiten können:

int WINAPI my_connect(SOCKET s, const struct sockaddr *name, int namelen)
{
sockaddr_in *inName = (sockaddr_in *)(name);
log_to_file("%s\n",inet_ntoa(inName->sin_addr))
return orig_connect(s,name,namelen);
}

Der Connect Hook ist somit fast fertig, man muss nur noch den Port in die Log Datei schreiben, das ist aber auch kein Problem und das überlasse ich euch. Der Send Hook funktioniert nach dem gleichen Prinzip. Nur der SSL_write Hook könnte ein Problem darstellen, aber hier gibt es einen einfach Tipp von mir damit es genauso einfach ist: Hook GetProcAddress.

Den ganzen Sourcecode gibt es im RR Thread:
http://board.raidrush.ws/showthread.php?t=692390&page=6#post9408008

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *