openCL没有外部内核文件

时间:2015-08-26 16:40:02

标签: c++ c opencl

我想创建一个OpenCL内核,而不向最终用户提供访问权限。

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

还有一个问题,如果我把这段代码放在一个硬编码的字符串中,是否可以从一些反汇编程序中访问该代码?

2 个答案:

答案 0 :(得分:1)

这里有2个场景:

  1. 如果您要定位一台设备
  2. 如果您要定位任何OpenCL设备
  3. 在第一种情况下,可以将二进制数据嵌入到可执行文件中(使用字符串)。并在运行程序时加载它。 没有可能的逆向工程(除非已经知道的那些,比如汇编),因为程序将编译代码而不是你编写的原始代码。

    这样做的方法是:

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

    第二种方法是通过某种方式保护内核中的源代码" mangling"。 由于将编译mangler代码,因此逆向工程可能很复杂。

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

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

      • 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。

答案 1 :(得分:1)

对OpenCL 2.0使用SPIR 1.2,对OpenCL 2.0使用SPIR 2.0,直到OpenCL 2.1的SPIR-V可用。