我的问题非常简单:你是一个可执行文件,输出"访问被授予"或"访问被拒绝",邪恶的人试图理解你的算法或修补你的内脏,以使你一直说"访问授权".
在介绍之后,你可能会非常想知道我在做什么.一旦它出来,他会破解暗黑破坏神3吗?我可以安抚你的担忧,我不是那些破解者之一.我的目标是破解.
Crackmes可以在 - 例如 - www.crackmes.de上找到.Crackme是一个小的可执行文件(大多数时候)包含一些算法来验证串行和输出"访问被授予"或"访问被拒绝",具体取决于序列.目标是始终使此可执行输出"已授予访问权限".允许使用的方法可能受到作者的限制 - 无需修补,无需反汇编 - 或涉及使用二进制,objdump和十六进制编辑器可以执行的任何操作.破解裂缝是乐趣的一部分,然而,作为一名程序员,我想知道如何创建困难的裂缝.
基本上,我认为crackme包含两个主要部分:一定的串行验证和周围的代码.
简单地使用汇编来进行串行验证是很有可能的,例如,我有一个想法是将串行作为模拟微处理器的输入,该微处理器必须以特定状态结束才能使串行接受.另一方面,人们可能会变得更便宜并且更多地了解加密方法以确保这一部分的安全性.因此,使攻击者试图修补可执行文件足够困难并不难.
但是,更难以保护二进制文件.让我们假设一个完全安全的串行验证,不能以某种方式逆转(当然我知道它可以颠倒,毫无疑问,你从你尝试破解的二进制文件中删除部分,并在它接受之前抛出随机序列).我们如何防止攻击者只是覆盖二进制文件中的跳转以使我们的二进制文件接受任何内容?
我一直在搜索这个主题,但大多数结果都是二进制安全性,自我验证二进制文件等等,最终会出现在试图阻止使用受损二进制文件攻击操作系统的文章中.通过签署某些二进制文件并使用内核验证这些签名.
我的想法目前包括:
检查二进制中的显式位置是否为跳转.
校验和二进制的部分,并比较在运行时计算的校验和.
对代码中的函数进行正负运行时检查.对串行验证有副作用.:)
您是否能够想出更多方法来惹恼可能的攻击者?(当然,你不能永远地把他带走,有些时候,所有的检查都会被打破,除非你设法通过在程序本身中为程序嵌入正确的校验和来打破校验和生成器,呵呵)
你正在进入"反转技术".这基本上是一门艺术.更糟糕的是,即使你踩到新手,也有olly和IDA Pro的"反反转插件",他们可以下载并绕过你的大部分对策.
对策包括通过陷阱调试器API检测调试器,或检测"单步执行".您可以在检测到调试器中断后插入代码,继续运行,但在程序中稍后开始随机执行.这真的是一场猫捉老鼠的游戏,而破解者则占据了重要的优势.
查看... http://www.openrce.org/reference_library/anti_reversing - 其中一些内容.
http://www.amazon.com/Reversing-Secrets-Engineering-Eldad-Eilam/dp/0764574817/ - 这本书有一个非常好的反转信息和步骤通过技术.一般来说,如果你正在进行逆转,那么一个好的开始.