D3D-Hook Absturz

12/07/2009 15:39 ms​#16
Quote:
Originally Posted by ^darkwing View Post
Bei mir ändert sich die Adresse des ModulHandles nach jedem Systemneustart ;x
Bei mir nach jedem Programmneustart. ;O
Ist anscheinend abhängig vom Betriebssystem.
12/08/2009 14:52 schlurmann#17
Vielleicht mal mit C&P aufhören? Du hast ja offensichtlich keinen Plan von dem was du da machst.
12/09/2009 14:13 gametester123#18
Ich habe den Hook nach einem Tutorial gemacht, da wird einfach die absolute Adresse verwendet, was aber anscheinend nicht funktioniert.
12/09/2009 22:47 gametester123#19
Kann es sein das es irgendwie mit Windows Vista zusammenhängt?
12/09/2009 22:51 ms​#20
nein
12/12/2009 22:39 gametester123#21
So, funktioniert jetzt, hab die Methode von Gordon benutzt.. Trotzdem danke an alle die mir helfen wollten :)
12/17/2009 20:12 eliTec0De#22
ich hab gerade probleme bei der methode von gordon.. hilfe bitte
Code:
#include <windows.h>
#include <cstdio>
#include <d3d9.h>
#include <d3dx9.h>

#pragma once
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")


typedef HRESULT (WINAPI* tEndScene)(LPDIRECT3DDEVICE9 pDevice);
tEndScene oEndScene;

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
}

HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
   	const D3DCOLOR txtPink = D3DCOLOR_ARGB(255, 255, 0, 255); // Alpha, Rot, Grün, Blau
	DrawRect (pDevice, 10, 10, 200, 200, txtPink);
	return oEndScene(pDevice);
} 

bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
	for(;*szMask;++szMask,++pData,++bMask)
		if(*szMask=='x' && *pData!=*bMask )
			return false;
	return (*szMask) == NULL;
}
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
	for(DWORD i=0; i < dwLen; i++)
		if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
			return (DWORD)(dwAddress+i);

	return 0;
}

void InitHook()
{
    HMODULE hModule = NULL;
    
    while(!hModule)
    {
        hModule = GetModuleHandleA("d3d9.dll"); 
        Sleep( 100 ); 
    }
			DWORD* VTableStart = 0;
			DWORD FoundByGordon = dwFindPattern((DWORD)hModule, 0x128000,
(PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
			memcpy(&VTableStart, (void*)(FoundByGordon+2), 4);

			dwDrawIndexedPrimitive = (DWORD)VTableStart[82]; // für mehr: blick in die d3d9.h werfen!
			dwEndScene = (DWORD)VTableStart[42];
    oEndScene = ( tEndScene )DetourFunc((PBYTE) 0x7542CE09,(PBYTE) hkEndScene, 5);

}

void RunHook()
{
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InitHook, 0, 0, 0);
}

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
    if( reason ==1 )
    {
        RunHook();
    }
    
    return true;
}