[Tutorial] Microsoft Detours

05/20/2009 19:09 schlurmann#16
Tut doch nicht so, ihr kranken Gestalten hängt doch selbst 24/7 auf /b/ ab. :D
05/21/2009 23:37 LemoniscooL#17
Danke Schlurmann .. hat mir wenigstens beim verstehen geholfen .. allerdings bekomm ich einen komischen fehler wenn ich deinen dll code in Dev-Cpp compilen will...
und zwar:

Quote:
ISO C++ forbids casting between pointer-to-function and pointer-to-object
weisst du warum? die dll die dabei ist funktioniert ja und ich denke mal dass das der selbe code is oder? xD

greetz
05/22/2009 00:34 schlurmann#18
Sieht aus, als ließe dich DevCpp nicht von einem elementaren Datentyp in einen Funktionszeiger casten.

Probiere mal das hier:

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

#pragma comment(lib, "detours.lib")

DETOUR_TRAMPOLINE(int WINAPI origMBox(HWND hWnd, char* lpText, char* lpCaption, UINT uType), MessageBoxA);

int WINAPI MyMBox(HWND hWnd, char* lpText, char* lpCaption, UINT uType)
{
	return origMBox(hWnd, "I've been detoured :(", ":(", uType);
}

BOOL WINAPI DllMain(HANDLE HDllHandle, DWORD Aufrufgrund, LPVOID Reserved)
{
	if(DLL_PROCESS_ATTACH == Aufrufgrund)
		DetourFunctionWithTrampoline((PBYTE)&origMBox, (PBYTE)&MyMBox);
	return TRUE;
}
05/22/2009 00:45 LemoniscooL#19
hm .. da kommen noch viel mehr fehler xD

Quote:
In function `void* _Detours_GetVA_MessageBoxA()':
invalid conversion from `int (*)(HWND__*, const CHAR*, const CHAR*, unsigned int)'

function `int origMBox(HWND__*, char*, char*, unsigned int)':
syntax error before `{' token

At global scope:
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
syntax error before `{' token
( ja da stehen so viele "syntax error before `{' token" im error log )

als fehlerzeile wird folgende angezeigt:
Code:
DETOUR_TRAMPOLINE(int WINAPI origMBox(HWND hWnd, char* lpText, char* lpCaption, UINT uType), MessageBoxA);
//Edit
in nem anderen forum heisst es:

Quote:
Depends on what Dev-cpp installation you are talking about. If
you had downloaded Dev-cpp with MinGW ,(4.9.9.0) the binaries
(lib files) are not compatible with the linker distributed with Dev-cpp.
ich hab diese detours.h und .lib:
[Only registered and activated users can see links. Click Here To Register...]

//Edit2

hm .. also ich bin mittlerweile soweit dass ich mir nen anderen compiler & linker geholt und configuriert hab .. nu hab ich nen anderes problem .. lol wie sollte es auch anders sein -.-
es scheint so als wäre meine detours.lib beschädigt -.-"
@schlurmann kannst du mal deine detours files uppen? ...
05/22/2009 10:18 Akorn#20
Wen du mit dem DevC++ arbeitest solltest du das
Code:
#pragma comment(lib, "detours.lib")
weglassen.

Zudem würde ich nicht mehr mit dem DevC++ arbeiten da der seit 4jahren nicht mehr aktualiesert wurde und oftmals gibt der fehler in den simplesten code aus wo keine sind. Deswegen kann ich dir nur empfehlen lade dir ne neue version vom MinGw Compiler und benutze als IDE Blocks.
05/22/2009 11:44 LemoniscooL#21
danke Akorn ich probiers mal .. wusste garnich dass DevCpp so veraltet ist .. habs nur ma im Cpp kurs benutzt und dann damit weiter gemacht .. hat bisher alles funktioniert ^.^

//Edit
hm .. die angezeigten fehler sind bei Code::Blocks immernoch die selben ....
ich hab mich, da ich denke es nun verstanden zu haben mal hingesetzt und selbst was geschrieben ..
aber .. wie solls auch anders sein .. wieder nen anderer fehler -.-

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


int (__stdcall* InsertDateTime)(int x); //Originale Funktion

int MyInsertDateTime(int x) //Meine Funktion
{
    //Messagebox
    MessageBox(NULL, "lol", "lol", MB_OK);
    return InsertDateTime(x);
}

BOOL APIENTRY DllMain(HANDLE hInst, DWORD reason, LPVOID lpReserved)
{
    switch (reason)
    {
        case DLL_PROCESS_ATTACH:
            InsertDateTime = (int (__stdcall*)(int))DetourFunction((PBYTE)0x01006F10, (PBYTE)MyInsertDateTime);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            DetourRemove((PBYTE)0x1006F10, (PBYTE)InsertDateTime);
            break;
    }
    return TRUE;
}

die Fehler:
Quote:
warning: ignoring #pragma comment
warning: extra tokens at end of #endif directive
In function `_Z7DllMainPvmS_':
undefined reference to `_DetourFunction@8'
undefined reference to `_DetourRemove@8'
||=== Build finished: 2 errors, 2 warnings ===|
ne dll kommt dabei trotzdem nich raus -.-"
05/22/2009 12:22 schlurmann#22
Du kannst auch Microsoft Visual C++ Express benutzen. Das ist im Grunde, was ich im Video benutze, nur ist es kostenlos.

[Only registered and activated users can see links. Click Here To Register...]

Detour Lib im Anhang.
05/22/2009 12:47 LemoniscooL#23
-.-" ich komm mir echt verarscht vor xD
also .. ich hab mir MsVC++ Express 08 geladen .. fehler bleiben immernoch die selben .. ich hab nochmal nen anderen compiler versucht (borland) da kommt wieder nen anderer fehler -.- ich glaub ich lass es .. das is mir echt zu blöd das muss doch noch anders gehen als mit detours -.-
05/22/2009 13:22 Akorn#24
Als was compilierst du das eigentlich? Als "C" oder "C++" ?

Wen man z.b. eine C++ quelldatei ".cpp" versucht mit einem C compiler zu compilieren dan kommen auch ein haufen fehlermeldungen.

kannst ja mal kucken ob es daran liegt.
05/22/2009 13:27 LemoniscooL#25
ich compilier als cpp .. daran kanns eig nich liegen
en freund meinte dass die fehler in code blocks daran liegen dass die lib nich richtig gelinkt wäre ..
könnte es daran liegen?
05/22/2009 13:37 schlurmann#26
Ich glaube Code::Blocks oder DevCpp erlauben kein Linken über #pragma comment. Versuch's in den Projekteinstellungen oder eben mit VsC++.

Was gibt dir denn VsC++ für Errors? Ich kann mir das nicht vorstellen. Wenn du Hilfe brauchst schreib mich mal in MSN ([Only registered and activated users can see links. Click Here To Register...]) bzw. ICQ 250173498 an, und ich gucke ob ich dir helfen kann.
05/22/2009 14:00 Atheuz#27
Quote:
Originally Posted by schlurmann View Post
Was gibt dir denn VsC++ für Errors? Ich kann mir das nicht vorstellen. Wenn du Hilfe brauchst schreib mich mal in MSN ([Only registered and activated users can see links. Click Here To Register...]) bzw. ICQ 250173498 an, und ich gucke ob ich dir helfen kann.
Dito, kann ich mir auch nicht vorstellen wieso es dort Fehler auswerfen sollte.
Eventuell hatte er kein leeres DLL Projekt genommen, sondern mit dem standard Inhalt und hats dann einfach irgendwo reinkopiert.
05/22/2009 14:52 LemoniscooL#28
okay .. es geht nu ^.^" oh mann .. endlich xD tausend dank =)
06/03/2009 17:03 volchok#29
Sehr hilfreiches Tutorial endlich hat mal ein Detour geklappt :P
Aber mal eine Frage zum ersten Parameter der DetourFunction, lässt sich jede WinApi Funktion so leicht hooken indem man lediglich den Namen der Funktion angibt ?
Ich hätte gedacht man muss die Adresse mit GetProcAdress aus dem Modul holen.

Und wenn ich jetzt eine "nicht-API-Funktion" hooken möchte kann ich mir doch einfach die Adresse mit z.B. IDA holen und die Adresse als Hex dann im ersten Parameter verwenden oder ?

// Edit

Ich habe jetzt mal versucht eine weitere MessageBox vor der Originalen auszugeben aber leider erfolglos :/

Quote:
int WINAPI mybox (HWND hwnd, char* lpText, char* lpCaption, UINT uType)
{
MessageBox( hwnd, "erster", "MB", uType );
return origbox( hwnd, lpText, lpCaption, uType );
}
Ist daran etwas falsch ?
06/03/2009 19:38 RDTSC#30
PHP Code:
int WINAPI mybox (HWND hwndcharlpTextcharlpCaptionUINT uType)
{
    
MessageBoxhwnd"erster""MB"uType );
    return 
origboxhwndlpTextlpCaptionuType );

Das ist nicht dein Ernst, oder?
Damit erzeugst du eine endlose Rekursion und somit einen Stack Overflow...

Die ersten 5 Bytes am Offset von MessageBoxA hast du doch gerade zu einem Jump zu deiner Funktion abgeändert...
PHP Code:
int WINAPI mybox (HWND hwndcharlpTextcharlpCaptionUINT uType)
{
    
origboxhwnd"erster""MB"uType );
    return 
origboxhwndlpTextlpCaptionuType );

Ich habe schon geschrieben, dass man das nicht so High Level Language-like sehen sollte. Man kann mit der von der Detours Library bereitgestellten Funktion überall Code injizieren.

Quote:
Originally Posted by volchok
Aber mal eine Frage zum ersten Parameter der DetourFunction, lässt sich jede WinApi Funktion so leicht hooken indem man lediglich den Namen der Funktion angibt ?
Ich hätte gedacht man muss die Adresse mit GetProcAdress aus dem Modul holen.
Dadurch, dass MessageBoxA als externe Funktion definiert ist (#include <windows.h>), wird Platz für deren Adresse reserviert, der beim Laden der Dll mit der dynamisch herausgefundenen Adresse beschrieben wird.
Das heißt, dass &MessageBoxA dann diesen Wert zurückliefert.
GetProcAddress würde auf das gleiche Ziel hinauslaufen, nur hättest du damit wahrscheinlich ein paar unnötige Aufrufe und Strings mehr.
(Extra ohne Fachworte, um es leicht verständlich zu halten ;-)