2024年4月1日发(作者:)

#include

#include

#pragma comment(lib, "")

typedef HRESULT ( WINAPI* oPresent ) ( LPDIRECT3DDEVICE8 pDevice, CONST RECT*

pSourceRect,CONST

pDirtyRegion);

oPresent pPresent;

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 += len;

jmp[0] = 0xE9;

*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;

src[0] = 0x90; //50

src[1] = 0x90; // 58

src[2] = 0xE9;

*(DWORD*)(&src[3]) = (DWORD)(dst - src) - 7;

for (int i=7; i

VirtualProtect(src, len, dwBack, &dwBack);

return (jmp-len);

}

HRESULT WINAPI myPresent ( LPDIRECT3DDEVICE8 pDevice, CONST RECT* pSourceRect, CONST

RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion )

{

_asm pushad;

Sleep(100);

_asm popad;

return pPresent( pDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion );

}

bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)

{

for(;*szMask;++szMask,++pData,++bMask)

if(*szMask=='x' && *pData!=*bMask )

return false;

RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA*

return (*szMask) == NULL;

}

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

}

int hookPresent()

{

DWORD* VTableHook = 0;

DWORD hD3D8 = (DWORD)GetModuleHandle("");

DWORD VIRTUALTABLE = FindPattern(hD3D8, 0x128000,

(PBYTE)"xC7x06x00x00x00x00x89x86x00x00x00x00x89x86", "xx????xx????xx");

memcpy(&VTableHook, (void*)(VIRTUALTABLE+2), 4);

DWORD dwPresent = VTableHook[15];

pPresent = (oPresent)DetourFunc((PBYTE)dwPresent, (PBYTE)myPresent, 7);

return 0;

}

原理就是找到

的入口,搜索特征码,找到

Vtalbe(

虚函数表

)

,查表找到需要

hook

的函数的地址,

然后

hook

这个比较简单,不需要在游戏启动的时候通过

COM

的方式取得地址,相对难度要简单得多

需要

hook D3D

其它函数的可以查一下有关资料,看看相关的函数在虚函数表的位置,然后

hook

就可以了

如果要

hook DX9,

改对应的特征码就可以了