在文件上附加唯一指纹

时间:2018-06-29 12:18:58

标签: python windows bash powershell jenkins

我有一组文件(编译的软件),我希望在分发前提供唯一的指纹。这个想法是编写一个脚本,该脚本:

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

指纹过程的要求是:

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

是否有任何用于指纹文件识别的开源解决方案?

2 个答案:

答案 0 :(得分:1)

steganography中进行一项练习,这是一项非常艰巨的任务,目的是将信息存储在文件中而不破坏文件,并且以不容易发现的方式进行。该理论工具需要能够解析可执行结构,并适当地对其进行修改,如果需要,可以编辑偏移量,或者检测填充区域,或者基本上可以完成编译器正在执行的某些工作。我怀疑它是否存在或可靠。

但是,有很多隐秘术工具可以通过巧妙地改变像素的颜色来在图片中存储信息,也许您可​​以将信息存储在exe文件或任何包含的资产的图标中。

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

另一种方法是只在某个随机函数中创建未使用的字符串,将其标记为volatile或使用您选择的语言进行模拟,以防止编译器从程序中对其进行优化并将其引人注目,像REPLACE_ME。现在,您可以打开此文件,搜索此字符串,并将其替换为所生成的标识符。如果标识符和字符串长度相同,则不会损坏软件。

另一种更微妙的方法是在您的应用程序中为同一条消息创建多个不同的措词,并将它们换入和换出,以区分版本。如果您的编程语言存储了以null终止的字符串,那么这很容易,只要将您的字符串放在代码中,只要最长的改写时间即可。如果您的语言存储了字符串的长度,那么您也必须动态地重新计算它。

或者,如果您在代码中使用Unicode字符串,则可以在某些字符串中使用外观类似的字形,以作为先前构想的省力版本。基本上,您是在字符串上执行homograph attack。另外,您可以使用不影响大多数语言并且不可见的unicode控制字符(ZWJ,ZWNJ等)。

通过区分两种不同的软件发行版,很容易发现所有方案,可以将具有不同优化级别的一种方案仅作为不同版本的软件而注销,但持久性攻击者仍然可以找出来。

答案 1 :(得分:0)

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