从网上下载下源代码编译,
void hookDirect3D(void)
{
typedef IDirect3D9 * (WINAPI* DIRECT3DCREATE9)(UINT SDKVersion);
#define OPCODE_LONG_JMP (0XE9)
//get "Direct3DCreate9" address
DIRECT3DCREATE9 pDirect3DCreate9 = (DIRECT3DCREATE9)::GetProcAddress(::LoadLibrary("d3d9.dll"), "Direct3DCreate9");
HANDLE hCurrentProcess = GetCurrentProcess();
EnableDebugPri();
//检查该函数是否已经被PefHUD修改
unsigned char code[5];
::ReadProcessMemory(hCurrentProcess, (const void*)pDirect3DCreate9, code, 5, 0);
if(code[0] != OPCODE_LONG_JMP)
{
DWORD dwErr = GetLastError();
char chTemp[MAX_PATH];
sprintf_s(chTemp,"操 出错了ReadProcessMemory code[0] != OPCODE_LONG_JMP ErrCode = %d",dwErr);
MessageBox(NULL,chTemp,"唉 错了",MB_OK);
return;
}
//记录PerfHUD函数的跳转地址
g_oldDirect3DCreate9Func = (long)(LONG_PTR)pDirect3DCreate9 + 5 + *((int*)(code+1));
//修改跳转地址
long lNewAddress = (long)(LONG_PTR)onDirect3DCreate9-((long)(LONG_PTR)pDirect3DCreate9 + 5);
BOOL bSucce = WriteProcessMemory(hCurrentProcess, (LPBYTE)(LONG_PTR)(pDirect3DCreate9)+1, &lNewAddress, 4, NULL);
if(!bSucce)
{
DWORD dwErr = GetLastError();
char chTemp[MAX_PATH];
sprintf_s(chTemp,"操 出错了 WriteProcessMemory = false ErrCode = %d",dwErr);
MessageBox(NULL,chTemp,"唉 错了",MB_OK);
}
}
运行程序会进到
if(code[0] != OPCODE_LONG_JMP)
{
这个分支理,也就是 那个位置不是jmp指令,
我用的dx sdk的版本是10年2月份的。系统win7 32位的。
知道的朋友帮帮我吧。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课