【问题标题】:What is the appropriate checksum algorithm to use for preventing modification of code?用于防止修改代码的适当校验和算法是什么?
【发布时间】:2016-05-04 01:23:36
【问题描述】:

我会解释我打算做什么。我有一个函数或一组代码行(在 C 中)要保护 - 基本上没有人应该修改指令。所以,我有一个代码(称为校验和保护),它对从 C 文件生成的 x86 汇编代码进行操作。它从该程序集中拾取一条指令,将其添加(或应用弗莱彻算法或任何其他函数)到校验和值(最初为 0),直到所有指令完成为止。然后查看是否有任何指令被篡改,我将所有指令的加法(或 fletcher 等)与预先计算的校验和值进行对比。哪些方法适合这种情况?

这里是讨论这种技术的研究论文:

https://www.cerias.purdue.edu/assets/pdf/bibtex_archive/2001-49.pdf

这里是守卫模板:

guard:
      add ebp, -checksum
      mov eax, client_addr

for:
      cmp eax, client_end
      jg end
      mov ebx, dword[eax]
      add ebp, ebx
      add eax, 4
      jmp for
end:

【问题讨论】:

  • Fletcher 的校验和不是安全校验和(您将“安全”作为标签之一)。它提供了一些针对随机错误的保护,但没有针对恶意攻击的保护,因为任何攻击者都可以修改您的数据并为他的修改计算相应的校验和。如果您需要安全校验和,则需要消息验证码 (MAC) 或数字签名。要回答您的问题,从数学角度来看,我确实认为 256 比 255 更好。
  • 我修改了问题,因此描述发生了变化。我阅读了有关消息身份验证的信息,其中提到 MAC、数字签名和真实加密是可行的方法。你觉得最好的方法是什么?

标签: security checksum modulus


【解决方案1】:

您引用的研究论文来自Arxan technologies 的创始人。他们有patents 以这种方式保护代码,其中保护是为了防止人们进行逆向工程。在 Arxan 之前很多年,Intertrust 有一些 similar technologies。我对 Arxan 的研究不够深入,无法理解他们所做的事情有何新颖之处,我无法评论专利的合法性。

您最初将该问题表述为一个安全问题,但没有说明它是如何安全的。您现在已经重新编写了它(谢谢!)以使安全上下文更加清晰。您对防止代码修改和/或逆向工程感兴趣。

防止代码修改和/或逆向工程的技术基于混淆和自检。安全纯粹主义者永远不会将混淆称为“安全性”,但在实践中,它确实可以减缓黑客对逆向工程软件的攻击速度。

回到您的问题,您问是否应该使用校验和、数字签名或 MAC 来进行此类保护。我会推荐一个加密哈希函数。原因如下:

  • 简单的校验和很容易被黑客绕过。他所要做的就是修改代码,使得在代码修改结束时永远不会调用的指令取消他对代码前一部分的修改。
  • 数字签名和 MAC 是基于机密的,理论上黑客总能在您的代码中找到这些机密。 This research paper 多年前就展示了如何做到这一点(它既实用又有效!)。一旦发现秘密,数字签名或 MAC 的行为本质上就类似于加密哈希,因此避免使用这些工具的真正原因是它们对于您要解决的问题来说太过分了。
  • 加密哈希解决了校验和解决的同样问题,但它们使某人无法像攻击普通校验和一样攻击它:也就是说,如果他们修改了代码,那么他们也将拥有修改校验和。换句话说,没有简单的方法可以通过在末尾插入一条不执行任何操作的指令来取消对代码的修改。 (如果您确实找到了方法,那么您将计算哈希函数中的冲突,这意味着您破坏了加密哈希函数。

尽管有这些要点,软件中的单次检查仍然可以通过各种方式绕过。这就是为什么你需要守卫来守卫守卫,守卫在守卫之上,等等,你还需要守卫你的校验和(加密哈希输出值),守卫在那个之上,等等。最后,如果您想要从代码修改和逆向工程中获得实际的安全保护,那么这种策略正朝着 Arxan 和/或 Intertrust 的知识产权雷区前进。

【讨论】:

  • 感谢您的详细解答。问题是,作为我项目的一部分,我必须保护特定的 C 代码,而且我知道可能有许多“正确”或足够难以破坏保护框架。但现在至少要取得一些进展(即使只是一点点),我想在 Arxan 论文中添加一些东西(我已经提到过),所以我没有在操作码上使用简单的添加,而是在寻找另一个函数。我有 2 个问题,如果你能回答就太好了。
  • 1.您认为哪种加密哈希函数合适?由于我要保护的代码不是很大(100-200 行),我不希望运行时通过添加复杂的哈希函数来爆炸。 2.您认为在添加校验和功能后(使用任何加密哈希函数 - SHA256、MD5 等),我也应该混淆代码吗?提前致谢。
  • 另外,我必须在 x86 汇编中实现这个散列函数,因为我从代码中提取汇编指令以一一保护,并在其操作码上应用散列函数。在汇编中实现这个是不是太难了?
  • @ak0817: 1. SHA-256 是一个不错的选择,是的,您也应该混淆代码(例如,您不希望攻击者修改您的校验和代码,所以它需要被隐藏)。 2.在组装中实现的难度取决于您要花费多少时间和精力。我希望如果我对汇编语言有新鲜的想法,我可以在一天内完成,尽管我对这种加密有很多经验。或者,您可以从其他地方获取汇编代码。请记住,强大的哈希本身并没有什么价值,您还需要做其他所有事情!
  • 只要校验和或哈希的结果存储在程序中的某处,攻击者就可以修改代码和计算的校验和/哈希。
【解决方案2】:

在软件中没有真正万无一失的方法可以做到这一点。足够积极性知识渊博的攻击者只要能够访问程序二进制文件,通常就可以击败此类计划。

你唯一能做的就是让他们更难。使用混淆技术、自修改代码、硬件密钥,应有尽有。

但请记住,一般而言,此类技巧会更多地激怒合法客户,从而阻止严重的攻击者。

更新:

例如,看例如在An idiot guide to writing polymorphic enginesthis questionthis forum thread 的答案。寻找“x86 代码混淆”,你会发现更多。

【讨论】:

  • 谢谢。您能否建议一种适当的混淆方法 - 我的意思是我读到了有关插入虚拟代码、更改指令顺序等的信息,但似乎没有算法?
  • @ak0817 添加了一些混淆技术的链接。
  • 谢谢。我只是混淆的初学者。我会尽我所能去理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多