[Video Tutorial] Microsoft Detours 1.5 New Video

02/01/2011 00:15 MrSm!th#1
Da schlurmann sein Video ja gelöscht hat und einige User wollten, dass ich ein neues mache, habe ich mich kurzer Hand entschieden, ein eigenes Tutorial zu MS Detours 1.5 hochzuladen.

Es ist mein erstes (Video-)Tutorial, also bitte ich um Kritik und Verbesserungsvorschläge, aber bitte bleibt dabei sachlich!


Wenn ihr fragen habt, weil etwas zu schnell ging oder ich etwas zu undeutlich erklärt habe, fragt ruhig ;)


(detours.h und detours.lib sind im Anhang)


(Am besten in HD sehen)
02/01/2011 12:32 BrendonHomo#2
Nettes und Hilfreiches Tutorial aber hab da noch eine Frage, undzwar warum das selbe bei den Detours 2.1 nicht funktioniert, sieht bei mir so aus, evt haste eine Lösung auch wenn es hier um 1.5 geht.

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

typedef int (WINAPI *Messagebox_typ)(HWND,LPCSTR,LPCSTR,UINT);

Messagebox_typ Messagebox_orig = NULL;

int WINAPI MyMessageBox(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
lpText = "Detour funktioniert";
lpCaption = "Detour";
return Messagebox_orig(hWnd,lpText,lpCaption,uType);
}


int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if (reason == DLL_PROCESS_ATTACH) {
DetourTransactionBegin();
Messagebox_orig = (Messagebox_typ)DetourAttach(&(PVOID&)MessageBoxA, (PVOID)MyMessageBox);
DetourTransactionCommit();
}
return 1;
}
mfg
02/01/2011 13:23 MrSm!th#3
Eigentlich sollte das so gehen. Ist MessageBoxA denn die richtige MessageBox?
02/01/2011 13:55 BrendonHomo#4
Ja, ist die richtige.
Beim Injecten bekomme ich folgende Meldung:

Quote:
An exception (C0000005) occurred during DllEntryPoint or DllMain in module
C:\bla\meinedll.dll
Edit: Das Problem liegt hier dran

Quote:
Messagebox_orig = (Messagebox_typ)DetourAttach(&(PVOID&)MessageBoxA, (PVOID)MyMessageBox);
02/01/2011 14:31 MrSm!th#5
Achso klar, die DetourAttach möchte einen Doppelzeiger, also einen Zeiger auf einen Zeiger (void**).
Also musst du die Adresse von MessageBoxA in eine Variable speichern und dessen Adresse übergeben.
Mit nem Blick in die MSDN hättest du das auch lösen können, ich sagte doch, dass ich keinen großartigen Support für 2.1 geben kann.
02/01/2011 14:48 BrendonHomo#6
Danke, klappt nun wunderbar.
02/02/2011 17:49 germanhacker#7
Tolles Tutorial MrSm!th.
Hat bei mir super geklappt. Da hab ich mal wieder dazu gelernt.
"Was ist ein Detour ?" hast du meiner Meinung nach gut erklärt. Jetzt weiß ich, wie so ein Detour funktioniert. Danke ! =)
Und der kann von einem Hackshield wirklich nicht erkannt werden ?
Das ist ja geil =D
02/02/2011 18:49 MrSm!th#8
Doch klar.
Indem Hackshield eben die ersten Bytes einer Funktion auf den Sprungbefehl überprüft.
Da gibts ein paar Tricks um sowas zu umgehen, aber manchmal hilft auch nur noch ein Bypass, um hooken zu können, wie man lustig ist.
02/02/2011 18:51 Akorn#9
Natürlich kann ein hook von einem anticheat pogramm erkannt werden.
Wobei es aber methoden gibt mit dennen man versucht das zu verhindern.
02/02/2011 19:02 germanhacker#10
Was wären denn so Tricks ? :D
Kann XTrap schon einen Hook erkennen ? Wahrscheinlich schon :/
02/02/2011 19:17 Akorn#11
Indem man z.b. den hook nicht an den anfahng einer funktion setzt sondern erst später. Wobei man dann natürlich aufpassen muss das man die Parameter und lokalen Variablen richtig addressiert da sich die werte in denn Stack und Basepointer registern ändern können.
02/02/2011 19:24 germanhacker#12
Müsst ich nur noch wissen, wo jetzt in meinem Code angegeben wird, wo der hook eingesetzt werden soll. Dort könnte man das dann so abändern, dass der Hook erst iwann später gesetzt wird. Oder hat das auch was damit zu tun, wann man die DLL injiziert ?
02/02/2011 19:36 MrSm!th#13
Klar.
Tricks wären, nicht am Anfang der Funktion zu hooken, sondern später.
Oder ne andere Hooking Methode, eben nicht per Detour, sondern zb. Hardwarebreakpoints, Import/ExportAddressTable hooks, VTable hooks, wenn es um Methoden von Klassen geht oder auch einfach andere Jumps.
Gibt ja nicht nur den einfachen Unconditional Jump, sondern noch weitere.

edit:

Lol, wie zwei Posts von zwei unterschiedlichen Leuten so nen ähnlichen Wortlaut haben können :D

Quote:
Müsst ich nur noch wissen, wo jetzt in meinem Code angegeben wird, wo der hook eingesetzt werden soll. Dort könnte man das dann so abändern, dass der Hook erst iwann später gesetzt wird. Oder hat das auch was damit zu tun, wann man die DLL injiziert ?
Die Adresse, an der gehookt werden soll, würdest du einfach ändern.

Zb. MessageBoxA+5

Bei WinApi Funktionen macht das nicht so ganz große Probleme mit den Parametern, aber bei anderen wirds da manchmal schon problematisch. Außerdem solltest du bei sowas lokale Variablen vermeiden.
02/02/2011 19:40 Akorn#14
Quote:
Müsst ich nur noch wissen, wo jetzt in meinem Code angegeben wird, wo der hook eingesetzt werden soll. Dort könnte man das dann so abändern, dass der Hook erst iwann später gesetzt wird.
Die Addresse an die der Hook gesetzt wird, wird als erster parameter der funktion "DetourFunction" übergeben. Mit dem zeitpunkt der Dll injektion hat das aber nichts zu tun.
02/02/2011 19:59 germanhacker#15
Ok, danke ihr beiden für die Tipps. =)