我的问题很简单:你是一个可执行文件,输出“允许访问”或“拒绝访问”,坏人试图理解你的算法或修补你的内脏,让你说“允许访问”。
在这个介绍之后,你可能会非常想知道我在做什么。一旦不见了,他就要打开暗黑破坏神吗?我可以安抚你的忧虑,我不是那种怪人。我的目标是破门。
crackmes可以在(例如)www.crackmes.de.上找到。crackme是一个小的可执行文件,它(大多数时间)包含一个小算法来验证串行,并根据串行输出“授予访问”或“拒绝访问”。目标是使这个可执行输出始终“被授予访问权限”。允许您使用的方法可能会受到作者的限制——没有补丁,没有反汇编——或者涉及您可以用二进制、objdump和十六进制编辑器做的任何事情。破解crackmes是乐趣的一部分,但毫无疑问,作为一个程序员,我想知道如何创建困难的crackmes。
基本上,我认为crackme由两个主要部分组成:一个特定的序列验证和周围的代码。
使串行验证很难仅仅使用汇编来跟踪是非常可能的,例如,我有一个想法,把串行作为一个模拟微处理器的输入,这个模拟微处理器必须以某种状态结束,才能使串行被接受。另一方面,人们可能会变得更便宜,并且更多地了解加密技术强大的方法来保护这一部分。因此,使其足够困难以使攻击者尝试修补可执行文件不应该是tha
很难。
然而,更困难的部分是保护二进制文件。让我们假设一个完全安全的序列验证无法以某种方式逆转(当然,我知道它可以逆转,在怀疑中,你从二进制文件中撕掉了部分,你试图破解并向它抛出随机序列,直到它接受为止)。我们如何防止攻击者仅仅覆盖二进制文件中的跳转,以使二进制文件接受任何内容?
我已经在这个主题上进行了一些搜索,但是大多数关于二进制安全性、自验证二进制文件等方面的结果都会出现在一些文章中,这些文章试图防止使用受损二进制文件的操作系统受到攻击。通过对某些二进制文件进行签名并使用内核验证这些签名。
我目前的想法包括:
-
检查要跳转的二进制文件中的显式位置。
-
校验和部分二进制文件,并将运行时计算的校验和与这些文件进行比较。
-
对代码中的函数进行正负运行时检查。对串行验证有副作用。:)
你能想出更多的方法来更长时间地骚扰一个可能的攻击者吗?(当然,你不能让他永远离开,有时,所有的检查都会被破坏,除非你能通过在程序中嵌入正确的程序校验和来破坏校验和生成器,呵呵)