18

这是我们都必须在某个时候考虑的问题。

经过多年和许多方法之后,我倾向于总体上同意这样的说法:“对于任何数百人使用的受保护软件,您都可以找到破解版。到目前为止,每个保护方案都可以被篡改。” 您的雇主是否强制使用反盗版软件?

此外,每次我发布有关此主题的信息时,都会有人提醒我;“首先,无论你采用什么样的保护措施,一个真正敬业的饼干最终都会通过所有的保护屏障。” 对于单个开发人员来说,什么是最物有所值的 c# 代码保护

因此,尽管有这两个广泛正确的免责声明,让我们谈谈“保护”!

我仍然觉得对于不太可能吸引熟练破解者的时间和注意力的小型应用程序,保护是一项值得的练习。

很明显,无论您做什么,如果破解者可以通过修补应用程序来切换 IF 语句 (jmp) 的结果,那么世界上所有的密码和加密狗都无济于事。

所以我的方法是使用以下产品通过虚拟化混淆代码: http ://www.oreans.com/codevirtualizer.php 我对这个产品非常满意。据我所知,它从未被击败过。我什至可以用 PEcompact 压缩可执行文件还有其他人有这方面的经验吗?

除了 EXEcryptor 的问题之外什么都没有 http://www.strongbit.com/news.asp 即使该网站使用起来也很头疼。编译的应用程序在执行任何 WMI 调用时都会崩溃。

这种方法允许您使用混淆来包围较小的代码部分,从而保护安全检查等。

我使用在线授权方法,因为应用程序需要定期从服务器获取数据,因此用户长时间离线使用它是没有意义的。根据定义,该应用程序在这一点上毫无价值,即使它已被破解。

所以一个简单的加密握手就足够了。我只是偶尔在混淆保护中检查它。如果用户在另一台机器上安装应用程序,则在启动时会上传新 ID,服务器会禁用旧 ID 并返回新授权。

我还使用已编译应用程序的哈希值,并在启动时检查它是否有任何更改,然后从应用程序内将应用程序作为文件(带有读取锁)打开,以防止任何人在启动后更改它。

由于所有静态字符串在 .exe 文件中都清晰可见,因此我尝试使用通用的错误消息等。您不会在任何地方找到字符串“授权失败”。

为了防止内存转储,我使用了一种简单的文本混淆技术(例如 XOR 每个字符)这使得内存中的纯文本数据更难与变量等区分开来。

当然,对于任何真正敏感的数据都有 AES。我喜欢文本的计数器模式,因为这不会导致重复序列显示底层数据(如一系列空白)。

但是使用所有这些技术,如果可以从内存中转储密钥或初始化向量,或者绕过 IF 语句,那么一切都被浪费了。

我倾向于使用 switch 语句而不是条件语句。然后我创建了第二个函数,它基本上是一个死胡同,而不是实际执行所需任务的函数。

另一个想法是编写添加了变量的指针。变量是授权的结果(通常为零)。这将不可避免地在某个时候导致 GPF。我只在一些较低级别的授权失败后才将其用作最后的手段,否则真正的用户可能会遇到它。然后,您的软件的声誉就会降低。

你使用什么技术?

(这不是一个讨论实现某事的优点的线程。它是为那些决定做某事的人设计的)

4

7 回答 7

12

我不同意 xsl。

我们保护我们的代码,不是因为我们想保护我们的收入——我们接受那些如果没有许可证就使用的人可能永远不会为此付费。

相反,我们这样做是为了保护客户对我们软件的投资。我们相信,使用我们的软件使他们在市场上更具竞争力,并且如果其他公司无需付费就可以使用它,他们就有了不公平的优势——即,他们在没有许可成本开销的情况下变得具有竞争力。

我们非常小心地确保保护 - 这是自产的 - 对有效用户尽可能不显眼,为此,我们永远不会考虑“购买”可能影响这一点的现成解决方案。

于 2008-12-05T12:21:13.283 回答
12

你不需要几百个用户来破解你的软件。我对我的共享软件被破解了这么多次感到恼火,所以作为一个实验,我创建了一个名为 Magic Textbox 的程序(它只是一个带有文本框的表单)并将其发布到共享软件站点(它有自己的 PAD 文件和所有内容) )。一天后,Magic Textbox 的破解版面世。

这段经历让我几乎放弃了尝试用除了基本的复制保护之外的任何东西来保护我的软件。

于 2008-12-05T14:07:40.620 回答
9

我个人使用这里讨论的代码技术。这些技巧的好处是给盗版者带来不便,而不会让您的合法最终用户的生活更加困难

但更有趣的问题不是“什么”,而是“为什么”。在软件供应商开始此类练习之前,构建威胁模型非常重要。例如,低价 B2C 游戏的威胁与高价值 B2B 应用程序的威胁完全不同。

Patrick Mackenzie 有一篇很好的文章,他在其中讨论了一些威胁,包括对 4 种潜在客户的分析。我建议在选择保护您的业务模型之前对您自己的应用程序进行此威胁分析。

于 2008-12-05T12:08:53.650 回答
7

我已经在自己之前实现了硬件键控(加密狗),所以我对这些问题并不完全陌生。事实上,我已经考虑了很多。我不同意任何违反版权法的人,就像你的饼干所做的那样。任何不想合法获取您的软件副本的人都应该这样做。我自己从不侵犯软件版权。话虽如此...

我真的非常不喜欢这里使用的“保护”这个词。你唯一想要保护的是你的控制权。你没有保护软件。无论哪种方式,该软件都很好,您的用户也一样。

阻止人们复制和共享您的软件是如此邪恶的 PITA 的原因是阻止此类活动是不自然的。计算机的整个概念围绕着复制数据,想要分享有用的东西是简单的人性。如果你真的坚持,你可以与这些事实作斗争,但这将是一场终生的斗争。上帝并没有让人类有任何不同,我也不会买一台不能复制东西的电脑。也许找到一些与计算机和人一起工作的方法会更好,而不是一直与他们对抗?

我和大多数专业软件开发人员一样,受雇于一家公司,该公司需要开发软件以便它能够开展业务,而不是让它能够拥有人为稀缺的“软件产品”来“出售”给用户。如果我写了一些通常有用的东西(这里不被认为是“竞争优势”),我们可以将它作为自由软件发布。不需要“保护”。

于 2008-12-05T15:08:06.237 回答
4

从一些链接:

我试图解释的概念就是我所说的“裂缝传播”。您的应用程序是否存在破解(或注册机,或盗版序列,或其他)并不重要。重要的是有多少人可以访问破解。

在哪里/何时检查序列号:我在启动时检查一次。很多人说“在各种地方检查”,以便通过剥离检查使某人更难破解。如果您想对破解者特别讨厌,请使用内联代码检查各种地方(即不要将其全部外部化到 SerialNumberVerifier.class 中),如果可能的话,使其成为多线程并且在失败时难以识别, 也。但这只是让破解变得更加困难,并非不可能,记住你的目标通常不是打败破解者。打败饼干不会让你赚到可观的钱。在大多数情况下,您只需要击败临时用户,而临时用户无权访问调试器,也不知道如何使用调试器。

如果你要打电话回家,你应该用他们的用户信息打电话回家并接受序列号作为服务器脚本的输出,而不是用序列号打电话回家并接受布尔值等作为输出。即您应该进行密钥注入,而不是密钥验证。密钥验证最终必须在应用程序中进行,这就是为什么公钥加密是最好的方法。原因是 Internet 连接也掌握在攻击者手中 :) 如果您的软件只是希望从 Internet 上读取布尔值,那么您是一个主机文件更改,远离一次中断、无处不在的漏洞利用。

不要做“有趣的”或“具有挑战性的”保护。许多饼干只为智力挑战而努力。使您的保护难以破解,但尽可能无聊。

有一些裂缝是寻找字节模式寻找修补的地方。它们通常不会被重新编译打败,但是如果你的 .EXE 被打包(通过 ASProtect、Armadillo 等),这些破解必须首先解压 .EXE。将能够使用诸如 SoftICE 之类的汇编级调试器手动解压缩 EXE,但无法创建自动解压缩 .EXE 的工具(以在之后应用字节补丁)。

于 2008-12-06T16:29:00.583 回答
3

我过去使用过 .NET Reactor,效果很好 - http://www.eziriz.com/

我喜欢这个产品的地方是它不需要你混淆代码来获得很好的保护。

于 2008-12-05T14:23:17.170 回答
3

xsl,这是一个非常狭窄的观点,其中包含许多内置假设。

在我看来,任何依赖于从您控制的服务器提供某些东西的应用程序都应该能够很好地确定我们谁拥有有效帐户!

我也相信定期更新(意味着新编译的应用程序在不同位置的代码)将使破解的版本很快过时。如果您的应用程序与服务器通信,那么每周启动一个辅助进程来替换主可执行文件是小菜一碟。

所以是的,没有什么是不可破解的,但是通过一些巧妙的内在设计,它成为一个有争议的问题。唯一重要的因素是饼干愿意花多少时间在上面,以及您的潜在客户愿意付出多少努力来尝试每周甚至每天寻找他们努力的产品!

我怀疑如果您的应用程序提供了有用的有价值的功能,那么他们将愿意为此付出合理的代价。否则,竞争产品将进入市场,您的问题就会自行解决。

于 2008-12-06T15:41:50.163 回答