我尝试连接 DirectX 9 应用程序以从中获取屏幕截图。这就是我所做的:
- 我注入了我的 DLL,
CreateRemoteThread
并将LoadLibraryW
地址作为参数传递。我假设目标应用程序此时已经在运行。 在 DLL 的
DllMain
ICreateThread
中,我创建了一个临时 Direct3D 设备来获取它的 VMT:自动 pID3D9 = Direct3DCreate9(D3D_SDK_VERSION); D3DPRESENT_PARAMETERS pp = { }; IDirect3DDevice9 *pID3DDevice = NULL; 自动 hr = pID3D9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_NULLREF,NULL, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, &pID3DDevice); 自动 pID3DDevicevt = *reinterpret_cast(pID3DDevice);
当我尝试重写指向 Direct3D 设备
EndScene
函数的指针时,什么也没有发生:// 这里 '42' 是 EndScene 在 VMT 中的索引,哈哈 pID3DDevicevt[42] = my_EndScene;
注意:我
VirtualProtect
在重写之前的那个指针和VirtualProtect
它之后的指针,我只是省略了那个代码。我以“经典”挂钩结束:我重写了 6 个字节的原始函数,因此它无条件地跳转到我的函数。然后我恢复原始字节,做我自己的事情,调用原始函数并再次重新挂钩该函数。有用。
当我尝试重写 Direct3D 设备EndScene
函数的指针时,为什么没有任何反应?
我已经搜索并看到一些信息,必须足够早地放置 VMT 挂钩才能使其工作。是这个原因吗?