我想没有发给最终用户访问它创建的OpenCL内核。的OpenCL无需外部内核文件
因此,我不能使用常规的外部.cl
文本文件。有什么替代方法,关于我想避免用内核创建一个巨大的文本字符串?
而另一个问题,如果我在一个硬编码字符串把这段代码,会不会也有可能从一些反汇编器访问该代码?
我想没有发给最终用户访问它创建的OpenCL内核。的OpenCL无需外部内核文件
因此,我不能使用常规的外部.cl
文本文件。有什么替代方法,关于我想避免用内核创建一个巨大的文本字符串?
而另一个问题,如果我在一个硬编码字符串把这段代码,会不会也有可能从一些反汇编器访问该代码?
这里有2种情况:
在第一种方案中,有一个可能性将二进制数据嵌入到可执行文件中(使用字符串)。并在运行该程序时加载它。 就不会有逆向工程可能(除非已经知道的,如组装),因为该计划将已编译的代码,而不是你写的原代码。
这样做会的方式:
uchar binary_dev1[binarySize] = "..."
uchar * binary = &binary_dev1;
program = clCreateProgramWithBinary(context, 1, &device,
&binarySize,
(const unsigned char**)&binary,
&binaryStatus,
&errNum);
第二种方案包括通过某种形式的“重整”的保护在内核源代码。 由于压榨机代码将被编译,反向工程也可能是复杂的。
你可以做任何你压延能想到的是可逆的,甚至将它们结合起来。一些想法:
使用压缩格式压缩代码,但硬编码解压缩的一些参数,使其更简单。
在代码中使用的XOR运算符。如果它随着时间的推移而变化,那么效果会更好,如果它使用不明显的规则变化,效果会更好
char seq = 0x1A; for(int i=0; i<len; i++){ out[i] = in[i]^seq; seq = ((seq^i) * 78965213) >> 4 + ((seq * i) * 56987) << 4; }
编码使用需要的关键,并且是可逆的
使用SPIR 1.2 for OpenCL 1.2或SPIR 2.0 for OpenCL 2.0,直到SPIR-V for OpenCL 2.1可用。
你是否真的想阻止任何人读取你的内核源代码,或者你是否想将内核源代码嵌入到可执行文件中以便于分发? – jprice
@jprice这是封闭的源代码软件,所以我实际上都想要。 – manatttta