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