probleme bei d3d

02/27/2011 08:53 bammes#1
hey hab nochmal des tut von purple.d1amond gemacht.
das erstellen klappt ohne Fehler, doch es wird kein kasten angezeigt im game(warrock)
Code:
#include <windows.h>
#include <cstdio>
#include <d3d9.h>
#include <d3dx9.h>

const D3DCOLOR txtPink = D3DCOLOR_ARGB(255,255,0,255);

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);
}

typedef HRESULT(_stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
EndScene_t pEndScene;

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)
{
	DrawRect ( pDevice, 10, 10, 200, 200, txtPink);
	return pEndScene(pDevice);
}

void initHook()
{
	HMODULE hModule = NULL;
	while(!hModule)
	{
		hModule = GetModuleHandleA("d3d9.dll");
		Sleep(100);
	}
	pEndScene = (EndScene_t)DetourFunc((PBYTE) 0x7542CE09, (PBYTE)hkEndScene, 5);
}

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;
}

erkennt jmd den fehler?
habe ich auch das DrawRect ( pDevice, 10, 10, 200, 200, txtPink); richtig gesetzt?
02/27/2011 10:44 black0utCpp#2
Ich hab keine ahnung von d3d aber evtl liegt es daran ,dass du xie funktion gar nicht
aufrufst also in der nicht vorhandenen main funktion
02/27/2011 10:53 bammes#3
wird es doch eigendlich

pEndScene = (EndScene_t)DetourFunc((PBYTE) 0x7542CE09, (PBYTE)hkEndScene, 5);

laut tut tut das des starten.
02/27/2011 11:29 .BritainAndy#4
Du sollst die EndScene func. nicht hardcoden!
02/27/2011 11:38 bammes#5
? aber im tut steht doch, dass man das so machen soll.

oder habe ich da was falsch verstanden oder ist das tut einfach alt?

edit falls ihr net wisst welches tut hier:

[Only registered and activated users can see links. Click Here To Register...]
02/27/2011 11:54 mydoom#6
Ja das Tutorial ist alt, aber die Adresse zu "hardcoden" war meiner Meinung nach schon immer suboptimal.

Und übrigens:
Quote:
CreateThread(0,0,(LPTHREAD_START_ROUTINE)initHook, 0, 0, 0);
Quote:
void initHook()
Vergiss das "void" vor einer Thread-Routine sofort wieder. Das geht so:
Quote:
DWORD WINAPI Funktionsname(LPVOID param);
02/27/2011 12:18 bammes#7
wiso das?

void is doch nur ne funktion ohne rückgabe.

wiso sollte ich des DWORD nehmen?
02/27/2011 13:15 Akorn#8
Quote:
Originally Posted by bammes View Post
wiso das?

void is doch nur ne funktion ohne rückgabe.

wiso sollte ich des DWORD nehmen?
Weil Thread funktionen immer mit DWORD deklariert werden und das niccht zu machen ist ein sehr schlechter programmierstiel.

Quote:
Originally Posted by bammes View Post
? aber im tut steht doch, dass man das so machen soll.

oder habe ich da was falsch verstanden oder ist das tut einfach alt?
In dem Tutorial steht doch sogar drinn wie man die addresse zur laufzeit ermittelt.
02/27/2011 13:34 bammes#9
Quote:
Weil Thread funktionen immer mit DWORD deklariert werden und das niccht zu machen ist ein sehr schlechter programmierstiel.
k dann mach ichs in dword

Quote:
In dem Tutorial steht doch sogar drinn wie man die addresse zur laufzeit ermittelt.
meinsch die endscene adresse?
also die stimmt bei mir
02/27/2011 16:06 .BritainAndy#10
nein er meitn wie du die endscene addresse ermittelst, ohne IDA da diese funktion veraltet ist.
02/27/2011 19:08 MrSm!th#11
Quote:
Originally Posted by bammes View Post
wiso das?

void is doch nur ne funktion ohne rückgabe.

wiso sollte ich des DWORD nehmen?
Es hat übrigens nicht nur was mit dem Stil zutun, ein Thread gibt ja was zurück.
Nämlich einen Fehlerwert; 0 bei Erfolg, ansonsten eben nen Error Code.
02/27/2011 20:23 bammes#12
Quote:
ohne IDA da diese funktion veraltet ist.
wie geht es anders?
02/27/2011 21:56 MrSm!th#13
Du kannst es trotzdem mit IDA machen, aber hol dir wie gesagt die aktuelle und nimm nicht die aus dem Tutorial.
Trotzdem ist das eine schlechte Idee, du solltest den Hook lieber dynamisch machen.

Das geht, indem du entweder die Adresse per Patternsearch findest oder, indem du erst Direct3DCreate9Ex hookst, den Output (Pointer auf ein IDirect3D9 Interface) speicherst, davon die Methode CreateDevice hookst und davon dann wieder den Output (Pointer auf ein IDirect3DDevice9) speicherst, dann kannst du mit diesem die Adresse der EndScene bestimmen.
02/28/2011 20:45 bammes#14
ja klar ist mir dass des net die gleiche ist^^ hab ja auch andrer genommen

wiso ist das ne schlechte idee? sit diese adresse zu ungenau??
02/28/2011 22:02 mydoom#15
Ich würde sagen das Problem ist folgendes: Wenn du eine statische Adresse benutzt ist die Chance viel größer, dass dein Programm auf anderen Systemen nicht funktioniert. Falls die Adresse jedoch dynamisch berechnet wird, ist diese Chance geringer. (Außerdem konnte ich eine dll ohne große Änderungen in ein anderes Spiel injecten und alle visuellen "Hacks" haben anstandslos funktioniert. Gut, das ist eigentlich nicht der Hauptgrund, aber dennoch in manchen Situationen ganz hilfreich)