gpt4 book ai didi

c++ - 从注入(inject)的 DLL Hook DirectX EndScene

转载 作者:IT老高 更新时间:2023-10-28 12:43:50 24 4
gpt4 key购买 nike

我想从任意 DirectX 9 应用程序中绕过 EndScene 以创建一个小的叠加层。例如,您可以使用 FRAPS 的帧计数器覆盖,激活时会在游戏中显示。

我知道以下方法可以做到这一点:

  1. 创建一个新的 d3d9.dll,然后将其复制到游戏路径。由于首先搜索当前文件夹,在转到 system32 等之前,我修改后的 DLL 被加载,执行我的附加代码。
    缺点:你必须在开始游戏之前把它放在那里。

  2. 与第一种方法相同,但直接替换system32中的DLL。
    缺点:您无法添加游戏专用代码。您不能排除不希望加载 DLL 的应用程序。

  3. 使用 IDA Pro 4.9 Free 等工具直接从 DLL 获取 EndScene 偏移。由于DLL是按原样加载的,所以你可以把这个偏移量加到DLL的起始地址上,当它映射到游戏时,得到实际的偏移量,然后hook它。
    缺点:每个系统的偏移量都不相同。

  4. Hook Direct3DCreate9得到D3D9,然后 Hook D3D9->CreateDevice得到设备指针,然后 Hook Device->EndScene 通过虚拟表。
    缺点:当进程已经运行时,无法注入(inject) DLL。您必须使用 CREATE_SUSPENDED 标志启动该过程以 Hook 初始 Direct3DCreate9

  5. 在注入(inject) DLL 后立即在新窗口中创建新设备。然后,从该设备获取 EndScene 偏移量并将其 Hook ,从而为游戏使用的设备生成 Hook 。
    缺点:根据我阅读的一些信息,创建第二台设备可能会干扰现有设备,并且可能会出现窗口模式和全屏模式等问题。

  6. 同第三种方法。但是,您将进行模式扫描以获取 EndScene
    缺点:看起来不太可靠。

如何从注入(inject)的 DLL 中 Hook EndScene,该 DLL 可能在游戏运行时加载,而无需处理不同的 d3d9.dll其他系统,以及可靠的方法?例如,FRAPS 如何执行它的 DirectX Hook ?DLL 不应该适用于所有游戏,只适用于我通过 CreateRemoteThread 注入(inject)它的特定进程。

最佳答案

您安装了一个系统范围的 Hook 。 (SetWindowsHookEx) 完成此操作后,您将被加载到每个进程中。

现在,当调用钩子(Hook)时,您会查找已加载的 d3d9.dll。

如果已加载,则创建一个临时 D3D9 对象,并遍历 vtable 以获取 EndScene 方法的地址。

然后您可以使用自己的方法修补 EndScene 调用。 (通过调用您的方法替换 EndScene 中的第一条指令。

完成后,您必须修补回调,以调用原始的 EndScene 方法。然后重新安装你的补丁。

这就是 FRAPS 的做法。 (Link)


你可以从接口(interface)的vtable中找到函数地址。

因此您可以执行以下操作(伪代码):

IDirect3DDevice9* pTempDev = ...;
const int EndSceneIndex = 26 (?);

typedef HRESULT (IDirect3DDevice9::* EndSceneFunc)( void );

BYTE* pVtable = reinterpret_cast<void*>( pTempDev );
EndSceneFunc = pVtable + sizeof(void*) * EndSceneIndex;

EndSceneFunc 现在确实包含指向函数本身的指针。我们现在可以修补所有调用站点,也可以修补函数本身。

请注意,这一切都取决于在 Windows 中实现 COM 接口(interface)的知识。但这适用于所有 Windows 版本(32 或 64,不能同时使用)。

关于c++ - 从注入(inject)的 DLL Hook DirectX EndScene,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com