我想绕过EndScene
任意 DirectX 9 应用程序来创建一个小的覆盖。例如,您可以使用 FRAPS 的帧计数器覆盖,激活时会在游戏中显示。
我知道以下方法可以做到这一点:
创建一个新
d3d9.dll
的 ,然后将其复制到游戏路径。由于首先搜索当前文件夹,在转到 system32 等之前,我修改后的 DLL 被加载,执行我的附加代码。
缺点:你必须在开始游戏之前把它放在那里。与第一种方法相同,但直接替换system32中的DLL。
缺点:您无法添加游戏特定代码。您不能排除不希望加载 DLL 的应用程序。使用 IDA Pro 4.9 Free 等工具直接从 DLL 获取 EndScene 偏移。由于 DLL 是按原样加载的,因此您只需将此偏移量添加到 DLL 起始地址,当它映射到游戏时,获取实际偏移量,然后将其挂钩。
缺点:每个系统上的偏移量都不相同。挂钩
Direct3DCreate9
获取D3D9,然后挂钩D3D9->CreateDevice
获取设备指针,然后Device->EndScene
通过虚拟表挂钩。
缺点:当进程已经在运行时,无法注入 DLL。您必须使用标志开始该过程CREATE_SUSPENDED
以挂钩初始Direct3DCreate9
.注入 DLL 后,在新窗口中创建新设备。然后,
EndScene
从该设备获取偏移量并将其挂钩,从而为游戏使用的设备生成挂钩。
缺点:根据我阅读的一些信息,创建第二个设备可能会干扰现有设备,并且可能会出现窗口模式和全屏模式等问题。同第三种方法。但是,您将进行模式扫描以获得
EndScene
.
缺点:看起来不那么可靠。
如何EndScene
从注入的 DLL 挂钩,该 DLL 可能在游戏已经运行时加载,而不必处理其他系统上的不同d3d9.dll,并且使用可靠的方法?例如,FRAPS 如何执行它的 DirectX 挂钩?DLL 不应该适用于所有游戏,只适用于我通过CreateRemoteThread
.