【问题标题】:EndScene hook questionsEndScene 挂钩问题
【发布时间】:2020-04-19 10:18:54
【问题描述】:

所以最近我想使用 DirectX 将 imgui 界面添加到示例窗口,所以我观看了一个视频,我必须使用 DirectX9sdk 挂钩 EndScene 功能才能添加我的自定义 imgui 界面。

但是我有一些问题:

  1. 在哪里可以找到 DirectX9 函数和类型的任何文档,(如果有的话,因为我不明白为什么我们特别要挂钩 EndScene 函数)或者我在哪里可以找到任何文章更深入地解释 DirectX 如何有效吗?
  2. 到目前为止,我已经看到了两个版本的 EndScene 挂钩,一个带有 patternScanning 函数,它扫描 shaderapi dll 中的签名,另一个创建 DirectXDevice,然后从那里访问 vtable;网上有没有资源,还是我们必须自己做的事情? 这是我的版本:
while (!DirectXDevice) // loops until it finds the device
        DirectXDevice = **(DWORD**)(FindPattern("shaderapidx9.dll", "A1 ?? ?? ?? ?? 50 8B 08 FF 51 0C") + 0x1);

    void** pVTable = *reinterpret_cast<void***>(DirectXDevice); // getting the vtable array
    oEndScene = (f_EndScene)DetourFunction((PBYTE)pVTable[42], (PBYTE)Hooked_EndScene)//getting the 42th virtual function and detouring it to our own
  1. 我不太明白 __stdcall 在这里是做什么的,我知道它是用来调用 WINAPI 函数的,但是在这里做什么呢?
HRESULT __stdcall Hooked_EndScene(IDirect3DDevice9* pDevice){//some code}

注意:这是我挂钩到原始结尾场景的功能。

非常感谢,如果有很多问题,我很抱歉,但我真的无法解决这个问题。

【问题讨论】:

    标签: c++ windows hook directx-9 stdcall


    【解决方案1】:

    你怎么知道你需要挂钩哪些函数?

    说白了,你必须是一位经验丰富的 DirectX 图形程序员才能发现这一点。不要期望能够连接到您不了解的框架中。碰巧EndScene 总是会在渲染目标上的所有其他绘制调用之后被调用。

    有大量可用的 D3D9 编程资源,包括在线和纸质形式。他们中的大多数不是免费的。恐怕这不是您希望的答案。

    图案扫描或创建临时 D3D9 设备是怎么回事?

    Microsoft 没有做出任何明确的努力来使 EndScene 可挂钩。它只是恰好是可挂钩的,因为每个普通函数都是可挂钩的。你需要一种在内存中找到函数的方法,因为函数不会总是在同一个地址。

    一种方法是扫描函数内部出现的已知指令。需要有人成为第一个找出您可以扫描的模式的人。你远不是第一个勾搭EndScene的人,很多人之前都对这个功能进行了逆向工程,并分享了可搜索的模式。

    注意:模式不一定需要直接位于目标函数内部。在您的情况下,它也可能首先引导您找到其他东西,ID3D9Device 实例。重要的是您可以通过某种方式找到EndScene 函数。

    另一种方法是获取指向函数的指针。如果它是一个常规的 C 函数,那将很容易。这很困难,因为 OOP 往往会使这些事情变得困难 - 您必须通过各种接口来争取正确的 vtable。

    这两种方法各有利弊——创建 D3D9 设备更安全,但也更具侵入性,因为目标进程可能不会期望某人只是随机创建新设备。

    为什么钩子函数需要__stdcall

    由于您将原始函数替换为挂钩版本,因此挂钩函数的调用约定必须与原始函数的调用约定相同。 EndScene 的调用者期望(并且编译时使用)__stdcall 约定,因此新函数也必须以相同的方式运行,否则堆栈将被破坏。您替换函数的行为不会改变调用者调用它的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多