Hook D3D Direct3DCreate9返回的虚函数表后,无法进入自定义的CreateDevice函数

银霜覆秋枫 2016-08-12 03:20:34

#include "stdafx.h"
#include <d3d9.h>
#include <D3dx9core.h>
#include<fstream>
#include<iostream>

using namespace std;

#pragma comment(lib, "D3D9.lib")
#pragma comment(lib, "D3Dx9.lib")

void GameD3D_HOOK();
IDirect3D9 * _stdcall New_Direct3DCreate9(UINT SDKVersion);
HRESULT _stdcall New_CreateDevice(
LPDIRECT3D9 pDx9,
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS * pPresentsentationParameters,
IDirect3DDevice9 ** pPresentturnedDeviceInterface

);

LPDIRECT3D9 m_pD3D = NULL; //Direct3D对象的接口指针

void * pDirect3DCreate9 = NULL;//Direct3DCreate9函数地址指针
void * pCreateDevice = NULL;//IDirect3D9::CreateDevice函数地址指针
void * pPresent = NULL;//IDirect3DDevice9::Present函数地址指针

BYTE Direct3DCreate_Begin[5];//用于保存Direct3DCreate9入口的5字节
BYTE CreateDevice_Begin[5];//用于保存IDirect3D9::CreateDevice入口的字节
BYTE Present_Begin[5];//用于保存IDirect3DDevice9::Present入口的5字节

void GameD3D_HOOK()
{
//hook Direct3DCreate9
MessageBoxW(GetForegroundWindow(), L"hook GameD3D_HOOK", L"HookDLL", MB_OK);
pDirect3DCreate9 = GetProcAddress(GetModuleHandle(L"d3d9.dll"), "Direct3DCreate9");
DWORD oldpro = 0;
memcpy(Direct3DCreate_Begin, pDirect3DCreate9, 5);

bool bRet = VirtualProtect(pDirect3DCreate9, 5, PAGE_EXECUTE_READWRITE, &oldpro);



*(BYTE*)pDirect3DCreate9 = 0xe9;
*(DWORD*)((BYTE*)pDirect3DCreate9 + 1) = (DWORD)New_Direct3DCreate9 - (DWORD)pDirect3DCreate9 - 5;

}
//当运行到Direct3DCreate9时跳转到这里
IDirect3D9 * _stdcall New_Direct3DCreate9(
UINT SDKVersion
)
{
MessageBoxW(GetForegroundWindow(), L"hook New_Direct3DCreate9", L"HookDLL", MB_OK);
__asm pushad
memcpy(pDirect3DCreate9, Direct3DCreate_Begin, 5);//首先还原入口的5个字节
m_pD3D = Direct3DCreate9(SDKVersion);
cout << m_pD3D << endl;

if (m_pD3D)
{

DWORD* vTable = (DWORD*)(*(DWORD*)m_pD3D);
//pCreateDevice = (void*)&vTable[16];//获得IDirect3D9::CreateDevice的地址指针
pCreateDevice = (void*)*(DWORD*)(*(DWORD*)m_pD3D + 0x40);


//pCreateDevice = (void*)*(DWORD*)(*(DWORD*)m_pD3D + 0x40);//获得IDirect3D9::CreateDevice的地址指针

DWORD oldpro = 0;
memcpy(CreateDevice_Begin , pCreateDevice, 5);//保存IDirect3D9::CreateDevice入口5个字节



//pCreateDevice = New_CreateDevice;
bool bRet = VirtualProtect(pCreateDevice, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &oldpro);




*(BYTE*)pCreateDevice = 0xe9;
*(DWORD*)((BYTE*)pCreateDevice + 1) = (DWORD)New_CreateDevice - (DWORD)pCreateDevice - 5;



}
else
{
}

__asm popad
return m_pD3D;
}
//hook CreateDevice
HRESULT _stdcall New_CreateDevice(
LPDIRECT3D9 pDx9,
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS * pPresentsentationParameters,
IDirect3DDevice9 ** pPresentturnedDeviceInterface

)
{
...
}

...全文
647 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
quarters4 2016-08-20
  • 打赏
  • 举报
回复
楼主,我的问题解决了,是我要hook的游戏调用d3d11,不是d3d9
银霜覆秋枫 2016-08-20
  • 打赏
  • 举报
回复
引用 7 楼 quarters4 的回复:
楼主,我的问题解决了,是我要hook的游戏调用d3d11,不是d3d9
好吧 ~恭喜~
quarters4 2016-08-19
  • 打赏
  • 举报
回复
引用 5 楼 u011974126 的回复:
引用 4 楼 quarters4 的回复:
LZ,我也遇到一样的问题。我的现象是对于自己写的简单的D3D程序和一些游戏,通过debugview看到进入自定义CreateDevice函数,对于另外一些游戏不可以。你是不是已经解决了?
还没有呢~
那你有没有什么思路啊?
银霜覆秋枫 2016-08-18
  • 打赏
  • 举报
回复
引用 4 楼 quarters4 的回复:
LZ,我也遇到一样的问题。我的现象是对于自己写的简单的D3D程序和一些游戏,通过debugview看到进入自定义CreateDevice函数,对于另外一些游戏不可以。你是不是已经解决了?
还没有呢~
quarters4 2016-08-18
  • 打赏
  • 举报
回复
LZ,我也遇到一样的问题。我的现象是对于自己写的简单的D3D程序和一些游戏,通过debugview看到进入自定义CreateDevice函数,对于另外一些游戏不可以。你是不是已经解决了?
赵4老师 2016-08-12
  • 打赏
  • 举报
回复
权限问题? 进程上下文问题? 参考WinAPIOverride源代码中相关片断?
银霜覆秋枫 2016-08-12
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
反汇编查看了的,得到的原来的CreateDevice的偏移地址应该是对的 ~但是就是没有跳转到新的函数中去
赵4老师 2016-08-12
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧