Android 隐藏着色器源代码

Android 隐藏着色器源代码,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,下面的StackOverflow响应解释了在将着色器源代码引入应用程序后从着色器获取源代码的几种不同方法。然而,通常人们并不担心着色器代码被读取(因此大多数情况下文本文件都会被读取),偶尔我们会担心 因此,如果我们关心的是防止着色器源代码被读取,那么实际上可以采取什么方法来防止这种情况?我并不特别希望浏览着色器代码中正在执行的操作。如果需要隐藏某些数学组件,那么我是否必须从着色器源中取出这些组件,并在代码中本地执行它们 编辑: 虽然我知道,希望通过足够努力从某物获取信息的人可能会完成任务,但让

下面的StackOverflow响应解释了在将着色器源代码引入应用程序后从着色器获取源代码的几种不同方法。然而,通常人们并不担心着色器代码被读取(因此大多数情况下文本文件都会被读取),偶尔我们会担心

因此,如果我们关心的是防止着色器源代码被读取,那么实际上可以采取什么方法来防止这种情况?我并不特别希望浏览着色器代码中正在执行的操作。如果需要隐藏某些数学组件,那么我是否必须从着色器源中取出这些组件,并在代码中本地执行它们

编辑:


虽然我知道,希望通过足够努力从某物获取信息的人可能会完成任务,但让这样的任务变得不平凡总是很好的。

您可以在运行时插入占位符并替换它们。但不管你做什么,如果有人真的对你的代码感兴趣,他们最终会阅读它

编辑:我刚才想到的另一个选项是使用
glShaderBinary
使用预编译着色器。但这可能是相同的,攻击者只需多做一步,并不是所有平台都返回任何支持的二进制格式(
GL\u NUM\u SHADER\u binary\u formats


只是想说明一下,这不值得你花时间,你的程序中可能还有其他地方需要花时间。

你可以在运行时插入占位符并替换它们。但不管你做什么,如果有人真的对你的代码感兴趣,他们最终会阅读它

编辑:我刚才想到的另一个选项是使用
glShaderBinary
使用预编译着色器。但这可能是相同的,攻击者只需多做一步,并不是所有平台都返回任何支持的二进制格式(
GL\u NUM\u SHADER\u binary\u formats

我只是想说清楚,这不值得你花时间,在你的计划中可能还有其他方面你应该花时间

然而,这里提出的问题是针对一个在同一个环境下工作的人。它将是一个库的一部分,该库返回一个程序代码,用于用户现有的纹理。这将是为了保护所有使用库的用户不查看代码

因此,您希望保护您的程序不受自身的影响。感谢OpenGL的着色器编译/链接模型恰好允许您这样做。因为如果用其他方式定义它,你就不能这么做

可以使用着色器/程序区分。链接程序对象后,用于构建它的着色器对象完全不相关。您可以使用拆下它们。然后,可以删除着色器并返回程序

事实上,你应该一直这样做;否则,OpenGL将保留着色器字符串的无意义副本,直到您删除该程序

然而,这里提出的问题是针对一个在同一个环境下工作的人。它将是一个库的一部分,该库返回一个程序代码,用于用户现有的纹理。这将是为了保护所有使用库的用户不查看代码

因此,您希望保护您的程序不受自身的影响。感谢OpenGL的着色器编译/链接模型恰好允许您这样做。因为如果用其他方式定义它,你就不能这么做

可以使用着色器/程序区分。链接程序对象后,用于构建它的着色器对象完全不相关。您可以使用拆下它们。然后,可以删除着色器并返回程序


事实上,你应该一直这样做;否则,OpenGL将保留着色器字符串的无意义副本,直到您删除该程序。

与CPU应用程序二进制文件不同,GPU着色器二进制兼容性仍处于初级阶段,因为指令集尚未标准化。在许多GPU上使用二进制着色器程序是可能的,但在不同设备之间(即使是那些包含来自同一公司的GPU IP的设备)的可移植性可能会很棘手


PowerVR Insider网站上的FAQ项目详细介绍了在PowerVR设备上使用二进制着色器的技术挑战。

与CPU应用程序二进制不同,GPU着色器二进制兼容性仍处于初级阶段,因为指令集尚未标准化。在许多GPU上使用二进制着色器程序是可能的,但在不同设备之间(即使是那些包含来自同一公司的GPU IP的设备)的可移植性可能会很棘手


PowerVR Insider网站上的常见问题解答项目详细介绍了在PowerVR设备上使用二进制着色器的技术挑战。

您使用的是外部更改的制服,而不是直接在着色器代码中进行计算?使用占位符,我指的是在运行时留下一些众所周知的文本,在编译程序。这样,您就可以将剩余的代码分散到本机程序流中。但同样,如果你在二进制代码中留下一个常量字符串,它可以很容易地被读取。哦,本质上使用了一种误导的形式。引导他们认为源代码就是它,但随后将其从本机代码中替换。有趣,是的。但正如您所指出的,如果他们愿意,他们仍然可以在运行时通过glGetShaderSource调用将其拉出。是的,我添加了另一种可能性,但它几乎和使用纯文本一样容易“中断”(虽然您获得了额外的好处,但您的程序加载速度更快)。您使用的是外部更改的制服,而不是直接在着色器代码中进行计算?使用占位符,我的意思是在编译程序之前留下一些在运行时被替换的已知文本。这样,您就可以将剩余的代码分散到本机程序流中。