【发布时间】:2010-12-31 23:14:15
【问题描述】:
我想从任意 DirectX 9 应用程序中绕过 EndScene 以创建一个小的覆盖。例如,您可以使用 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。
缺点: 看起来并不那么可靠。
如何从注入的 DLL 中挂钩 EndScene,该 DLL 可能在游戏已经运行时加载,而无需处理其他系统上的不同 d3d9.dll,并且一种可靠的方法?例如,FRAPS 如何执行它的 DirectX 挂钩?
DLL 不应该适用于所有游戏,只适用于我通过CreateRemoteThread 注入它的特定进程。
【问题讨论】:
-
列表编号是否有原因?
标签: c++ directx hook dll-injection