这是我们在某些时候都必须考虑的问题。
经过多年和许多方法,我倾向于同意这个问题: “对于超过几百人使用的任何受保护软件,您可以找到破解版本。到目前为止,每种保护方案都可能被篡改。” Does your employer enforce the use of anti-piracy software?
此外,每次我发布这个主题时,有人会提醒我; “首先,无论你采用什么样的保护措施,真正专注的饼干最终都会通过所有的保护屏障。” What's the best value for money c# code protection for a single developer
因此,不要承认这两个广泛的免责声明,让我们谈谈“保护”!
我仍然觉得,对于那些不太可能提高熟练破解者时间和注意力的小型应用程序,保护是值得的。
很明显,无论你做什么,如果破解者可以通过修补应用程序来切换IF语句(jmp)的结果,那么世界上所有的密码和加密狗都无济于事。
所以我的方法是使用以下产品对虚拟化代码进行混淆: http://www.oreans.com/codevirtualizer.php 我对这个产品非常满意。据我所知,它已经被打败了。 我甚至可以使用PEcompact压缩可执行文件 有没有其他人有经验呢?
只有EXEcryptor的问题 http://www.strongbit.com/news.asp 即使是网站也很难用。 在进行任何WMI调用时,编译的应用程序会崩溃。
这种方法允许您通过混淆来包围较小的代码段,从而保护安全检查等。
我使用在线授权方法,因为应用程序需要定期从服务器获取数据,因此用户无需长时间离线使用它。根据定义,该应用程序在这一点上毫无价值,即使它被破解了。
所以简单的加密握手非常好。我只是偶然在混淆保护中检查它。如果用户在另一台计算机上安装该应用程序,则会在启动时上载新ID,并且服务器会禁用旧ID并返回新的授权。
我还使用已编译应用程序的哈希值并在启动时检查它以查看是否有一个位已更改,然后从应用程序中打开应用程序作为文件(带有读取锁定)以防止任何人在启动后更改它
由于所有静态字符串在.exe文件中都清晰可见,因此我尝试使用错误消息等通用字符串。您无法在任何地方找到字符串“授权失败”。
为了防止内存转储,我使用简单的文本混淆技术(比如每个字符的XOR)这使得内存中的纯文本数据更难以与变量区分开来等等。
当然,对于任何非常敏感的数据,都有AES。我喜欢文本的计数器模式,因为这不会导致重复序列显示基础数据,如白色空间序列。
但是使用所有这些技术,如果Key或Initialization向量可以从内存中转储,或者IF语句被绕过,那么一切都会被浪费。
我倾向于使用switch语句而不是条件语句。然后我创建了一个基本上是死胡同的第二个函数,而不是实际执行所需任务的函数。
另一个想法是编写添加了变量的指针。变量是授权的结果(通常为零)。这将不可避免地在某个时候导致GPF。 在一些较低级别的授权失败之后,我只使用它作为最后的手段,否则真正的用户可能会遇到它。然后降低软件的声誉。
您使用什么技术?
(这不是讨论实现某些事情的优点的线索。它是为那些决定做某些事情的人设计的)
答案 0 :(得分:12)
我不同意xsl。
我们保护我们的代码,而不是因为我们想要保护我们的收入 - 我们接受那些在没有许可证的情况下使用的人可能永远不会为此付费。
相反,我们这样做是为了保护我们的客户在我们的软件中所做的投资。我们相信,使用我们的软件可以使他们在市场上更具竞争力,并且如果其他公司无需付费就能获得它,那么他们就有不公平的优势 - 即,他们在没有许可成本的情况下成为竞争对手。
我们非常谨慎地确保本地保护对有效用户尽可能不引人注目,为此我们绝不会考虑“购买”可能影响此问题的现成解决方案。
答案 1 :(得分:12)
您不需要几百个用户就可以破解您的软件。我厌倦了让我的共享软件破解了很多次,所以作为一个实验,我创建了一个名为Magic Textbox的程序(它只是一个带有文本框的表单)并将其发布到共享软件站点(它有自己的PAD文件和所有内容) )。一天后,可以使用破解版的Magic Textbox。
这种经历让我几乎放弃了尝试用基本的复制保护来保护我的软件。
答案 2 :(得分:9)
我个人使用代码技术discussed here。这些技巧的好处是不会给海盗带来不便,而不会让合法的最终用户感到更加困难
但更有趣的问题不是“什么”,而是“为什么”。在软件供应商开始进行此类练习之前,构建威胁模型非常重要。例如,低价B2C游戏的威胁与高价值B2B应用程序的威胁完全不同。
帕特里克·麦肯齐(Patrick Mackenzie)在discusses some of the threats撰写了一篇很好的文章,其中包括对4种潜在客户的分析。在选择保护您的商业模式之前,我建议您为自己的应用进行此威胁分析。
答案 3 :(得分:7)
我之前已经实现了硬件键控(加密狗),所以我并不完全不熟悉这些问题。事实上,我已经给了它很多想法。我不同意任何违反版权法的人,正如你的破解者所做的那样。任何不想合法获取软件副本的人都应该没有。我自己并没有侵犯软件版权。那就是说......
我真的非常不喜欢这里使用的“保护”这个词。您要保护的唯一内容是您的控件。您不保护软件。无论哪种方式,该软件都很好,与您的用户一样。
让人们不要复制和共享你的软件是如此邪恶的PITA的原因是防止这种活动是不自然的。计算机的整个概念围绕着复制数据,想要分享有用的东西是简单的人性。如果你真的坚持,你可以打击这些事实,但这将是一场终生的斗争。上帝并没有以不同的方式制造人类,我也买不到一台无法复制东西的电脑。也许最好找到一些方法与计算机和人一起工作,而不是一直与他们作斗争?
我和大多数专业软件开发人员一起,是一家需要开发软件以便能够开展业务的公司全职雇用的,而不是因为它可以拥有人工稀缺的“软件产品”来“销售”给用户。如果我写一些通常有用的东西(这里不被视为“竞争优势”),我们可以将其作为自由软件发布。不需要“保护”。
答案 4 :(得分:4)
从一些链接:
我试图解释的概念是我称之为“裂缝扩散”。对于您的应用程序存在破解(或keygen或盗版序列或其他)并不重要。重要的是有多少人可以获得破解。
检查序列号的位置/时间:我在启动时检查一次。很多人说“检查各种各样的地方”,通过剥离支票让人更难破解。如果你想对破解者特别讨厌,请使用内联代码检查所有类型的地方(即不要将其全部外部化为SerialNumberVerifier.class),如果可能的话,使其多线程并且在失败时难以识别也是。但这只是让裂缝变得更难,而不是不可能,并且记住你的目标通常不是打败破解者。打败饼干并不会让你赚到可观的金钱。在大多数情况下,您只需要打败临时用户,而临时用户无法访问调试器,也不知道如何使用调试器。
如果您要打电话回家,您应该使用他们的用户信息打电话回家并接受序列号作为服务器脚本的输出,而不是使用序列号打电话回家并接受布尔值等,作为输出。即您应该进行密钥注入,而不是密钥验证。密钥验证最终必须在应用程序内进行,这就是为什么公钥加密是最好的方法。原因是互联网连接也掌握在对手的手中:)如果您的软件只是希望从互联网上读取一个布尔值,那么您就是一个主机文件,从一次性破坏,无处不在的漏洞利用。 / p>
不要做出“有趣”或“具有挑战性”的保护。许多破解者仅仅为了智力挑战而破解。让你的保护很难破解,但尽可能无聊。
在搜索要修补的位置时,有一些裂缝会搜索字节模式。它们通常不会被重新编译打败,但是如果您的.EXE被打包(由ASProtect,Armadillo等),这些裂缝必须首先解压缩.EXE ..如果您使用好的打包器,如ASProtect,饼干将能够使用汇编级调试器(如SoftICE)手动解压缩EXE,但无法创建自动解压缩.EXE的工具(以后应用字节补丁)。
答案 5 :(得分:3)
xsl,这是一个非常狭隘的观点,有许多内置的假设。
对我来说,任何依赖于从您控制的服务器上提供内容的应用程序都应该能够很好地确定我们谁拥有有效帐户!
我也相信定期更新(意味着新编译的应用程序,代码位于不同位置)将使破解的vesrions快速过时。如果您的应用程序与服务器通信,则每周启动一个辅助进程来替换主要可执行文件是一件小事。
所以是的,没有什么是不可摧毁的,但是通过一些聪明的内在设计,它变得没有实际意义。唯一重要的因素是破解者愿意花多少时间,以及您的潜在客户愿意在每周甚至每天的基础上努力寻找他们的努力产品的努力!
我怀疑如果你的应用程序提供有用的有价值的功能,那么他们愿意为它支付合理的价格。如果没有,竞争产品将进入市场,您的问题就会自行解决。
答案 6 :(得分:2)
我过去使用过.NET Reactor效果不错 - http://www.eziriz.com/
我对此产品的喜爱之处在于它不需要您对代码进行模糊处理以获得相当好的保护。