自我验证二进制文件?

时间:2008-09-19 06:09:02

标签: security binary

我的问题非常简单:您是一个可执行文件,输出“访问被授予”或“访问被拒绝”,邪恶的人试图了解您的算法或修补您的内脏,以使您始终说“访问被授予” 。

在介绍之后,你可能会非常想知道我在做什么。一旦它出来,他会破解暗黑破坏神3吗?我可以安抚你的担忧,我不是那些破解者之一。我的目标是破解。

Crackmes可以在 - 例如 - www.crackmes.de上找到。 Crackme是一个小的可执行文件(大多数时候)包含一些算法来验证串行和输出“访问被授予”或“访问被拒绝”,具体取决于序列。目标是始终使此可执行输出“已授予访问权限”。允许使用的方法可能受到作者的限制 - 无需修补,无需反汇编 - 或涉及使用二进制,objdump和十六进制编辑器可以执行的任何操作。破解裂缝是乐趣的一部分,然而,作为一名程序员,我想知道如何创建困难的裂缝。

基本上,我认为crackme包含两个主要部分:一定的串行验证和周围的代码。

使用汇编很难跟踪串行验证是非常可能的,例如,我有一个想法是将串行作为模拟微处理器的输入,该微处理器必须最终处于某种状态才能获得串行接受。另一方面,人们可能会变得更便宜并且更多地了解加密方法以确保这一部分的安全性。因此,使这很难以使攻击者试图修补可执行文件不应该是tha 很难。

然而,更困难的部分是保护二进制文件。让我们假设一个完全安全的串行验证,不能以某种方式逆转(当然我知道它可以颠倒,毫无疑问,你从你尝试破解的二进制文件中删除部分并向它抛出随机序列直到它接受为止)。我们如何防止攻击者只是覆盖二进制文件中的跳转以使我们的二进制文件接受任何内容?

我一直在搜索这个主题,但大多数结果都是关于二进制安全性,自我验证二进制文件等等,最终会出现在试图阻止使用受损二进制文件攻击操作系统的文章中。通过签署某些二进制文件并使用内核验证这些签名。

我的想法目前包括:

  • 检查二进制文件中的显式位置是否为跳转。
  • 校验和部分二进制文件,并将运行时计算的校验和与这些校验和进行比较。
  • 对代码中的函数进行正负运行时检查。对串行验证有副作用。 :)

您是否能够想出更多方法来惹恼可能的攻击者? (当然,你不能永远地让他离开,有些人,所有的检查都会被打破,除非你设法通过在程序本身中为程序嵌入正确的校验和来打破校验和生成器,呵呵)

6 个答案:

答案 0 :(得分:6)

你正在进入“反转技术”。这基本上是一门艺术。更糟糕的是,即使你踩踏新手,也有olly和IDA Pro的“反反转插件”,他们可以下载并绕过你的大部分对策。

计数器措施包括通过陷阱调试器API检测调试器,或检测“单步执行”。您可以插入在检测到调试器中断后继续运行的代码,但在程序中稍后开始随机执行。这真是一场猫捉老鼠游戏,而破解者则占据了重要的优势。

退房...... http://www.openrce.org/reference_library/anti_reversing - 其中一些内容。

http://www.amazon.com/Reversing-Secrets-Engineering-Eldad-Eilam/dp/0764574817/ - 这本书有很好的反转信息,并逐步介绍这些技巧。一般来说,如果你正在进行逆转,那么一个好的开始。

答案 1 :(得分:2)

我相信这些事情通常比它们的价值更麻烦。

您花费大量精力编写代码来保护二进制文件。坏人花费更少的精力来破解它(他们通常比你更有经验)然后释放破解所以每个人都可以绕过你的保护。你唯一会烦恼的是那些因你的保护而不方便的诚实的人。

只是将盗版视为商业成本 - 如果您确保仅为付费客户提供所有支持,则盗版软件的增量成本为零。

答案 2 :(得分:1)

有TPM技术:tpm on wikipedia

它允许您将二进制文件的加密校验和存储在特殊芯片上,这可以作为单向验证。

注意:TPM有点糟糕,因为它可以用于DRM​​。但对于该领域的专家来说,这有点不公平,甚至还有一个open-TPM组允许linux用户准确控制他们的TPM芯片的使用方式。

答案 3 :(得分:1)

解决此问题的最有效方法之一是Trusted Computing。基本上你会加密应用程序并将解密密钥传输到一个特殊的芯片(Trusted Platform Module),芯片只有在确认计算机处于“可信”状态后才能解密应用程序:没有内存查看器/编辑器,没有调试器等。基本上,您需要特殊的硬件才能查看解密的程序代码。

答案 4 :(得分:0)

因此,您希望编写一个程序,该程序在开头接受密钥并将其存储在内存中,随后从光盘中检索它。如果它是正确的密钥,则该软件可以正常工作。如果它是错误的密钥,软件崩溃。目标是盗版者很难生成一个工作密钥,并且很难修补程序以使用未经许可的密钥。

这实际上可以在没有特殊硬件的情况下实现。考虑我们的遗传密码。它基于这个宇宙的物理学。我们试图破解它,制造药物等等,我们失败了,通常造成大量不良副作用,因为我们还没有完全逆向设计复杂的“世界​​”,其中遗传“代码”演变为运作。基本上,如果你在所有人都可以访问的公共处理器(一个普通的“世界”)上运行所有东西,那么编写这样一个安全代码几乎是不可能的,正如当前软件很容易被破解所证明的那样。

为了实现软件的安全性,您基本上必须编写自己的足够复杂的平台,其他人必须完全彻底地进行逆向工程,以便修改代码的行为而不会产生不可预测的副作用。然而,一旦你的平台被逆向设计,你就会回到原点。

问题是,您的平台可能会在通用硬件上运行,这使您的平台更容易进行逆向工程,从而使您的代码更容易进行逆向工程。当然,这可能仅仅意味着提高了平台所需的复杂程度,使其难以进行逆向工程。

足够复杂的软件平台会是什么样子?例如,可能在每6次加法运算之后,第7次加法返回结果乘以PI除以自系统初始化以来执行的减法和乘法运算总数之差的模数5的对数的平方根。平台必须独立地跟踪这些数字,代码本身也是如此,以便解码正确的结果。因此,您的代码将基于您设计的平台的复杂底层行为的知识编写。是的,它会占用处理器周期,但是有人必须对这种小的惊喜行为进行逆向工程,并将其重新设计成任何新代码以使其正常运行。此外,你自己的代码一旦编写就很难改变,因为它会崩溃成不可简化的复杂性,每一行都依赖于先前发生的一切。当然,在一个足够安全的平台上会有更多的复杂性,但重点是有人会在他们可以对你的代码进行逆向工程和修改之前对你的平台进行逆向工程,而不会使副作用减弱。

答案 5 :(得分:0)

关于版权保护和保护Keeping the Pirates at Bay: Implementing Crack Protection for Spyro: Year of the Dragon

的精彩文章

那里提到的最有趣的想法是尚未提及的级联故障 - 你有校验和修改单个字节导致另一个校验和失败。最终其中一个校验和导致系统崩溃或做一些奇怪的事情。这使得盗版你的程序的尝试看起来不稳定,并且导致原因从崩溃中走了很长一段路。