[C++]D3D hook Problem

10/24/2009 16:04 Lawliet#1
Code:
#pragma once
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

#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;
ID3DXFont *pFont;
      
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
return pEndScene(pDevice);
}
int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
        switch(reason)
        {
        case DLL_PROCESS_ATTACH:
                
			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 holen
                Sleep( 100 ); // 100ms warten
        }
		pEndScene = ( EndScene_t )DetourFunc((PBYTE)  0x4FDD71CC,(PBYTE)hkEndScene, 5);
		DrawRect ( pDevice, 10, 10, 200, 200, txtPink);
		//Meins:
		//int zahl = 1;
		//int zahl2 = 0;
		//if(zahl > zahl2, zahl2++)
		//{
		//	D3DXCreateFont(pDevice, 14, 0, FW_NORMAL, 1, 0, DEFAULT_CHARSET,  OUT_DEFAULT_PRECIS, 
//ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &g_pFont );
//		}
}
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);
}
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
}
Das ist ein C++ Code der die EndScene und den DevicePointer hookt.
Es wird ein Rechteck links oben ins Fenster gezeichnet, doch trotz fehlerfreier compilierung wird nichts gezeichnet=( findet ihr einen Fehler?
10/24/2009 16:32 ^darkwing#2
Code:
[B]0x4FDD71B0[/B]
Den Code hast du von einem TuT und in diesem steht wie man die richtige Adresse von EndScence rausfindet (da sie bei nicht bei jeder d3d9.dll gleich ist, weil sie älter oder neuer evtl. ist).
10/24/2009 16:35 Lawliet#3
ok.
Stimmt!
10/24/2009 17:14 ms​#4
Vielleicht hilft dir der Thread weiter: [Only registered and activated users can see links. Click Here To Register...]
10/24/2009 19:13 Lawliet#5
Hmm ja also nen Injector zu finden ist jetzt nicht das Problem!
Ich habe jetzt die falsche EndScene Adresse editiert und die Dll mit Combat Arms getestet...
Doch leider wurde nichts gezeichnet=(
10/24/2009 19:34 ms​#6
Du musst dein Rechteck ja auch in der Detour-Funktion zeichnen. Also DrawRect() in hkEndScene() callen.
10/24/2009 19:43 Lawliet#7
ok danke. Damit hast du mir geholfen!

Edit//
10/24/2009 21:27 Lawliet#8
Code:
#pragma once
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

#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;
ID3DXFont *pFont;
      
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:
                
			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)  0x4FDD71CC,(PBYTE)hkEndScene, 5);
		//DrawRect (pDevice, 10, 10, 200, 200, txtPink);
		//Meins:
		//int zahl = 1;
		//int zahl2 = 0;
		//if(zahl > zahl2, zahl2++)
		//{
		//	D3DXCreateFont(pDevice, 14, 0, FW_NORMAL, 1, 0, DEFAULT_CHARSET,  OUT_DEFAULT_PRECIS, 
//ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &g_pFont );
//		}
}
void *DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
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);
}
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);
}
Richtig?
10/24/2009 21:36 ms​#9
Wenn du ein pinkes Rechteck siehst, dann ja. :o
10/24/2009 21:37 astyler#10
BITTE baruch hilfe
[Only registered and activated users can see links. Click Here To Register...]
10/24/2009 21:57 Lawliet#11
Quote:
Originally Posted by Disconnect View Post
Wenn du ein pinkes Rechteck siehst, dann ja. :o
Sehe ich nicht:(
10/24/2009 23:12 Bot_interesierter#12
Wie soll die DLL auch in der Lage sein irgendwas zu Zeichnen?
Du weist pDevice ja nirgends eine gültige Adresse zu, außerdem solltest du deinen ThreadProc in Ordnung bringen:
Code:
DWORD WINAPI ThreadProc(in  LPVOID lpParameter);
So sollte der Functions Prototyp deiner InitHook Funktion aussehen.

Übrigens sieht der gesamte Code so aus als hättest du wenig Ahnung von dem was du zu tun versuchst, du holst dir in der InitHook Funktion ein Handle zur D3D9.dll aber machst danach nichts mehr damit.

Wenn du möchtest das dein Code Funktioniert musst du auf jeden Fall pDevice einen gültigen Zeigern auf ein DIRECT3DDEVICE9 zu weisen.
10/25/2009 16:26 Lawliet#13
Den Handle hole ich mir um sicher zu gehen dass die Dll auch wirklich geladen wurde.
10/25/2009 17:24 ms​#14
Du kannst dann aber auch nicht einfach eine feste Adresse für EndScene nehmen, sondern musst das Offset von EndScene zu dem Handle addieren. Das Handle ist nämlich afaik nach jedem Programmstart unterschiedlich.

btw, kann es sein, dass der Detour direkt zum Caller von EndScene returnt? Ob man das so machen kann weiß ich nicht, weil dann ja eigentlich EndScene nie wirklich "ausgeführt" wird.
10/25/2009 17:56 Lawliet#15
Also ich muss erstmal DIRECT3DDEVICE9 eine gültige Adresse zuweisen...
d3d9.dll Handle + EndScene Offset = EndScene Adresse...
Doch was soll denn an dem Thread (InitHook()) falsch sein?
Sorry, aber dass verstehe ich nicht ganz=(