[Video Tutorial] Microsoft Detours 1.5 New Video

07/28/2011 10:49 buFFy!#31
messageboxb gibts nicht. du meinst w ;>
hol die addresse einfach über getprocaddress('messagebox'), dann musst du dich darum nicht kümmern.

ansosnten kannst du das programm in olly anaylisieren (hauptmodul) und dann Rechtsklick > search for all intermodular calls machen ;>
07/28/2011 17:18 MrSm!th#32
Was willst du mit inline ASM in einer Script-Sprache? o.ô

Das mit der MessageBox siehst du in Olly. Falls du keine Möglichkeit hast, den Call einzusehen, musst du eben ausprobieren, welche MessageBox es ist.
Ich habe nunmal aus A/B A/W (also ASCII/UNICODE) interpretiert ;O

Quote:
messageboxb gibts nicht. du meinst w ;>
hol die addresse einfach über getprocaddress('messagebox'), dann musst du dich darum nicht kümmern.

ansosnten kannst du das programm in olly anaylisieren (hauptmodul) und dann Rechtsklick > search for all intermodular calls machen ;>
Das ist Schwachsinn, das Modul User32.dll exportiert MessageBoxA und MessageBoxW.
Die automatische Auflösung von MessageBox existiert nur in der IDE, weil das im SDK so definiert ist, da wird dann über die Projektkonstante UNICODE entschieden, welches genutzt wird, beim fertig kompilierten Modul wird aber genau unterschieden, GetProcAddress würde für "MessageBox" (das ist btw. case sensitive!) NULL zurückgeben.
07/28/2011 20:25 buFFy!#33
Quote:
Originally Posted by MrSm!th View Post
Was willst du mit inline ASM in einer Script-Sprache? o.ô

Das mit der MessageBox siehst du in Olly. Falls du keine Möglichkeit hast, den Call einzusehen, musst du eben ausprobieren, welche MessageBox es ist.
Ich habe nunmal aus A/B A/W (also ASCII/UNICODE) interpretiert ;O


Das ist Schwachsinn, das Modul User32.dll exportiert MessageBoxA und MessageBoxW.
Die automatische Auflösung von MessageBox existiert nur in der IDE, weil das im SDK so definiert ist, da wird dann über die Projektkonstante UNICODE entschieden, welches genutzt wird, beim fertig kompilierten Modul wird aber genau unterschieden, GetProcAddress würde für "MessageBox" (das ist btw. case sensitive!) NULL zurückgeben.
also getprocaddress('messagebox'), natürlich case sensitive korrekt geschrieben returned bei mir nich null, eben wegen der projektkonstante.

ich hab ja nicht umsonst geschrieben das man das in olly einsehen kann.
spätestens wenn was nicht funktioniert wird das kontrolliert.

die meisten spiele nutzen eh die unicode interpretation der messagebox (diese ist übrigens auch default in jeder mir bekannten c++ ide)
07/28/2011 22:06 MrSm!th#34
Quote:
Originally Posted by u-coRe View Post
also getprocaddress('messagebox'), natürlich case sensitive korrekt geschrieben returned bei mir nich null, eben wegen der projektkonstante.
Das ist doch Blödsinn, die Konstante UNICODE verliert nach dem Kompilieren an Bedeutung, weil sie nur in der IDE vorhanden ist.
User32.dll exportiert keine MessageBox, ergo wirst du diese Funktion auch nicht finden.
07/29/2011 13:18 buFFy!#35
herrje.. dann denken wir mal ein bisschen weiter, und kommen zum schluss das die projektkonstante beim kompiliervorgang verwendet wird. demnach ist die messagebox danach als messageboxw zu finden. wenn du möchtest geb ich dir auch gern nen screenshot aus olly, der belegt dann das was ich hier behaupte.
07/29/2011 20:42 MrSm!th#36
sag mal, verarschst du mich gerade?

ist klar, dass MessageBox als MessageBoxW zu finden ist.

Aber GetProcAddress durchsucht die Export Table der Dll nach dem String, den du ihr übergibst und eine MessageBox wird von user32.dll nicht exportiert!

Du hast nicht davon geredet, dass du einfach das Define aus dem SDK nimmst, du sprachst von GetProcAddress, dass das angeblich automatisch das richtige raussucht und das ist Blödsinn.
07/29/2011 22:03 buFFy!#37
dann hab ich mich entweder blöd ausgedrückt oder du mich falsch verstanden.
07/30/2011 02:55 MrSm!th#38
Quote:
Originally Posted by u-coRe View Post
messageboxb gibts nicht. du meinst w ;>
hol die addresse einfach über getprocaddress('messagebox'), dann musst du dich darum nicht kümmern.

ansosnten kannst du das programm in olly anaylisieren (hauptmodul) und dann Rechtsklick > search for all intermodular calls machen ;>
ich vermute ersteres.
07/30/2011 12:40 buFFy!#39
jo stimmt. war eher so gemeint das die meisten spiele die unicode version verwenden, und das in 95% aller fälle funktioniert. und falls eben nicht, kann er immernoch mit olly schauen.
08/05/2011 14:26 .BritainAndy#40
Eine Frage Smith:

Ich verstehe soweit alles, danke auch an dieser Stelle für das Tutorial.
Nur hab ich ein Verständnisproblem an der rot markierten Stelle:

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

typedef int (WINAPI *Messagebox_typ)(HWND,LPCTSTR,LPCTSTR,UINT); // Prototyp erstellen

Messagebox_typ Messagebox_orig = NULL;	//Zeiger aufs Trampolin erstellen um die Funktion , die vom Programm erwartet,wird aufzurufen






//		 DETOUR FUNKTION ERSTELLEN MIT SELBER CALLING CONVENTION, PARAMETER, ...			//

int WINAPI MessageBoxDetour(HWND window, LPCTSTR text, LPCTSTR caption, UINT type)
{
	text = L"Hook function succesful ";
	caption = L"Hooked";
	return Messagebox_orig( window, text, caption, type );
}





BOOL APIENTRY DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
		[COLOR="Red"]Messagebox_orig = (Messagebox_typ)DetourFunction((PBYTE)MessageBoxW, (PBYTE)MessageBoxDetour);[/COLOR]
        break;
    }
    return true;
}
DetourFunction gibt ja die Adresse des Trampolins zurück.
Dann beinhaltet also der Funktionszeiger (der aufs Trampolin zeigen soll) die Adresse des Trampolins.
Ich verstehe jetzt irgendwie nicht, was das für einen Zweck haben soll und wieso wenn ich das "Messagebox_orig =" weglasse das Programm crasht.
08/05/2011 17:00 Akorn#41
Quote:
Originally Posted by .BritainAndy View Post
Eine Frage Smith:

Ich verstehe soweit alles, danke auch an dieser Stelle für das Tutorial.
Nur hab ich ein Verständnisproblem an der rot markierten Stelle:

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

typedef int (WINAPI *Messagebox_typ)(HWND,LPCTSTR,LPCTSTR,UINT); // Prototyp erstellen

Messagebox_typ Messagebox_orig = NULL;	//Zeiger aufs Trampolin erstellen um die Funktion , die vom Programm erwartet,wird aufzurufen






//		 DETOUR FUNKTION ERSTELLEN MIT SELBER CALLING CONVENTION, PARAMETER, ...			//

int WINAPI MessageBoxDetour(HWND window, LPCTSTR text, LPCTSTR caption, UINT type)
{
	text = L"Hook function succesful ";
	caption = L"Hooked";
	return Messagebox_orig( window, text, caption, type );
}





BOOL APIENTRY DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
		[COLOR="Red"]Messagebox_orig = (Messagebox_typ)DetourFunction((PBYTE)MessageBoxW, (PBYTE)MessageBoxDetour);[/COLOR]
        break;
    }
    return true;
}
DetourFunction gibt ja die Adresse des Trampolins zurück.
Dann beinhaltet also der Funktionszeiger (der aufs Trampolin zeigen soll) die Adresse des Trampolins.
Ich verstehe jetzt irgendwie nicht, was das für einen Zweck haben soll und wieso wenn ich das "Messagebox_orig =" weglasse das Programm crasht.
Man braucht den Zeiger aufs Trampolin wen man selber die gehookte funktion aufrufen will. Da man sonst wen man sie normal aufruft in der eigenen Detour funktion landen würde.

zb hier:
Quote:
nt WINAPI MessageBoxDetour(HWND window, LPCTSTR text, LPCTSTR caption, UINT type)
{
text = L"Hook function succesful ";
caption = L"Hooked";
return Messagebox_orig( window, text, caption, type );
}
Wen man jetzt anstatt "return Messagebox_orig" einfach "return Messagebox" schreibt würde sich die MessageBoxDetour funktion ja immer wieder selber aufrufen solange bis der stack überläuft und das programm crasht.
08/05/2011 17:31 MrSm!th#42
Und der grund für deinen crash ist natürlich, dass der zeiger auf 0 bleibt und demnach der return im Hook einen Nullzeiger callen will.
08/23/2011 09:12 chillakilla123#43
Gutes tutorial was du da gemacht hast^^ (ich habs verstanden :D)

Hier nochn Vorschlag für ein Tutorial.
könnteste vllt n Tutorial machen, wie man Detouren (nur für API-Funktionen erstmal) Systemweit installieren kann,
würd mich (und viele andere auch) sicher interessieren :D
09/30/2011 19:39 freehuntx#44
Ich hatte eigendlich etwas anderes nicht verstanden.

Also.

Es wird ja bei deinem Detour die MessageboxW function gehookt.

Doch was ist wenn ein Programm 10 verschiedene Messageboxen beinhaltet, und man tatsächlich, nur eine davon hooken möchte?

Das verstehe ich nicht ganz.

Und könntest du auch erklären, wie es möglich ist, einen hook zu setzen, der an sich nichts im programm verändert, aber dass man eben die funktion nach belieben aufrufen kann?

Ich möchte nämlich versuchen die function WSASend hooken, und quasi besetzen.

Die packets im programm sollen wie gewohnt weiterlaufen und nicht beeinflusst werden, jedoch soll nach beispielsweise drücken eines hotkey, diese funktion verwendet werden, um eigene packets zu senden.
Soll jedoch kein anderes packet beeinflussen.

Könntest du mich erhellen?

Es geht um das spiel Flyff.
Dort werden die packets über einen bestimmten hash verschlüsselt.
Wenn man aber die function hookt, sollte der client das packet von selbst verschlüsseln oder?
09/30/2011 23:02 MrSm!th#45
Quote:
Es wird ja bei deinem Detour die MessageboxW function gehookt.

Doch was ist wenn ein Programm 10 verschiedene Messageboxen beinhaltet, und man tatsächlich, nur eine davon hooken möchte?
Um genau zu sein, wird sie einmal gehookt und danach wird der Hook immer aufgerufen, anstatt der originalen :p

Dann musst du entweder die Parameter prüfen und so darauf schließen, ob es die gewünschte ist oder du hookst nicht die MessageBoxW, sondern platzierst direkt einen Jump an der entsprechenden Stelle im Programm zu einer Codecave von dir (das geht natürlich nur, wenn sie bekannt ist).

Für letzteres brauchst du keinen Hook o.ô Musst einfach nur die Funktion callen, wo ist das Problem?
Quote:
Gutes tutorial was du da gemacht hast^^ (ich habs verstanden )

Hier nochn Vorschlag für ein Tutorial.
könnteste vllt n Tutorial machen, wie man Detouren (nur für API-Funktionen erstmal) Systemweit installieren kann,
würd mich (und viele andere auch) sicher interessieren
Danke für den Vorschlag, ja, kann ich machen.