D3D Hook Problem

11/01/2011 20:31 ZackBlack#1
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.
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;
}
mfg,
ZackBlack
11/01/2011 20:59 MrSm!th#2
Quote:
void InitHook()
Ein Thread hat den Typ DWORD WINAPI InitHook(LPVOID param).


Quote:
const D3DCOLOR txtBlack = D3DCOLOR_ARGB(255,255,255,255);
Schwarz wäre 255, 0, 0, 0.
Außerdem reicht hier das RGB Makro, denn die Zeichen-Methode mit Clear unterstützt keine Transparenz.

Hast du daran gedacht, die EndScene Adresse anzupassen?
Versuch doch mal durch MessageBoxen erstmal zu testen, ob dein Hook überhaupt aufgerufen wird.
11/01/2011 21:57 xNopex#3
Quote:
Versuch doch mal durch MessageBoxen erstmal zu testen, ob dein Hook überhaupt aufgerufen wird.
Dich mögen zahllose Blitze treffen und brutzeln :)

>> [Only registered and activated users can see links. Click Here To Register...]
11/01/2011 22:51 ZackBlack#4
Vielen Dank für die Antworten. :) Ich werde das dann wahrscheinlich erst übermorgen testen können. Auf die Idee mit MessageBox und Debug String bin ich nicht gekommen, ich wollte das mit Breakpoints machen, hab ich dann aber nicht geschafft das zu debuggen.. werde das mit der Debug String Funktion machen, danke. Edit: Fast den Thanksbutton vergessen xD
11/02/2011 01:29 Medix#5
Quote:

Versuch doch mal durch MessageBoxen erstmal zu testen, ob dein Hook überhaupt aufgerufen wird.
das hab ich mal bei meinem ersten globalen keyboard hook gemacht. Ja kann ich dir nur empfehlen lol
11/02/2011 01:40 Dr. Coxxy#6
in diamonds tut wird ganz am ende "foundbygordon" vorgestellt.
die solltest du benutzen, dann gehts auch...
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);
Mfg
SilverDeath
11/02/2011 01:53 MrSm!th#7
Quote:
Originally Posted by xNopex View Post
Dich mögen zahllose Blitze treffen und brutzeln :)

>> [Only registered and activated users can see links. Click Here To Register...]
Nein. Ich mag MessageBoxen lieber.

Und die VTable Methode hat auch ihre Nachteile, ist aber einer statischen Adresse deutlich vorzuziehen.
11/02/2011 03:15 Dr. Coxxy#8
ich mag züge:

Code:
void add_log(char* format, ...)
{
	HANDLE filehandle;
	DWORD dwReadBytes;
	char buffer[2048];
	char writebuffer[2048];
	va_list args;
	va_start(args, format);
	vsprintf (buffer, format, args);
	filehandle = CreateFile(L"IchMagZuege.txt", GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
	SetFilePointer(filehandle, 0, 0, FILE_END);
	char date[18];
	_strdate(date);
	date[8] = ' ';
	_strtime(date+9);
	sprintf_s(writebuffer, 2048, "Log Added (%s): %s\r\n", date, buffer);
	WriteFile(filehandle, writebuffer, strlen(writebuffer), &dwReadBytes, 0);
	CloseHandle(filehandle);
}
11/02/2011 11:09 MrSm!th#9
Mit Standard-C++ würdes du das ganze in der Hälfte der Zeilen schaffen.

Btw. habe ich deswegen MessageBoxen empfohlen, weil sie den Thread blocken.
So kann man zb. auch genau sehen, wann was passiert und in Ruhe alles auswerten, bis man dann weiter drückt.
Das bringt weder OutputDebugString noch ein LogFile.
11/02/2011 12:25 ZackBlack#10
Mir der VTabel Methode funktioniert es problemlos, Danke. :)
11/02/2011 14:56 Xenox3#11
Quote:
Quote:
Zitat:
void InitHook()
Ein Thread hat den Typ DWORD WINAPI InitHook(LPVOID param).
Das wirst du nie durchsetzen können :D :D

Ich glaube dieser Satz steht in jedem Thema, welches sich mit "D3D-Hack-Problem" betitelt.
11/02/2011 17:53 MrSm!th#12
Bei jedem Hack Problem um genau zu sein.
11/02/2011 18:28 Dr. Coxxy#13
hey, ich benutze auch strikt DWORD WINAPI und kann es nicht ausstehen wenn andere da einfach void hinklatschen...
nervt fast so sehr wie die leute, die keine geschweiften klammern bei if (...) einzeilencodebefehlen benutzen-.-
11/02/2011 20:40 MrSm!th#14
Da bin ich dann wohl schuldig, zumindest, wenn es um simple Funktionsaufrufe geht und keine komplexen if-Abfragen oder komplexe Funktionsaufrufe ;O
Sehe kein Problem bei
Code:
if(a > 10)
    a = 10
Wenn man weiß, was man tut, ist es ja nichtmal so tragisch, da es eh keine Probleme verursachen kann, solange man wenigstens die Calling Convention einhält.
Aber das Problem ist halt, dass es irgendwelche Leute, die mal Tutorials (meist für Warrock Hacks) veröffentlicht haben, aus Faulheit mit void gemacht haben und es dann alle Anfänger so gelernt haben und glauben, es sei richtig :<
Und da sie eben nicht wissen, dass es eigentlich falsch ist, eignen sie sich so direkt nen schlechten Stil an.

Aber naja, ist ja hier nicht das Thema.