找到 Direct3D 设备¶
要控制 Direct3D 设备,你钩住设备 VF 表中的成员函数。但不幸的是,用 Direct3D API 从注入代码实例化你自己的相同设备类实例,并不意味着你会与游戏实例共享 VF 表。Direct3D 设备使用定制化的 VF 表运行时实现,每个设备都有自己独特的 VF 表。此外,设备有时会重写自己的 VF 表,移除任何钩子并恢复原始函数地址。
这两个 Direct3D 怪癖让你只剩下一个不可避免的选择:你必须找到游戏设备的地址,直接修改它的 VF 表。方法:
(cid:127)创建一个 Direct3D 设备,遍历它的 VF 表,定位
EndScene() 的真实地址。
(cid:127)在 EndScene() 上放置一个临时跳转钩子。
(cid:127)跳转钩子回调执行时,存储用于调用该函数的设备地址,移
除钩子,正常恢复执行。
(cid:127)从那里,用 VF 钩子钩住 Direct3D 设备的任何成员函数。