逆向工程师可以直接将图形调试器附加到OpenGL应用程序以提取着色器源代码。据我所知,Vulkan使用SPIR-V字节码,而不是将明文着色器传递给图形API。
SPIR-V字节码是否会混淆着色器源,还是反编译起来相当容易?
答案 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中的字节码:
对于普通代码的操作码的可逆性,没有简单的解决方法。 Java领域中使用的一些解决方案是: