2016-04-09 53 views
0

所以我一直在玩C++和注入DLL,这是相当新的,但很快学习。我试图挂钩EndScene,只是不能得到它的工作。我已经尝试使用模式扫描来查找并钩住它,我试图创建一个虚拟的d3d设备并通过它的VTable找到EndScene。每次失败时,我都会收到访问冲突,所以我只能假设我的地址有错误,或者我完全错过了某些内容。我尝试了很多不同的方式,但由于知识有限,需要多一点帮助。试图挂钩D3D EndScene

DWORD dEndScene = 0x10066D50; 
HMODULE hBaseAddress = GetModuleHandle("d3d9.dll"); 

BYTE* pEndFunction = (BYTE*)reinterpret_cast<uintptr_t>(hBaseAddress); 
pEndFunction = pEndFunction + dEndScene; 

fEndScene = (oEndScene)DetourFunction(pEndFunction, (PBYTE)EndScene); 

回答

0

该vtable很可能写保护。您可以使用VirtualProtect

而一些稍有不同的方法:

是否有可能创建其前更换Direct3DCreate9(防爆)?然后,您只需为所需的接口创建代理对象,然后可以正常委派,在之前/之后执行某些操作,或者完全执行不同的操作。

或者,如果您可以获得IDirect3DDevice9实例指针,那么可以通过编辑它引用的vtable(同样是VirtualProtect,但不需要知道函数在哪里居住,哪种情况可能会在各种情况下发生变化)。