从 ID3D11PixelShader 对象获取已编译的像素着色器字节码

get compiled pixel shader bytecode from ID3D11PixelShader object

我正在对一个老游戏进行逆向工程,试图获取其已编译的着色器字节码,以便我可以对其进行反编译,我已经连接了 DrawIndexed 并正在使用 PSGetShader 获取当前的像素着色器。现在我只有 ID3D11PixelShader 对象。我怎样才能从这个对象中获取着色器字节码?我查看了 ID3D11PixelShaders 函数,但似乎没有一个可以执行此操作。

希望一些 d3d 向导知道如何做到这一点!谢谢

(这在 d3d9 中似乎很容易,IDirect3DPixelShader9 有一个名为 GetFunction 的函数,return 字节码。应该有一个 d3d11 等效项吧?)

I have hooked DrawIndexed and im grabbing the current pixel shader with PSGetShader.

您似乎已经成功将 D3D API 调用挂接到 MinHook 或类似的调用?

再挂一个方法,ID3D11Device.CreatePixelShader。调用原始实现。检查结果代码是否成功,同时验证输出指针接收到新创建的 ID3D11PixelShader 对象。如果两者都为真,则您有一个新的着色器,而着色器的字节码仍然可用。

我不知道你接下来想做什么。但请注意,这些着色器和许多其他 D3D 对象继承自 ID3D11DeviceChild COM 接口。该接口具有 SetPrivateData 和 GetPrivateData 方法,它们实现了带有 GUID 键和任意值的字典。

您可以按照计划计算字节码的哈希值,保存着色器二进制文件以便离线反编译它,还可以通过调用 SetPrivateData 将着色器的哈希值存储在新创建的对象中。理想情况下,使用 guidgen.exe(该工具包含在 visual studio,“工具/创建 GUID”菜单项中)为您使用的字典键生成一个新的 GUID。然后,在截获的 PSGetShader 调用中,您可以使用该键在着色器上调用 GetPrivateData(),您将获得先前存储在该着色器中的哈希码,同时您仍然拥有着色器的字节码。