将唯一指纹附加到文件



我有一组文件(编译的软件),我想在分发之前给它们一个唯一的指纹。这个想法是写一个脚本:

  1. 随机生成字符序列
  2. 将字符序列追加到项目中的文件中
  3. 将指纹与收件人一起存储在数据库中
  4. 将软件分发给收件人

指纹处理的要求是:

  • 指纹难以检测(即未存储在文件元数据或易于访问的区域中)
  • 指纹不会损坏添加序列的文件的数据
  • 指纹可以添加到可执行文件或dll文件中
  • 如果你知道往哪里看,就很容易读懂指纹

是否有任何为指纹文件而构建的开源解决方案?

在文件中存储信息而不损坏信息,并且以不易检测的方式存储信息是隐写术的一项练习,也是一项相当困难的练习。这个理论工具需要能够解析可执行结构,并正确地修改它,在需要时编辑偏移量,或者检测填充变量,或者基本上完成编译器正在做的一些工作。我怀疑它是否存在或可靠。

然而,有相当多的隐写术工具可以通过巧妙地改变像素的颜色来将信息存储在图片中,也许你可以将你的信息存储在exe文件或任何包含的资产的图标中。

另一种方法是在编译时隐藏数据,在可执行文件的性能优化级别的非关键部分,这样编译器生成的代码略有不同,但行为保证保持一致。您现在可以使用文件哈希作为指纹。

另一种方法是在一些随机函数中创建未使用的字符串,用您选择的语言将其标记为volatile或模拟,以防止编译器在程序中对其进行优化,并在其中添加一些明显的内容,如REPLACE_ME。现在您可以打开这个文件,搜索这个字符串,并用您生成的标识符替换它。若标识符和字符串的长度相同,就不会损坏软件。

另一种更微妙的方法是在你的应用程序中为相同的消息创建多个不同的措辞,并将它们交换进来和交换出去,以此来区分版本。如果您的编程语言存储以null结尾的字符串,那么这很容易,只需使代码中的字符串与最长的改写字符串一样长即可。若您的语言存储字符串的长度,那个么您也必须动态地重新计算它。

或者,如果您在代码中使用Unicode字符串,那么您可以在一些字符串中使用类似的字形,作为以前想法的一个不太费力的版本。基本上,你是在对你的字符串进行同源图攻击。或者,您可以使用unicode控制字符(ZWJ、ZWNJ等),这些字符不会影响大多数语言,并且是不可见的。

所有的方案都很容易通过区分软件的两个不同版本来发现,具有不同优化级别的版本可能会被视为软件的不同版本,但持久攻击者仍然可以找到它。

由于您谈论的是已编译的软件,也许另一种解决方案是使用execbinary加密工具。当你执行文件时,它会要求输入密码,如果密码正确,它会使用密码生成密钥。然后它使用该密钥直接解密内存中的程序。这样,他们就无法分析二进制文件,即使有了密钥,也要困难得多,更不用说修改了。你可以在代码中放入任意多的指纹,即常规文本字符串,它们很可能会留在那里。

嗯。。。

第二次世界大战的秘密和秘密间谍时代已经结束,如今更容易在许多著名电影中找到,如《2014》;模仿游戏;本尼迪克特·康伯巴奇演奏";Alan Turing";凯拉·奈特莉饰演";Joan Clarke";都是很棒的电影,看了又看。

在观察和研究这些问题时,可以理解的一个关键结论是,一个秘密,一个牢不可破的信息是不可能实现的。因此,在60年代和70年代,数学家和密码学家选择传递带有时间截止日期的秘密、唯一的消息,也就是说,使用与时间相关的算法来散列唯一的指纹ID(或消息)。如今,此类算法最常见的用法是在谷歌验证器应用程序上。该算法特别使用基于时间的一次性密码算法(TOTP;在RFC 6238中指定)和基于HMAC的一次性密码方法(HOTP;在RFC 4226中指定)。

我上面的介绍是有目的的,目的是提高软件工程师对使用加密和加密算法来提供软件解决方案的夸大程度的认识

从我从你的问题中读到的内容来看,你不需要如此精心的解决方案;保护";您的软件。我在这里滥用保护的定义,因为我们都知道微软产品的情况,特别是自90年代以来的MS-DOS 7和Windows产品。大约三十年前。

事实上,你已经有了一个";唯一指纹ID";关于您的每个软件解决方案。指纹就是软件代码本身加上可执行字节码。

在你上面的问题中,没有任何关于你的";加密散列";。所以让我们假设你想要一个";唯一指纹ID";使用256个最大字符,您只需将编程源代码与相应的字节码进行哈希即可生成256个字符的哈希字符串。

无需使您的软件解决方案复杂化,也无需因不必要的加密而使其占用CPU

许多方法中的一种;真实性验证";是从可执行文件本身加载字节码;散列串";,然后将其添加到先前在对软件解决方案进行编程时以及在生成可执行字节码之前添加的对应编程源代码的散列中。

最新更新