Spiel stürzt nach Injection ab



  • Hallo liebe Community!

    Ich habe eine DLL mithilfe eines Tutorials geschrieben die die EndScene Funktion der d3d9.lib hooked und ein pinkes Rechteck in die obere linke Ecke zeichnen soll(Grob zusammengefasst). Hier mal der Code:

    #pragma once
    #pragma comment(lib, "d3d9.lib")
    #pragma comment(lib, "d3dx9.lib")
    
    #include <windows.h>
    #include <cstdio>
    #include <d3d9.h>
    #include <d3dx9.h>
    
    HRESULT __stdcall EndScene(LPDIRECT3DDEVICE9 pDevice);
    typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
    EndScene_t pEndScene;  
    
    const D3DCOLOR txtPink = D3DCOLOR_ARGB(255, 255, 0, 255);
    
    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, 2000, 2000, txtPink);
    	return pEndScene(pDevice);
    }
    
    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);
    			}
    
    DWORD WINAPI InitHook(LPVOID param)
    {
    	HMODULE hModule = NULL;
    	while (!hModule)
    	{
    		hModule = GetModuleHandleA("d3d9.dll");
    		// Handle zur DLL holen
    		Sleep(100);
    		// 100ms warten
    
    	}
    	pEndScene = (EndScene_t)DetourFunc((PBYTE)0x7543279F, (PBYTE)hkEndScene, 5);
    
    	return 0;
    }
    
    int WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
    	switch (reason)
    	{
    	case DLL_PROCESS_ATTACH:
    		CreateThread(0, 0, (LPTHREAD_START_ROUTINE)InitHook, 0, 0, 0);
    		break;
    
    	}
    	return true;
    }
    

    Jedoch stürzt das Spiel sofort ab nachdem ich die DLL injecte. Es basiert auch ganze sicher auf DirectX9. Ich hoffe ihr könnt mir helfen.

    MfG moin354

    P.S: Ich würde ja einen Link zum Tutorial posten, jedoch bin ich mir gerade nicht sicher ob ich das darf, falls ja einfach sagen und ich füge es hinzu 🙂 .



  • Hallo.

    <a href= schrieb:

    Ich">Wobei du dir aber überlegen solltest ob du dir nicht erst die Grundlagen der Programmierung aneignest bevor du dich ans "Hacken" machst. 😉

    Meinst du nicht dass du dir erstmal was einfacheres suchen solltest ? 😉

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

    Hardcoded Addresse = böse.

    Falls das nicht das Problem ist, musst du mit dem Debugger ran, ich empfehle dafür einen guten, wie z.B. Olly.
    In InitHook bzw. hkEndScene mit Inline-Assember einen Breakpoint setzen (int 3) und dann die Assemblerbefehle durchsteppen und schauen wo und warum es crasht.



  • Hi danke erstmal für deine - wie beim letzteren male schon - nette Antwort 🙂 Also ich habe den Code(mithilfe von einem anderen Forum) jetzt erstmal so ergänzt das er loggt wenn er eine Funktion aufruft etc. Das habe ich folgendermaßen getan:

    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);
    }
    
    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!");
    	DWORD 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);
    	DWORD dwEndScene = VTableStart[42];
    	pEndScene = (EndScene_t)DetourFunc((PBYTE)dwEndScene, (PBYTE)hkEndScene, 5);
    	//pEndScene = (EndScene_t)DetourFunc((PBYTE)0x7543279F, (PBYTE)hkEndScene, 5);
    }
    
    HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
    {
    	DrawRect(pDevice, 10, 10, 200, 200, txtPink);
    	add_log("Object drawn!");
    	return pEndScene(pDevice);
    }
    

    Der Code ist jetzt etwas verändert da ich noch hilfe bei stundenlangem googlen gesucht habe^^. Naja zumindest wird alles geloggt und er bestätigt mir auch das er dort ankommt, jedoch bricht das Programm weiterhin ab. Muss ich da jetzt echt mit Assembler ran? 😞

    Edit: Im Tutorial wird gesagt ich soll diese Adresse nehmen. Ich schätze mal er weiß was er da geschrieben hat, ansonsten müsste mir das jemand bitte kurz erklären 🙂



  • Im Tutorial wird gesagt ich soll diese Adresse nehmen. Ich schätze mal er weiß was er da geschrieben hat, ansonsten müsste mir das jemand bitte kurz erklären 🙂

    Verwendest du genau die selbe Anwendung wie im Tutorial ? Versuchst du das selbe Spiel zu patchen ?
    Ja? -> *Könnte* gutgehen.
    Nein? -> Böser Fail.
    Hardgecodete Adressen sind immer gefährlich. Nur zum testen verwenden, aber dann bitte nicht von irgendwo abschreiben. Weißt du denn was der Code mit dieser Adresse macht ?

    Naja zumindest wird alles geloggt und er bestätigt mir auch das er dort ankommt, jedoch bricht das Programm weiterhin ab

    Wo ankommt ? Jetzt weiß ich wie dein Programm mit Log aussieht, aber den Log kenne ich immer noch nicht. Wo genau knallts denn jetzt ?

    Muss ich da jetzt echt mit Assembler ran? 😞

    JA. Wer sich mit DLL-Injektion und Funktion-Hooking beschäftigt, sollte sich auch entsprechend mit Asm auskennen. So schwer ist das auch nicht, absolute Basics reichen aus. Wenn du uns den Asmcode bei dem es crasht zeigen (genaue Zeile) und den Fehler gibst könnten wir dir recht genau sagen warum das so ist.
    Logging ist schön und gut, hat aber immer noch was von "Im Nebel stochern", du fügst immer weider eine Zeile ein um das Problem einzukreisen, und dann rätst du herum warum es so ist wie es ist. Einfach durchsteppen und den Fehler direkt sehen ist deutlich einfacher. 😉


Log in to reply