ich wende mich voller Verzweifelung an euch, da mal wieder etwas nicht funktioniert.
Ich habe gerade einen D3D9 Endscene Hook aus dem Tutorial von SilverDeath fertiggestellt.
Ich habe den vom Autor empfohlenen Injector benutzt, um meine DLL in ein D3D9-Testprogramm (Credits an wen von ****) zu injizieren (im Anhang +
). Am Anfang ist das Testprogramm immer wieder abgeschmiert. Erst als ich den "add_log"-Aufruf in der gehookten Funktion reingestellt habe, ist es nicht mehr abgeschmiert, sondern unverändert geblieben. Ich war gelinde gesagt sehr überrascht, da ich das Tutorial eigentlich genaustens befolgt habe. Auch hatte ich daran gedacht den Injector als Admin zu starten (nutze Win7 64Bit) und ich hatte es auch ausprobiert das Testprogramm als Admin zu starten. Als ich mal Olly an das Testprogramm gehangen habe und meine DLL dann injiziert hatte, ging es plötzlich (also das grüne Rechteck war wunderbar zu sehen).Lange Rede, kurzer Sinn: ich habe keine Ahnung woran es scheitert oder wie man es behebt. Es wäre nett, wenn mir jemand helfen könnte.
Hier erstmal der Code (eig. nur C&P vom Tutorial, aber was hätt' ich denn groß verändern sollen?):
Code:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "windows.h"
#include "stdafx.h"
#include <cstdio>
#include <time.h>
#include <d3d9.h>
#include <d3dx9.h>
#define _CRT_SECURE_NO_WARNINGS
void add_log(char* format, ...);
DWORD WINAPI HookThread(void);
void* DetourFunc(PBYTE src, const PBYTE dst, const int len);
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice);
typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
EndScene_t pEndScene;
HANDLE tmpHandle = NULL;
HMODULE hModD3D9 = NULL;
FARPROC dwEndScene = NULL;
DWORD* VTableStart = NULL;
DWORD tempadd = NULL;
bool bMessageSent = false;
const D3DCOLOR txtGreen = D3DCOLOR_ARGB(255, 0, 255, 0);
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
add_log("==========LOG START==========");
add_log("DLL Attached");
add_log("Creating Thread...");
tmpHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&HookThread, 0, 0, 0);
if (!tmpHandle)
{
add_log("ThreadCreation Failed!");
}
break;
case DLL_PROCESS_DETACH:
add_log("DLL Detached");
add_log("==========LOG END==========\n\n\n");
break;
}
return TRUE;
}
DWORD WINAPI HookThread(void)
{
add_log("Thread Created");
while (!hModD3D9)
{
add_log("Searching d3d9.dll...");
hModD3D9 = GetModuleHandle(L"d3d9.dll");
Sleep(100);
}
add_log("Found d3d9.dll: %x !", hModD3D9);
tempadd = dwFindPattern( (DWORD)hModD3D9, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
VTableStart = (DWORD*) *(DWORD*)(tempadd+2);
dwEndScene = (FARPROC) VTableStart[42];
add_log("Found EndScene: %x !", dwEndScene);
pEndScene = (EndScene_t) DetourFunc((PBYTE) dwEndScene, (PBYTE)hkEndScene, 5);
return 0;
}
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
if (bMessageSent == false)
{
add_log("Message from inner EndScene!");
bMessageSent = true;
}
D3DRECT rect = {10, 10, 310, 310};
pDevice->Clear(1, &rect, D3DCLEAR_TARGET, txtGreen, 0, 0);
return pEndScene(pDevice);
}
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"Log.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);
}
void* DetourFunc(PBYTE src, const PBYTE dst, const int len)
{
DWORD dwback;
BYTE* jmp = (BYTE*)malloc(len+5);
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);
VirtualProtect(jmp-len, len+5, PAGE_EXECUTE_READWRITE, &dwback);
return (jmp - len);
}
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=0; i < dwLen; i++)
{
if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
{
return (DWORD)(dwAddress+i);
}
}
return 0;
}
Code:
Log Added (01/30/12 01:21:06): ==========LOG START========== Log Added (01/30/12 01:21:06): DLL Attached Log Added (01/30/12 01:21:06): Creating Thread... Log Added (01/30/12 01:21:06): Thread Created Log Added (01/30/12 01:21:06): Searching d3d9.dll... Log Added (01/30/12 01:21:06): Found d3d9.dll: 6b050000 ! Log Added (01/30/12 01:21:06): Found EndScene: 6b07279f ! //hier wäre es ohne der add_log Zeile in der gehookten Funktion zu Ende gewesen Log Added (01/30/12 01:21:06): Message from inner EndScene! //hier hatte ich dann das Programm geschlossen Log Added (01/30/12 01:21:09): DLL Detached Log Added (01/30/12 01:21:09): ==========LOG END==========
Jeoni
P.S.: Ich hoffe, dass meine Problemerläuterung detailliert genug war.






