逆向工程师可以直接将图形调试器附加到 OpenGL 应用程序以提取着色器源代码。据我了解,另一方面,Vulkan 使用 SPIR-V 字节码,而不是将明文着色器传递给图形 API。
SPIR-V 字节码是否混淆了着色器源代码,还是很容易反编译?
逆向工程师可以直接将图形调试器附加到 OpenGL 应用程序以提取着色器源代码。据我了解,另一方面,Vulkan 使用 SPIR-V 字节码,而不是将明文着色器传递给图形 API。
SPIR-V 字节码是否混淆了着色器源代码,还是很容易反编译?
有一个完整的规范详细解释了每个 SPIR-V 操作码的行为。这有点与混淆相反。但不仅如此。
SPIR-V 尽管是“汇编”,但保留了大量有关源程序的信息。它包含结构定义、带有参数和返回类型的函数定义、循环和条件构造等。为 SPIR-V 编写反编译器一点也不难。
SPIR-V 还可以选择包含注释各种 SPIR-V 定义的文本片段。这更像是编译成 SPIR-V 的环境的功能,但输出的 SPIR-V 可以包含变量名称、结构名称等。如果您愿意,这些 OpName 装饰都可以轻松剔除。
但即使没有名字,所有重要的结构信息都在那里。因此,与原始 GLSL 相比,SPIR-V 的安全性收益非常小。
它没有做任何真正的混淆。它唯一能做的就是去掉变量名。
如果应用程序不愿意使实际计算复杂化,那么就是这样。
它不能对控制流做太多,因为 vulkan 需要结构化的控制流。每个条件分支必须有一个合并块,每个循环都有一个严格的结构。
SPIR 操作码的行为类似于 Java 中的字节码:
操作码到纯代码的可逆性没有简单的解决方法。Java领域使用的一些解决方案是: