Hi,
ich habe jetzt versucht nen D3D Hook zu schreiben, nachdem ich das Tutorial von purple diamond gelesen habe: [Only registered and activated users can see links. Click Here To Register...]. Leider hab ich echt keine Ahnung was ich hier falsch mache. Bevor ich vor die DllMain Funktion extern "C" hinzugefügt habe, lies sich die Dll nicht mal injecten. Jetzt funktioniert das, allerdings wird kein Rechteck gezeichnet. Die Adresse hab ich auch wie im Tutorial mit IDA bekommen. Wäre wirklich sehr nett wenn sich das jemand anschauen könnte. Danke.
mfg,
ZackBlack
ich habe jetzt versucht nen D3D Hook zu schreiben, nachdem ich das Tutorial von purple diamond gelesen habe: [Only registered and activated users can see links. Click Here To Register...]. Leider hab ich echt keine Ahnung was ich hier falsch mache. Bevor ich vor die DllMain Funktion extern "C" hinzugefügt habe, lies sich die Dll nicht mal injecten. Jetzt funktioniert das, allerdings wird kein Rechteck gezeichnet. Die Adresse hab ich auch wie im Tutorial mit IDA bekommen. Wäre wirklich sehr nett wenn sich das jemand anschauen könnte. Danke.
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 (__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
EndScene_t pEndScene;
const D3DCOLOR txtBlack = D3DCOLOR_ARGB(255,255,255,255); // Hoffentlich schwarz ;)
void *DetourFunc(BYTE *src, const BYTE *dst, const int len) //Gamedeception Hook Funktion
{
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);
}
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice) //Die neue Funktion, danach wird wieder zur normalen returnt.
{
DrawRect(pDevice, 10, 10, 200, 200, txtBlack); //Rechteck zeichnen.
return pEndScene(pDevice);
}
void InitHook() //Wird in einem neuen Thread gestartet.
{
HMODULE hModule = NULL;
while(!hModule)
{
hModule = GetModuleHandleA("d3d9.dll"); //Handle zur Dll holen, wird nicht gebraucht, stellt aber sicher das d3d9 läuft.
Sleep(100); //Warten und dann wieder prüfen obs läuft.
}
pEndScene = (EndScene_t)DetourFunc((PBYTE) 0x7543279F, (PBYTE)hkEndScene, 5); //Hier wird gehookt ^^
}
extern "C"
int WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserverd)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)InitHook, 0, 0, 0);
break;
}
return true;
}
ZackBlack