[C++] D3D Hook

11/24/2011 16:45 derjans#1
Hey Com,

ich möchte gerne einen simplen Gamehack für ein "Opfer-Game" schreiben.
Da ich D3D benutze, frage ich mich nun, wie ich dies Hooken kann.

Ich habe mir bereits einige Tutorials angesehen, doch leider funktioniert keins. Ich benutze Visual C++.

D3D8, D3D9 ist korrekt installiert!


Es wäre seehr nett, wenn mir jemand eine Art "Schablone" oder ein gutes Tutorial, mit dem ich D3D hooken kann. Ein Simpler Text auf dem Spiel, wie "Hello elitepvpers" würde mir genügen. Menüs kann ich selber erstellen.

Wäre wirklich seehr dankbar um eine Antwort!

Grüße
derjans / Jan
11/24/2011 18:30 Dr. Coxxy#2
[Only registered and activated users can see links. Click Here To Register...]

diamonds hooking tut für dx9, wenn du das nicht selber hinkriegst, lass es, c+p schablonen gebe ich zumindest nicht.

wenn du ein konkretes problem hast, dir z.b. eine zeile nicht klar ist und google sie dir auch nicht erklärt, oder irgendetwas aus für dich unerklärlichen gründen nicht funktioniert, kannst du gerne fragen^^
11/29/2011 12:34 derjans#3
Habe das Tutorial angefangen und bin jetzt zu dem Punkt gekommen, wo ich das erste mal die DLL testen kann. Doch leider funktioniert es nicht.

Das ist mein Code:
Code:
// ======================================================================= //
#include "stdafx.h"
#include <windows.h>
#include <cstdio>
#include <d3d9.h>
#include <d3dx9.h>
#pragma once
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
// ======================================================================= //
void InitHook();
void *DetourFunc(BYTE *src, const BYTE *dst, const int len);
HRESULT __stdcall EndScene(LPDIRECT3DDEVICE9 pDevice);
typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
EndScene_t pEndScene;
const D3DCOLOR txtPink = D3DCOLOR_ARGB(255, 255, 0, 255);
void add_log(char* string);
// ======================================================================= //
int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
	switch(reason)
	{
		case DLL_PROCESS_ATTACH:
			add_log("Versuche Thread zu erstellen!");
			CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InitHook, 0, 0, 0);
		break;
	}
	return true;
}
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)
{
	DrawRect ( pDevice, 10, 10, 200, 200, txtPink);
	return pEndScene(pDevice);
}
void InitHook() {
        add_log("Thread erstellt!");
	HMODULE hModule = NULL;
	while( !hModule )
	{
		hModule = GetModuleHandleA( "d3d9.dll" ); // Handle zur DLL holen
		Sleep( 100 ); // 100ms warten
	}
	add_log("d3d9.dll gefunden!");
	pEndScene = ( EndScene_t )DetourFunc((PBYTE) 0x0001CE09,(PBYTE)hkEndScene, 5);
}
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 add_log(char* string)
{
	HANDLE filehandle;
	DWORD dwReadBytes;
	char buffer[2048];
	filehandle = CreateFile(L"Log.txt", GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
	SetFilePointer(filehandle, 0, 0, FILE_END);
	sprintf_s(buffer, 1024, "Added Log: %s\r\n", string);
	WriteFile(filehandle, buffer, strlen(buffer), &dwReadBytes, 0);
	CloseHandle(filehandle);
}
Die add_log-Funktion habe ich von Dr.Coxxy (aus diesem Thread:
[Only registered and activated users can see links. Click Here To Register...])

Die EndScene-Adresse sollte richtig sein (habe IDA Pro verwendet):
[Only registered and activated users can see links. Click Here To Register...]

Die Log.TXT-Datei spuckt dabei folgendes aus:
Code:
Added Log: Versuche Thread zu erstellen!
Added Log: Thread erstellt!
Added Log: d3d9.dll gefunden!
Vielleicht habe ich auch einfach nur ein Brett vor dem Kopf, wäre euch sehr dankbar für eine Antwort!
11/29/2011 14:45 Dr. Coxxy#4
am ende wird eine findpattern funktion beschrieben um die vtable zu finden.
die benutzen, dann sollte es gehen.

Code:
tempadd = 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*)(tempadd+2), 4);
dwEndScene = VTableStart[42];
pEndScene = (EndScene_t) DetourFunc((PBYTE) dwEndScene, (PBYTE)hkEndScene, 5);
und ein thread ist DWORD WINAPI und nicht void.
dementsprechend auch return 0; am ende...
11/30/2011 09:44 derjans#5
Danke! Hat mir seehr geholfen!