【问题标题】:Append unique fingerprint to file将唯一指纹附加到文件
【发布时间】:2018-12-08 15:22:17
【问题描述】:

我有一组文件(已编译的软件),我想在分发之前为其提供唯一的指纹。我们的想法是编写一个脚本:

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

指纹处理的要求是:

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

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

【问题讨论】:

  • 祝你好运。即使有现有的解决方案,软件推荐在 stackoverflow 上也是题外话。我们在这里帮助您解决您在编写代码时遇到的具体问题。
  • 问题是关于代码,利用库或工具来识别文件。
  • 有什么理由不使用普通的 MD5 或 SHA1 哈希?
  • 您编写的代码有什么具体问题?
  • @JamesC。 - 如果我了解 OP 想要将位附加到该文件唯一且被混淆的文件中。只需添加文件哈希首先会改变文件哈希,其次对其他人来说是微不足道的。

标签: python windows bash powershell jenkins


【解决方案1】:

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

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

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

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

另一种更微妙的方法是在您的应用中为相同的消息创建多个不同的改写,然后将它们换入和换出作为区分版本的一种方式。如果您的编程语言存储以空字符结尾的字符串,那么这很容易,只需将您的字符串在代码中进行最长的改写即可。如果您的语言存储字符串的长度,那么您也必须动态重新计算它。

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

通过区分软件的两种不同发行版很容易发现所有方案,具有不同优化级别的一种可能会被认为只是软件的不同版本,但顽固的攻击者仍然可以弄清楚。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果用户可以执行它,你就不能真正保护程序免受分析。具有逆向工程能力的程序员可以右键单击 -> 在任务管理器中创建转储并获取未加密的二进制文件。如果您想让分析变得困难 - 解密部分二进制文件,因为它们需要执行并在之后重新加密,请使用混淆和多个(数十个)嵌套虚拟机。在这个游戏中,你想让 RE 变得如此烦人,以至于黑客会放弃,这显然不适用于坚定的攻击者。
    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2018-05-05
    • 2014-11-30
    • 1970-01-01
    • 2018-06-30
    • 2018-12-06
    • 2019-08-15
    相关资源
    最近更新 更多