D3D-Hook Absturz

12/06/2009 19:03 gametester123#1
Hi Leute,
ich hab ein kleines Problem mit meinem D3D-Hook, wenn ich die DLL in Counter Strike, oder irgend eine andere D3D-Anwendung injecte stürzt das Programm sofort ab.
Die EndScene Adresse in der D3D9.dll habe ich schon gefunden:

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

Hier der Source Code:

Code:
#include <windows.h>
#include <cstdio>
#include <d3d9.h>
#include <d3dx9.h>



//LPDIRECT3DDEVICE9 pDevice;
const D3DCOLOR txtPink = D3DCOLOR_ARGB(255, 255, 0, 255); // Alpha, Rot, Grün, Blau
void InitHook();
void *DetourFunc(BYTE *src, const BYTE *dst, const int len);
typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color);
EndScene_t pEndScene;


      
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
DrawRect (pDevice, 10, 10, 200, 200, txtPink);
return pEndScene(pDevice);
}


int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
        switch(reason)
        {
        case DLL_PROCESS_ATTACH:
                // Hier kommt unser Code rein
            CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InitHook, 0, 0, 0);
                break;
        }
        return true;
}



void InitHook()
{        HMODULE hModule = NULL;
        while( !hModule )
        {
                hModule = GetModuleHandleA( "d3d9.dll" ); // Handle zur DLL holen
                Sleep( 100 ); // 100ms warten
        }
          

        pEndScene = ( EndScene_t )DetourFunc((PBYTE)0x74A447AF,(PBYTE)hkEndScene, 5);


}

void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color)
{
D3DRECT rect = {X, Y, X+L, Y+H};
Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0,  0); // bei Google gibt’s näheres
}


void *DetourFunc(BYTE *src, const BYTE *dst, const int len) // credits to gamedeception
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}
Wenn der Code funktionieren würde, sollte links oben ein pinkes Viereck zu sehen sein, nur leider macht er das nicht.

Ich hoffe ihr könnt mir helfen, danke schon mal im vorraus.
12/06/2009 19:18 ms​#2
Du kannst nicht einfach die absolute Adresse von EndScene nehmen, weil sie von dem Handle der d3d9.dll abhängig ist und diese nach jedem Programmstart unterschiedlich ist. Stattdessen musst du das Handle auslesen (was du ja schon machst) und dazu dann das Offset von EndScene addieren.
12/06/2009 19:22 gametester123#3
ah, danke werds gleich mal versuchen.. :)
12/06/2009 19:28 gametester123#4
Ich habs jetzt so geändert:
pEndScene = ( EndScene_t )DetourFunc((PBYTE)(DWORD)hModule+0x74a447af,(PBYT E)hkEndScene, 5);
nua leider stürzt das Programm nach der Injection immer noch ab.
12/06/2009 19:31 ms​#5
0x74a447af beschreibt ja auch die absolute Adresse.

Handle + Offset = absolute Adresse
12/06/2009 19:35 gametester123#6
wie komme ich von der absoluten Adresse auf die des Offsets? (sry steh grad irgendwie voll auf der leitung)
12/06/2009 19:43 ms​#7
Indem du das Handle von d3d9.dll von der Adresse abziehst. :)
Das Offset wäre dann in deinem Fall irgendwas wie 0x047AF, 0x147AF, 0x247AF, ...
12/06/2009 19:52 gametester123#8
So müsste es dann richtig sein:

DWORD dwEndScene
dwEndScene=0x74A447AF-(DWORD)hModule
pEndScene = ( EndScene_t )DetourFunc((PBYTE)dwEndScene,(PBYTE)hkEndScene, 5);

oder irre ich mich da?
12/06/2009 20:09 ms​#9
Das davor war richtig, nur dass du das 0x74A447AF durch das Offset ersetzen musst.
12/06/2009 20:18 gametester123#10
Offset=absolute Adresse (0x74A447AF) minus Handle (HModule)
pEndScene = ( EndScene_t )DetourFunc((PBYTE)(DWORD)hModule+Offset,(PBYTE)hk EndScene, 5);

das ist ja dann wieder 0x74A447AF? oder doch nicht??
12/06/2009 20:21 ^darkwing#11
PHP Code:
DWORD dwOffset
dwOffset 
0x74A447AF - (DWORD)hModule
cout 
<< dwOffset//Offset aufschreiben oder merken z.B. 0x1CE0B 
Einmal machen, dann weißt das Offset. Danach:
PHP Code:
pEndScene = ( EndScene_t )DetourFunc((PBYTE)((DWORD)hModule+0x1CE0B),(PBYTE)hk EndScene5); 
12/06/2009 20:55 ms​#12
Quote:
Originally Posted by gametester123 View Post
Offset=absolute Adresse (0x74A447AF) minus Handle (HModule)
pEndScene = ( EndScene_t )DetourFunc((PBYTE)(DWORD)hModule+Offset,(PBYTE)hk EndScene, 5);

das ist ja dann wieder 0x74A447AF? oder doch nicht??
Du vergisst, dass das Handle nach jedem Programmstart unterschiedlich ist. Die absolute Adresse war nur in dem einen Fall 0x74A447AF.
Nur das Offset bleibt immer gleich.
12/06/2009 21:09 gametester123#13
ich habs jetzt so:
DWORD dwOffset;
dwOffset = 0x74A447AF - (DWORD)hModule;

pEndScene = ( EndScene_t )DetourFunc((PBYTE)(DWORD)hModule+dwOffset,(PBYTE) hkEndScene, 5);

als dwOffset kommt 77219759 raus. (kann das sein?)

wenn ichs wieder injecte dann stürzt es immer noch ab..

//EDIT
dwOffset ist Dezimal in Hex ist das dann 49A47AF
12/07/2009 03:10 MrSm!th#14
Quote:
Originally Posted by gametester123 View Post
ich habs jetzt so:
DWORD dwOffset;
dwOffset = 0x74A447AF - (DWORD)hModule;

wenn ichs wieder injecte dann stürzt es immer noch ab..
Quote:
Originally Posted by Disconnect View Post
Du vergisst, dass das Handle nach jedem Programmstart unterschiedlich ist. Die absolute Adresse war nur in dem einen Fall 0x74A447AF.
Nur das Offset bleibt immer gleich.
;)
12/07/2009 15:34 ^darkwing#15
Bei mir ändert sich die Adresse des ModulHandles nach jedem Systemneustart ;x
Also muss es einen anderen Grund geben. Ich tippe mal auf die Injection.