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



我正在对一个旧游戏进行反向工程,试图获得其编译的着色器字节码,以便对其进行反编译,我已经挂上了DrawIndexed,并使用PSGetShader获取当前像素着色器。现在我所拥有的只是ID3D11PixelShader对象。如何仅从该对象获取着色器字节码?我看过ID3D11PixelShaders的函数,但似乎没有一个可以做到这一点。

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

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

我已经钩住DrawIndexed,并使用PSGetShader抓取当前像素着色器。

看来您已经成功地使用MinHook或类似功能挂接了D3D API调用?

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

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

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

最新更新