Всем привет продолжаем.
Напишем функцию которая будет перехватывать оригинальный метод DirectX9 - EndScene(ES), выполнять необходимые нам действия и возвращала бы все "на круги своя"...
Работать будем пока только с этим методом в принципе его достаточно для наших действий
Для описания хука нам потребуется несколько функций для работы с памятью. Завернем их все в класс cMemory.
Будем добавлять с помощью "Мастера классов"
в открывшемся окне нажимаем "Далее" и заполняем согласно скрину

После этого у вас появятся два фаила cMemory.cpp и cMemory.h
Работаем с cMemory.h:
подключим "Windows.h"
Код HTML:
#include <Windows.h>
добавим 3 протатипа
Код HTML:
class cMemory
{
public:
cMemory(void);
~cMemory(void);
BOOL bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
void *Create_Hook(BYTE *src, const BYTE *dst, const int len);
};
FindPattern - функция для поиска адресса по уникальному набору байт.
Create_Hook - функция для установки хука.
работаем с cMemory.cpp
Описываем указанные функции
Код HTML:
BOOL cMemory::bCompare(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 cMemory::FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i < dwLen; i++)
if( bCompare((BYTE*)(dwAddress+i),bMask,szMask))
return (DWORD)(dwAddress+i);
return 0;
}
void * cMemory::Create_Hook(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp;
DWORD dwback;
DWORD jumpto, newjump;
VirtualProtect(src,len,PAGE_READWRITE,&dwback);
if(src[0] == 0xE9)
{
jmp = (BYTE*)malloc(10);
jumpto = (*(DWORD*)(src+1))+((DWORD)src)+5;
newjump = (jumpto-(DWORD)(jmp+5));
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = newjump;
jmp += 5;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src-jmp);
}
else
{
jmp = (BYTE*)malloc(5+len);
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;
for(int i = 5; i < len; i++)
src[i] = 0x90;
VirtualProtect(src,len,dwback,&dwback);
return (jmp-len);
}
Подключаем cMemory.h к Base.cpp:
Код HTML:
#include "cMemory.h"
после задаем указания на класс
Код HTML:
cMemory *MemHack;
Теперь будем описывать перехват ES(работаем с Base.cpp).
Подключаем необходимые фаилы
Код HTML:
#include <d3d9.h>
#include <d3dx9.h>
#define D3DparamX , UINT paramx
#define D3DparamvalX , paramx
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
Далее указываем:
Код HTML:
typedef HRESULT (WINAPI* oEndScene)(LPDIRECT3DDEVICE9 pDevice);
oEndScene pEndScene = NULL;
Описываем метод ES
Код HTML:
typedef HRESULT (WINAPI* oEndScene)(LPDIRECT3DDEVICE9 pDevice);
oEndScene pEndScene = NULL;
HRESULT APIENTRY myEndScene( LPDIRECT3DDEVICE9 pDevice )
{
return pEndScene( pDevice );
}
именно здесь мы будем "рисовать")
И сам поток с хуком
Код HTML:
int D3d9_Hook(void)
{
DWORD*vtbl=0;
DWORD hD3D9=(DWORD)LoadLibraryA("d3d9.dll");
DWORD table=MemHack->FindPattern(hD3D9,0x128000,(PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86","xx????xx????xx");
memcpy(&vtbl,(void*)(table+2),4);
pEndScene=(oEndScene)MemHack->Create_Hook((PBYTE)vtbl[42],(PBYTE)myEndScene,5);
return 0;
}
Теперь на инициализацию нашей DLL запустим поток. Что бы не писать постоянно всю функцию CreateThread(вдруг еще гне нужно будет) опишем для нее небольшой макрос
Код HTML:
#define new_My_Thread(Function) CreateThread(0,0,(LPTHREAD_START_ROUTINE)Function,0,0,0);
и на дописываем к точке доступа
Код HTML:
BOOL WINAPI DllMain(HMODULE hDll, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason==DLL_PROCESS_ATTACH)
{
new_My_Thread(D3d9_Hook);
}
return TRUE;
}