[Tutorial] Microsoft Detours

11/29/2009 08:41 Bot_interesierter#46
Quote:
Originally Posted by Gianotti View Post
ein call befindet sich an einer bestimmten adresse mit bestimmten parametern im speicher des klienten. wenn du diese sachen weißt dann wird das nicht so schwer sein ;)

ich denk aber eher daran : wieso überhaupt detouren , wenn du ehh weißt wo die adresse liegt o.0? dann einfach direkt in c++ callen lassen?
Bei einem Detour geht es darum eine Funktion um zu Leiten, das braucht man wenn man zum Beispiel wissen möchte welche Parameter das Programm der Funktion übergeben hat um diese dann Gegebenenfalls zu ändern oder damit etwas an zu stellen.

Es gibt viele Dinge die ohne einen Detour nicht praktikabel um zu setzten sind, dazu gehört es zum Beispiel Datenpakete abzufangen, außerdem kann man durch einen Detour Code innerhalb eines fremden Threads ausführen, was man oft Benötigt wenn man überhaupt Funktion des Programms/Spiels ausführen möchte, da diese oftmals Thread lokale Variablen verwenden.

Wie du siehst unterscheidet sich die Verwendung eines Detours stark vom Aufrufen einer Funktion des Programms und die Problemstellung die dem zu Grunde liegt ist auch eine andere, darum stellt sich die Frage
Quote:
wieso überhaupt detouren , wenn du ehh weißt wo die adresse liegt o.0? dann einfach direkt in c++ callen lassen?
überhaupt nicht.
11/29/2009 15:38 Gianotti#47
Quote:
Originally Posted by Bot_interesierter View Post
Bei einem Detour geht es darum eine Funktion um zu Leiten, das braucht man wenn man zum Beispiel wissen möchte welche Parameter das Programm der Funktion übergeben hat um diese dann Gegebenenfalls zu ändern oder damit etwas an zu stellen.

Es gibt viele Dinge die ohne einen Detour nicht praktikabel um zu setzten sind, dazu gehört es zum Beispiel Datenpakete abzufangen, außerdem kann man durch einen Detour Code innerhalb eines fremden Threads ausführen, was man oft Benötigt wenn man überhaupt Funktion des Programms/Spiels ausführen möchte, da diese oftmals Thread lokale Variablen verwenden.

Wie du siehst unterscheidet sich die Verwendung eines Detours stark vom Aufrufen einer Funktion des Programms und die Problemstellung die dem zu Grunde liegt ist auch eine andere, darum stellt sich die Frage überhaupt nicht.
eine frage hätte ich zudem noch : in dem tutorial von schlurmann ( send funktion von metin hooken und benutzen ) kann er eine funktion callen (ohne detours ) und das mit einer simplen dll injection .

es geht also doch auch ohne detours wie ich das sehe oder irre ich mich da?

ich lasse mich gerne belehren :)
11/29/2009 16:50 ms​#48
Quote:
Originally Posted by Gianotti View Post
eine frage hätte ich zudem noch : in dem tutorial von schlurmann ( send funktion von metin hooken und benutzen ) kann er eine funktion callen (ohne detours ) und das mit einer simplen dll injection .

es geht also doch auch ohne detours wie ich das sehe oder irre ich mich da?

ich lasse mich gerne belehren :)
Das lässt sich mittels Function Pointer realisieren.
[Only registered and activated users can see links. Click Here To Register...]
11/29/2009 16:52 Gianotti#49
Quote:
Originally Posted by Disconnect View Post
Das lässt sich mittels Function Pointer realisieren.
[Only registered and activated users can see links. Click Here To Register...]
achso danke für den link.

detours ist wohl sehr komfortabel wie man sieht
11/30/2009 01:46 schlurmann#50
Ich glaub ihr verwechselt hier etwas. Detours sind nicht da um irgendwelche Funktionen zu callen. Sie sind da um, wie der Name schon sagt, eine Funktion umzuleiten. Wenn diese Funktion vom Programm aufgerufen wird, wird erst der Call/Jump zu einer anderen Funktion ausgeführt, am Ende der Funktion wird dann wieder zum Original zurückgesprungen. Der Stack verändert sich beim Jump nicht und so kann man sogar sehr komfortabel auf die Parameter zugreifen (das geht auch beim Call, nur muss dann beachtet werden, dass ganz oben auf dem Stack die return Adresse liegt), nützlich zum Beispiel wenn man bestimmte Funktionsparameter überwachen/verändern möchte.

Detours müssen auch nicht am Funktionsanfang stehen, oft ist ein Detour an einer anderen Stelle sehr hilfreich, wenn man zum Beispiel Register an einer bestimmten Stelle auslesen möchte.
11/30/2009 11:39 Gianotti#51
Quote:
Originally Posted by schlurmann View Post
Ich glaub ihr verwechselt hier etwas. Detours sind nicht da um irgendwelche Funktionen zu callen. Sie sind da um, wie der Name schon sagt, eine Funktion umzuleiten. Wenn diese Funktion vom Programm aufgerufen wird, wird erst der Call/Jump zu einer anderen Funktion ausgeführt, am Ende der Funktion wird dann wieder zum Original zurückgesprungen. Der Stack verändert sich beim Jump nicht und so kann man sogar sehr komfortabel auf die Parameter zugreifen (das geht auch beim Call, nur muss dann beachtet werden, dass ganz oben auf dem Stack die return Adresse liegt), nützlich zum Beispiel wenn man bestimmte Funktionsparameter überwachen/verändern möchte.

Detours müssen auch nicht am Funktionsanfang stehen, oft ist ein Detour an einer anderen Stelle sehr hilfreich, wenn man zum Beispiel Register an einer bestimmten Stelle auslesen möchte.

also könnte ich zum beispiel wenn ich eine msgbox detoure irgendeinen schrott ausführen lassen der nichts mit dem call zu tun hat?
11/30/2009 13:59 Bot_interesierter#52
Jupp so ist es
11/30/2009 20:14 Carcaras#53
Thx, gutes Tutorial

edit: bei mir findet er die <detours.h> nicht. Ich hab die gedownloadet, aber wo kommt die jetzt hin? (sry für die Frage)
12/01/2009 00:12 Akorn#54
Quote:
Originally Posted by Carcaras View Post
edit: bei mir findet er die <detours.h> nicht. Ich hab die gedownloadet, aber wo kommt die jetzt hin? (sry für die Frage)
Die Compiler haben in der regel ein extra verzeichniss für header datein, meist INDLUDE oder änlich genannt am besten da rein kopieren.
12/01/2009 14:35 Carcaras#55
Quote:
Originally Posted by Akorn View Post
Die Compiler haben in der regel ein extra verzeichniss für header datein, meist INDLUDE oder änlich genannt am besten da rein kopieren.
Ok, danke. Ich Idiot hab im falschen Ordener gesucht^^

Edit: Es klappt, endlich
01/01/2010 01:08 MrSm!th#56
hm
ich hol den Thread mal wieder hoch, weil ich ein kleines Problem habe (sowohl auf win7 als auch auf XP!)

Also ich injecte die DLL mit Winject und Winject sagt mir auch, dass alles geklappt hat (und beim nochmaldigen Drücken, dass die DLL schon geladen wurde!), aber trotzdem wird die MessageBox nicht gehooked.

Da ich kein Freund von C&P bin, habe ich mein eigenes Testprogramm geschrieben:

Code:
#include <windows.h>

int main()
{
	while(1)
	{
		MessageBoxW(NULL,L"TEST",L"TESTTEST",MB_OK);
		Sleep(3000);
		if(GetAsyncKeyState(VK_F1))
			return 1;
	}
}
Der Code meiner Dll:

Code:
#include <windows.h>
#include <detours.h>

typedef int (WINAPI *MBox)(HWND hWnd,LPCWSTR Text,LPCWSTR Caption,UINT Type);

MBox MessageBox_orig = NULL;

int WINAPI hookedMessBox(HWND hWnd,LPWSTR Text,LPCWSTR Caption,UINT Type)
{
	Text = L"Haha, hooked ;)";
	Caption = L"failed";
	return MessageBox_orig(hWnd,Text,Caption,Type);
}

BOOL WINAPI Dllmain(HANDLE hModule,DWORD dwReason,LPVOID Reversed)
{
        switch(dwReason)
        {
                 case DLL_PROCESS_ATTACH:
	                    MessageBox_orig = reinterpret_cast<MBox>(DetourFunction((PBYTE)&MessageBoxW,(PBYTE)&hookedMessBox));
         }
	return TRUE;
}

So, nun bleibt der Text aber "Test"!

Ich habe es auch schon mit etwas leichtem probiert:

Code:
BOOL WINAPI Dllmain(HINSTANCE hInstace,DWORD dwReason,LPVOID Reversed)
{
	switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
                       MessageBox(NULL,L"Injected ;)",NULL,MB_OK);
		        break;
         }
	return TRUE;
}

Nichts, keine MessageBox.

Ich vermute es liegt daran, dass zwar die DLL geladen wird, aber der Code nicht ausgeführt.
Woran kann es liegen (unter XP mit Admin Konto angemeldet, unter w7 ausgeführt als Admin)?
01/01/2010 12:40 ^darkwing#57
Welcher Compiler?
01/01/2010 13:39 MrSm!th#58
VS 2008
beim kompilieren gibts aber keine probleme =/


edit:

es geht jetzt!

2 änderungen:

Code:
[COLOR="Red"]#pragma comment(lib, "detours.lib")[/COLOR]

typedef int (WINAPI *MBox)(HWND hWnd,LPCWSTR Text,LPCWSTR Caption,UINT Type);

MBox MessageBox_orig = NULL;

int WINAPI hookedMessBox(HWND hWnd,LPWSTR Text,LPCWSTR Caption,UINT Type)
{
	Text = L"Haha, hooked ;)";
	Caption = L"failed";
	return MessageBox_orig(hWnd,Text,Caption,Type);
}

BOOL WINAPI DllMain(HANDLE HDllHandle, DWORD Aufrufgrund, LPVOID Reserved)
{
	[COLOR="Red"]if(DLL_PROCESS_ATTACH == Aufrufgrund)[/COLOR]
	{
		MessageBox_orig = reinterpret_cast<MBox>(DetourFunction((PBYTE)&MessageBoxW,(PBYTE)&hookedMessBox));
	}
	return TRUE;
}
Ich weiß zwar nicht, wo der Unterschied zwischen der Schreibweise von Schlurmann und meiner ist, aber es geht^^
Das mit der lib verstehe ich auch nicht, da sie schon im Header gelinkt wird, aber ich habe es mal so wie Schlurmann sicherheitshalber gemacht und es gab trotzdem keine Fehler von wegen 2 mal das selbe gelinkt oder so^^

Naja dann versuche ich mal mit dieser Schreibweise meine kleine MessageBox Dll zu machen.

@Schlurmann:

Wolltest du nicht auch noch ein Tutorial machen, wie man Parameter etc. bei Nicht-Api-Funktionen rauskriegt?
02/18/2010 22:00 schlurmann#59
Quote:
Originally Posted by MrSm!th View Post

@Schlurmann:

Wolltest du nicht auch noch ein Tutorial machen, wie man Parameter etc. bei Nicht-Api-Funktionen rauskriegt?
Ich will so einiges. Vorwiegend will ich aber mein Abitur. :p
02/18/2010 22:12 MrSm!th#60
Quote:
Originally Posted by schlurmann View Post
Ich will so einiges. Vorwiegend will ich aber mein Abitur. :p
Na dann viel Glück ;)
Ich mach meins in 3 Jahren.
Weißt du zufällig, wie detours.h implementiert ist?
Ich wollte eine eigene kleine Klasse schreiben, die einem mehr Möglichkeiten bietet, aber im komm beim Schreiben der Opcodes nicht weiter...
nichtmal was ganz einfaches was eigentlich klappen müsste wie
Code:
memcpy(IsDebuggerPresent,Opcodes,5); /*egal was, es klappt nicht, wenn ich aber stattdessen 
einen Pointer zu einer eigenen Variable bei Dst angebe, klappts, logisch, 
aber warum nicht bei Funktionen?*/
bringt die DllMain schon dazu, nicht zu returnen (Winject sagt, injecten fehlgeschlagen, obwohl die MessageBox in meiner DllMain kam; in der Liste der executable Modules ist die Dll aber auch nicht....)