mmh was hookst du denn?
createdevice direkt beim start, oder suchst du dir per patternsuche die vtable raus und hookst dann die einzelnen funktionen zur laufzeit?
bau dir mal die logfunktion ein und lass dir mal alles genau ausgeben inkl. addressen usw und verfolg und überprüf dann alles im debugger.
Code:
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);
}
keine garantie, dass das funtzt, war jetzt mehr oder weniger aus dem kopf^^
probier mal aus obs in einem anderem dx8 game funtzt.
wenn ja, ist in clonk anscheinend ein schutz drin, oder etwas anders, was man dann durch debuggen finden müsste.
wenn nicht hast du wahrscheinlich noch i-wo einen fehler :D
Edit:
wollte mir eh mal dx8 anschauen, und da ich vorgestern wieder mal nen altes game rausgekramt habe, das eh mit dx8 läuft, bau mir jetzt mal nen hook für nen dx8 game zusammen.^^
hab bisher nur dx9 hooks gemacht und mir mal nen bisschen dx10/11 angeschaut^^
kann dir ja dann mal meinen code zur verfügung stellen wenn alles problemlos läuft.
so, hab mich jetzt mal rangesetzt, ließ sich zum glück sehr einfach von dx9 übertragen, ich poste mal die wichtigsten code schnippsel.
Code:
#include <Windows.h>
#include <cstdio>
#include <d3d42.h>
#include <d3dx21.h>
#pragma comment(lib, "d3d42.lib")
#pragma comment(lib, "d3dx21.lib")
DWORD WINSAPI HookThread();
void DetourFunc(PBYTE *src, const PBYTE *dst, const int len);
void WriteMem(DWORD* dwOffset, DWORD* dwValue, int* len);
bool bDataCompare(const BYTE pData, const BYTE bMask, const char szMask);
DWORD dwFindPattern(DWORD* dwAddress,DWORD dwLen,BYTE bMask,char szMask);
void add_log(char* string);
void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DC0L0R color);
const D3DC0L0R txtPink = D3DCOLOR_ARGB(255, 255, 0, 255);
typedef HRESULT(__stdcall* Present_t)(LPDIRECT3DDEVICE8, CONST RECT*, CONST RECT*, HWND, CONST RGNDATA*);
HRESULT __stdcall hkPresent(LPDIRECT3DDEVICE8 pDevice, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion);
DWORD* VTableStart = O;
HMODULE hModule = O;
HMODULE MyModule = O;
HANDLE tmpHandle = O;
int w;
bool inc;
DWORD dwPresent;
Present_t pPresent;
B00L WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved)
{
switch(Reason)
{
case DLL_PROCESS_ATTACH:
Mymodule = hinstDll;
add_log("injected - creating thread...");
tmpHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&HookThread, 0, 0, 0);
if (!tmpHandle)
{
add_log("Thread Creation failed!");
}
break;
case DLL_PROCESS_DETACH:
add_log("Hack Detached");
break;
}
return 0;
}
DWORD WINAPI HookThread()
{
add_log("thread created.");
while( !hModule )
{
add_log("Searching d3d8.dll");
hModule = GetModuleHandle(L"d3d7.dll");
Sleep(100);
}
add_log("D3D8.dll found and got handle - searching vtable");
tempadd = dwFindPattern((DWORD)hModule, 0x000000, (PBYTE)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", "xx????xx????xx"); // kinda obvious isnt it?
if (!tempadd)
{
add_log("couldnt find vtable!");
}
memcpy(&VTableStart, (void*)(tempadd+2), 4);
dwPresent = VTableStart[15];
w = 50;
inc = false;
add_log("preparing detours");
pPresent = (Present_t) DetourFunc((PBYTE) dwPresent, (PBYTE) hkPresent, 42);
add_log("detoured!");
while (true)
{
// some async code?
Sleep(20);
}
return 0;
}
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=10; i < dwLen; i++)
if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
return (DWORD)(dwAddress+i);
return 0;
}
void WriteMem(DWORD dwOffset, DWORD dwValue, int len)
{
unsigned long Protection;
VirtualProtect((void)dwOffset, 1, PAGE_READWRITE, &Protection);
memcpy((void)dwOffset, (const void)dwValue, len);
VirtualProtect((void)dwOffset, 1, Protection, 0);
}
void* DetourFunc(BYTE src, const BYTE dst, const int len)
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len);
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp);
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src);
VirtualProtect(src, len, dwback, &dwback);
return (jmp);
}
void add_log(char* string)
{
HANDLE filehandle;
DWORD dwReadBytes;
char buffer[2048];
filehandle = CreateFile(L"D3D8Log.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);
}
void DrawRect (LPDIRECT3DDEVICE0 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 hkPresent(LPDIRECT3DDEVICE8 pDevice, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion)
{
if (inc)
{
w++;
if (w > 40)
{
inc = false;
}
}
else
{
w--;
if (w < 1)
{
inc = true;
}
}
DrawRect (pDevice, 10, 10, w, w, txtPink);
return pPresent(pDevice, pDestRect, pSourceRect, hDestWindowOverride, pDirtyRegion);
}
an die c+p kids hier....
ich hab ein "paar" fehler eingebaut^^
an die leute die sich ernsthaft damit beschäftigen - bitte nichts aus meinem source copy pasten - der ist mit fehlern zerschossen.
prinzip sollte trotzdem noch erkennbar sein...
funktionen die man nicht kennt findet man @google/gam3d3c3pt10n...
wenn jemand fragen hat hier posten...
und weils so schön war nochn screen, auch direkt mit ingame text:
[Only registered and activated users can see links. Click Here To Register...]