Mein Problem ist , dass das Programm sofort abstürzt wenn ich die Endscene hooke.
Bezogen von diesem TuT :[Only registered and activated users can see links. Click Here To Register...]
Es muss aber aufjedenfall an meiner eigenen Endscene liegen , denn wenn ich die gefundene Endscene auf sich selbst leite , entsteht eine endlosschleife :p
Meine eigene Endscene wird nur einmal aufgerufen und dann stürzt das Programm ab (Getestet mit 5 verschiedenen DirectX Testprogrammen)
Bezogen von diesem TuT :[Only registered and activated users can see links. Click Here To Register...]
Es muss aber aufjedenfall an meiner eigenen Endscene liegen , denn wenn ich die gefundene Endscene auf sich selbst leite , entsteht eine endlosschleife :p
Meine eigene Endscene wird nur einmal aufgerufen und dann stürzt das Programm ab (Getestet mit 5 verschiedenen DirectX Testprogrammen)
Code:
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <cstdio>
#include <time.h>
#include <d3d9.h>
#include <d3dx9.h>
const D3DCOLOR txtGreen = D3DCOLOR_ARGB(255,0,255,0);
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice);
typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
EndScene_t pEndScene;
DWORD WINAPI HookThread();
void add_log(char* format, ...);
void* DetourFunc(PBYTE src, const PBYTE dst, const int len);
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
HMODULE hModD3D9 = NULL;
FARPROC dwEndScene = NULL;
HANDLE tmpHandle = NULL;
DWORD* VTableStart = NULL;
DWORD tempadd = NULL;
BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved)
{
switch(Reason)
{
case DLL_PROCESS_ATTACH:
tmpHandle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&HookThread,0,0,0);
break;
case DLL_PROCESS_DETACH:
break;
}
return 1;
}
DWORD WINAPI HookThread(void)
{
while(!hModD3D9)
{
hModD3D9 = GetModuleHandle(L"d3d9.dll");
Sleep(100);
}
tempadd = dwFindPattern((DWORD)hModD3D9, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
VTableStart = (DWORD*) *(DWORD*)(tempadd+2);
dwEndScene = (FARPROC)VTableStart[42];
pEndScene = (EndScene_t) DetourFunc((PBYTE) dwEndScene, (PBYTE)hkEndScene, 5);
while (true)
{
Sleep(500);
}
return 0;
}
void* DetourFunc(PBYTE src, const PBYTE dst, const int len)
{
DWORD dwback;
BYTE* jmp = (BYTE*)malloc(len+5);
VirtualProtect(jmp, len+5, PAGE_EXECUTE_READWRITE, &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);
}
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;
}
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
Beep(750,300);
return pEndScene(pDevice);
}