SPIR-V字节码是否提供模糊处理?

时间:2016-09-01 19:32:57

标签: opengl glsl obfuscation vulkan spir-v

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

SPIR-V字节码是否会混淆着色器源,还是反编译起来相当容易?

3 个答案:

答案 0 :(得分:4)

有一个entire specification详细解释了每个SPIR-V操作码的行为。这就是混淆的相反。但除此之外还有更多。

SPIR-V,尽管是" assembly",保留了大量有关源程序的信息。它包含结构定义,带参数和返回类型的函数定义,循环和条件结构等。为SPIR-V编写反编译器并不困难。

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

对于普通代码的操作码的可逆性,没有简单的解决方法。 Java领域中使用的一些解决方案是:

  • 混淆 - 就像ProGuard为Java的字节码做的那样 - 不确定SPIR是否可以这样做;
  • 使用对称密钥进行代码加密 - 密钥在C代码中是硬编码的。
  • 使用非对称密钥进行代码加密 - 私有密钥来自Web,登录服务器后。