我首先要说我知道不可能阻止您的软件进行逆向工程。
但是,当我查看crackmes.de时,有难度等级为8 和9 的crackmes(从1 到10)。这些crackmes被天才大脑破解,他们写了一个关于如何破解它的教程。有时,此类教程长达 13 页以上!
当我尝试制作一个crackme时,他们会在10分钟内破解它。随后是一个 20 行的“如何破解”教程。
所以问题是:
- 怎样才能做出比较好的抗裂保护。
- 我应该使用哪些技术?
- 我怎样才能学会它?
- ...
我首先要说我知道不可能阻止您的软件进行逆向工程。
但是,当我查看crackmes.de时,有难度等级为8 和9 的crackmes(从1 到10)。这些crackmes被天才大脑破解,他们写了一个关于如何破解它的教程。有时,此类教程长达 13 页以上!
当我尝试制作一个crackme时,他们会在10分钟内破解它。随后是一个 20 行的“如何破解”教程。
所以问题是:
免责声明:我为软件保护工具供应商 ( Wibu-Systems ) 工作。
自 1989 年以来,我们所做的和我们所做的一切都是停止破解。因此,我们彻底了解 SW 是如何被破解的以及如何避免它。底线:只有使用正确实施的安全硬件加密狗,您才能保证不会破解。
大多数强大的反破解依赖于加密(对称或公钥)。加密可能非常强大,但除非密钥存储/生成同样强大,否则它可能会受到攻击。除非您知道自己在做什么,否则即使使用良好的加密,许多其他方法也是可能的。纯软件解决方案必须将密钥存储在可访问的位置,容易找到或容易受到中间人攻击。存储在 Web 服务器上的密钥也是如此。即使有良好的加密和安全的密钥存储,除非你能检测到调试器,否则破解者只能拍摄内存快照并从中构建一个 exe。因此,您永远不需要在任何时候完全解密内存,并拥有一些用于调试器检测的代码。混淆、死代码等不会让它们放慢很长时间,因为它们不会 t 从头开始并通过您的代码来破解。他们比这聪明得多。只要看看网上的一些破解视频,看看如何找到安全检测代码并从那里破解。
简短的无耻宣传:我们的硬件系统从未被破解过。我们有一个主要客户仅将其用于反逆向工程。所以我们知道这是可以做到的。
像 Java 和 C# 这样的语言太高级了,没有提供任何有效的结构来防止破解。您可以通过混淆来让脚本小子难以接受,但如果您的产品值得,它无论如何都会被破坏。
我会稍微转过头来想想:
(1) 采取简单的(ish) 措施,使您的程序不易被破解,例如在Java 中:
然而,你付出的努力越多,黑客就越会把它视为“挑战”。你真的只是想确保,比如说,一个普通的计算机科学专业一年级学生不能在几个小时内破解你的程序。
(2) 放置更微妙的版权/作者身份标记(例如图像中的元数据,可能会巧妙地嵌入一个弹出窗口,该弹出窗口将在 1 年后出现在所有未与您的服务器连接和验证的副本中......)黑客可能不会打扰寻找/禁用,因为他们被黑客入侵的程序按原样“工作”。
(3) 只需在您实际上没有机会从中获利的国家/地区赠送您的程序,不要太担心它——如果有的话,这是一种病毒式营销。请记住,在许多国家/地区,政府/执法部门公开容忍我们在英国/美国看到的对我们珍贵物品的“盗版”;不要将您的商业模式建立在不存在的版权执法之上。
我有一个非常受欢迎的应用程序(我不会在这里具体说明,当然是为了避免破解者的好奇心)并且过去曾多次遇到破解版本,这确实让我很头疼。
经过数月与大量反破解技术的斗争,自 2009 年以来,我可以建立一种被证明有效的方法,至少在我的情况下:我的应用程序从那时起就没有被破解过。
我的方法包括使用三种实现的组合:
1 - 源代码中的大量检查(大小、CRC、日期等:发挥您的创造力。例如,如果我的应用程序检测到正在执行 OllyDbg 等工具,它将强制机器关闭)
2 - CodeVirtualizer 源代码中敏感函数的虚拟化
3 - EXE加密
这些都不是真正有效的:调试器可以通过检查,可以逆转虚拟化,并且可以解密 EXE 加密。
但是当你完全使用它们时,它们会给任何饼干造成很大的痛苦。
虽然它并不完美:如此多的检查会使应用程序变慢,并且 EXE 加密可能会导致某些防病毒软件出现误报。
即便如此,也没有什么比不被破解的 ;)
祝你好运。
我个人是服务器端检查的粉丝。它可以像每次运行时对应用程序或用户进行身份验证一样简单。但是,这很容易破解。或者将部分代码放到服务器端,这将需要更多的工作。
但是,您的程序将需要互联网连接,并且您将有服务器费用。但只有这样才能让它得到相对较好的保护。任何独立的应用程序都会相对较快地被破解。
更多的逻辑你将转移到服务器端更难破解它会得到。但如果值得的话,它会的。即使像暴雪这样的大公司也无法阻止他们的服务器端被逆向工程。
我的目的如下:
在 home 中随机创建一个名为 KEY1 的密钥,其中包含 N 个字节。
向用户出售软件的“许可证号”。记下他/她的姓名和姓氏,并告诉他/她这些数据是激活软件所必需的,也是一个互联网连接。
在接下来的 24 小时内将“许可证号”、姓名和姓氏上传到您的服务器,还有 KEY3 = (KEY1 XOR hash_N_bytes(License_number, name and surname) )
安装程序要求提供“Licese_number”以及姓名和姓氏,然后将这些数据发送到服务器并下载名为“KEY3”的密钥(如果这些数据对应于有效销售)。
然后安装程序使 KEY1 = KEY3 XOR hash_N_bytes(License_number, name and surname)
安装程序使用 16 位的“哈希”检查 KEY1。应用程序使用 KEY1 密钥加密。然后它使用密钥解密应用程序并准备就绪。
安装程序和应用程序都必须进行 CRC 内容检查。
两者都可以检查是否正在调试。
两者都可能在执行期间加密了部分代码。
你觉得这个方法怎么样?