2

逆向工程师可以直接将图形调试器附加到 OpenGL 应用程序以提取着色器源代码。据我了解,另一方面,Vulkan 使用 SPIR-V 字节码,而不是将明文着色器传递给图形 API。

SPIR-V 字节码是否混淆了着色器源代码,还是很容易反编译?

4

3 回答 3

5

有一个完整的规范详细解释了每个 SPIR-V 操作码的行为。这有点与混淆相反。但不仅如此。

SPIR-V 尽管是“汇编”,但保留了大量有关源程序的信息。它包含结构定义、带有参数和返回类型的函数定义、循环和条件构造等。为 SPIR-V 编写反编译器一点也不难。

SPIR-V 还可以选择包含注释各种 SPIR-V 定义的文本片段。这更像是编译成 SPIR-V 的环境的功能,但输出的 SPIR-V 可以包含变量名称、结构名称等。如果您愿意,这些 OpName 装饰都可以轻松剔除。

但即使没有名字,所有重要的结构信息都在那里。因此,与原始 GLSL 相比,SPIR-V 的安全性收益非常小。

于 2016-09-01T20:37:58.063 回答
3

它没有做任何真正的混淆。它唯一能做的就是去掉变量名。

如果应用程序不愿意使实际计算复杂化,那么就是这样。

它不能对控制流做太多,因为 vulkan 需要结构化的控制流。每个条件分支必须有一个合并块,每个循环都有一个严格的结构。

于 2016-09-01T20:04:42.810 回答
1

SPIR 操作码的行为类似于 Java 中的字节码:

  • 它创建了一个中立的元操作符,即操作码,更接近机器原始代码,以轻松将 Spir 驱动程序转换为原始 GPU 代码。
  • 作为优势,操作码避免了普通源代码的分发,并且编译的 spir 操作码应该有编译问题,如拼写错误或语法错误 - 它已经编译;
  • 一个缺点是二进制表示可以再次转换为纯源代码。

操作码到纯代码的可逆性没有简单的解决方法。Java领域使用的一些解决方案是:

  • 混淆 - 就像 ProGuard 对 Java 的字节码所做的那样 - 不确定 SPIR 是否可能;
  • 使用对称密钥进行代码加密 - 密钥在您的 C 代码中硬编码。
  • 使用非对称密钥进行代码加密 - 登录到服务器后,私钥来自网络。
于 2016-09-02T15:13:51.077 回答