2015-08-26 22 views
0

我想没有发给最终用户访问它创建的OpenCL内核。的OpenCL无需外部内核文件

因此,我不能使用常规的外部.cl文本文件。有什么替代方法,关于我想避免用内核创建一个巨大的文本字符串?

而另一个问题,如果我在一个硬编码字符串把这段代码,会不会也有可能从一些反汇编器访问该代码?

+0

你是否真的想阻止任何人读取你的内核源代码,或者你是否想将内核源代码嵌入到可执行文件中以便于分发? – jprice

+0

@jprice这是封闭的源代码软件,所以我实际上都想要。 – manatttta

回答

1

这里有2种情况:

  1. 如果你是针对一个单一的设备
  2. 如果你是针对任何OpenCL设备

在第一种方案中,有一个可能性将二进制数据嵌入到可执行文件中(使用字符串)。并在运行该程序时加载它。 就不会有逆向工程可能(除非已经知道的,如组装),因为该计划将已编译的代码,而不是你写的原代码。

这样做会的方式:

uchar binary_dev1[binarySize] = "..." 
uchar * binary = &binary_dev1; 
program = clCreateProgramWithBinary(context, 1, &device, 
            &binarySize, 
            (const unsigned char**)&binary, 
            &binaryStatus, 
            &errNum); 

第二种方案包括通过某种形式的“重整”的保护在内核源代码。 由于压榨机代码将被编译,反向工程也可能是复杂的。

你可以做任何你压延能想到的是可逆的,甚至将它们结合起来。一些想法:

  • 使用压缩格式压缩代码,但硬编码解压缩的一些参数,使其更简单。

    • LZ4,ZLIB,等...
  • 在代码中使用的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; 
      } 
      
  • 编码使用需要的关键,并且是可逆的

  • 使用,保护您的程序二进制朝着相反的程序编码方法是工程,如Themida。
+0

非常感谢!不过,我认为OpenCL会为此提供替代方案。我真的不喜欢使用字符串编码的想法,并且有额外的工作量来压缩它并使其失效,等等...... – manatttta

+0

而且我正瞄准任何OpenCL设备! – manatttta

+0

据我所知,OpenCL不支持LLVM格式,即使某些制造商使用LLVM二进制文件作为中间CL代码(ARM)。所以为了完全兼容,字符串必须被存储。 Vulkan可能会通过存储LLVM代码来解决这个问题。 – DarkZeros

1

使用SPIR 1.2 for OpenCL 1.2或SPIR 2.0 for OpenCL 2.0,直到SPIR-V for OpenCL 2.1可用。