17

我打算制作一些软件在互联网上销售。我以前只创建过开源,所以我真的不知道如何保护它不被破解并以warez的形式分发。记住我知道两个程序既没有破解也没有真正有用,我决定唯一或多或少可靠的方法可能如下所示:

  1. 连接到服务器并提供许可信息和某种硬件摘要信息
  2. 如果一切正常,服务器会返回绑定到该特定 PC 的程序的一些关键缺失部分以及 2 天的使用限制
  3. 关键的东西没有保存到硬盘,所以每次程序启动时都会下载,如果程序运行超过2天,数据会重新下载
  4. 如果从不同的计算机使用相同的信息,请暂停客户帐户

你怎么看待这件事?这似乎有点限制,但我最好先减少销售量,然后最终免费下载我宝贵的杀手级应用程序。无论如何,首先我需要一些基本的理论/教程/指南,以确保用户在付费后只使用某个 Java 应用程序,所以请提出一些建议。

谢谢

4

14 回答 14

16

我在一家销售受保护的Java 软件的公司工作。

我不会评论用户认证的方案,但我可以评论在线许可证检查。

不要让它甚至“工作两天”:这就是我盗版大多数软件的方式......虚拟机设置“及时”并在外部设置防火墙,使其不再“打电话回家”(即:只允许它与服务器联系一次,获取试用密钥),总是从新安装软件和宾果游戏的点重新映像,30 天试用(或两天试用)已成为终身试用。我为什么要这样做?当然要学习如何更好地保护我们的应用程序;)(好吧,好吧,我这样做也只是为了好玩)

我们在商业 Java 软件中所做的是在每次启动时检查许可证。

我们有成百上千的客户,从来没有人抱怨过。不止一次。我们在每次运行时生成一个唯一的类,每次运行时都不同,这既取决于在客户端启动时的独特之处,也取决于在服务器端生成的东西。

除了让应用程序在每次启动时与您的服务器联系之外,这也是收集分析数据的好方法:下载试用比率、每次试用的 nb 平均启动次数等。而且在每个网页上都有一个 Urchin/Google JavaScript 跟踪器并不令人讨厌很讨厌。

只需让人们清楚您的软件执行在线许可证检查:我们有一个巨大的复选框打开或关闭,上面写着:“在线许可证验证:OK/Failed”。就是这样。人们知道有一张支票。如果他们不喜欢它,他们就会去使用劣质的竞争对手产品,生活是美好的。

人们习惯于生活在一个有线的世界中。

由于 Internet 连接中断,您多久无法访问 GMail?您多久无法访问 Facebook 或 SO,因为您的 Internet 连接中断?

要点是:根据服务器端进行尽可能多的计算:

  • 许可证检查
  • 保存用户偏好
  • 备份您的应用程序生成的数据
  • 等等

没有人会抱怨。您将有 0.1% 的用户抱怨,无论如何您不希望这些用户:他们会抱怨其他事情并在网上发布有关您的应用程序的负面反馈。您最好让他们根本不使用您的软件并抱怨它需要始终在线的 Internet 连接(这是您的目标人群的 99.99%,因此他们不会关心抱怨),而不是让他们实际使用该应用程序,并抱怨与您的应用程序相关的其他事情。

关于反编译,.class 通常可以反编译回 .java,除非您使用的代码流混淆器可以生成有效的字节码,但无法从 .java 文件生成(因此无法取回有效的 .java 文件)。

字符串混淆器有助于使其更难弄清楚。

源代码混淆器有助于使其更难弄清楚。

像免费的 Proguard 这样的字节码混淆器使得更难(并产生更快的代码,在移动世界中尤其明显)弄清楚。

如果您只发布 Windows/Linux,那么您可以使用 Java 到本机的转换器,例如 Excelsior Jet(对于初创公司来说不是免费的而且有点贵,但它会生成本机代码,您根本无法从中找到 .java 文件)。

作为一个有趣的旁注,您会看到有人试图弄乱您的在线服务器......在大约 30 位 beta 测试人员中,我们已经有人(我们知道试用的一部分)试图盗版我们的在线服务器。

于 2010-03-17T23:30:36.523 回答
11

很抱歉拒绝了你,但首先你应该知道你想要构建什么;那么您应该证明您的想法不仅有效,而且还受到用户的喜爱,以至于他们想要盗版它。第三,您必须确保您为使其“安全”而投入的时间实际上值得应用程序的价值。

如果你以 1 美元的价格出售它,而你只卖了 10 份,并且你花了 100 个小时来确保它的安全,你算一算,告诉我你的时间是否值得那点钱。

这里的关键信息是:一切都可以被破解或复制。最后,有比我们聪明得多的人在做这件事(iPhone破解、数字电视、游戏等),但没有人找到灵丹妙药。您唯一能做的就是让您的应用程序更难破解(通常以牺牲可用性、易于安装以及在某些使用场景中偷工减料为代价)。问问自己是否值得麻烦,这始终是一个很好的起点。

于 2010-03-17T23:11:58.133 回答
6

不要打扰。

几十年来,游戏行业一直在与盗版作斗争。具有中央服务器的在线多人游戏通常需要订阅才能玩。该模型对盗版具有相当的抵抗力。尽管在 DRM 上进行了无数次尝试,但几乎所有其他游戏都被严重盗版。

您的应用程序将被破解和盗版,无论您使用什么语言编写它以及使用什么工具来防止它。如果您的 DRM 确实有效,那么盗版它的人仍然不会购买它。此外,合法用户会更喜欢没有侵入式 DRM 的其他产品。如果没有竞争产品,而你的产品有市场可言,那么就会有人创造一个。

于 2010-03-17T23:14:02.427 回答
3

除非您的应用程序是专门基于 Web 的,否则您的用户会发现需要 Internet 连接才能访问产品非常麻烦。您的建议将起作用,除非它被破坏,就像所有 DRM 系统一样。我理解想要保护您的知识产权,但以许多公司为例,这些系统通常会被破坏,或者产品因此而变得更糟。

于 2010-03-17T22:48:06.853 回答
2

我真的不知道如何保护它不被破解并以warez的形式分发。

首先,如果这是一个问题,您最好选择 Java 以外的语言。这就是为什么 C++ 在商业应用程序世界中仍然存在并且很好的原因。除非您打算对本机 exe 使用实际的 Java 编译器,否则出于 IP 保护的原因,我会重新考虑 Java。

就此而言,即使是 C++ 也不是不受破解的影响,但 IP 保护与破解是两个独立的重要问题。

于 2010-03-17T22:50:51.657 回答
1

这是一个非常棘手的任务,尤其是在虚拟机中运行的东西。我会说你可能正在朝着正确的方向思考。混淆它以使其相当难以修改可能会阻止人们绕过内置的许可证检查。

然而,最终,如果你的应用程序是独立的,它总是可以破解的。如果您可以构建它以便它使用您提供的服务,那么您可能可以命令它的使用。

于 2010-03-17T22:48:40.923 回答
1

我在您的示例中看到了一个特定的弱点,除了大多数人已经发表的评论之外,DRM 很难(不可能)实施并且通常很容易规避。

在你的第二点:

如果一切正常,服务器会返回绑定到该特定 PC 的程序的一些关键缺失部分以及 2 天的使用限制

这 2(或 X)天的限制很可能非常容易规避,只需几分钟即可找到并修补(破解)。

如果你真的想要一个 DRM 模型,唯一合理的方法是将应用程序的重要部分作为 Web 服务,并需要用户的持续连接。

在您尝试任何这些之前,请务必阅读Exploiting Software并且在尝试执行 DRM 之前您会三思而后行。

于 2010-03-17T23:15:21.760 回答
1

套用 Jeff Atwood 先生的话说,最好让您的客户更容易向您付款,而不是破解您的应用程序。换句话说,我认为你正在攻击错误的问题。让购买您的产品变得非常容易,然后您的客户就不会觉得他们需要努力破解它。

于 2010-03-17T23:15:34.567 回答
1

在决定许可计划之前,我会先看看游戏孢子的强烈反对。他们把它打电话回家,只允许安装这么多,等等等等。Spore 应该是他们的“杀手级应用”,仅仅因为许可,它真的很难过。您说与看到免费使用它的人相比,您愿意获得更少的销售额,但您可能要小心您的要求。我真的很期待孢子(我的孩子也是),但由于 DRM 计划,我从来没有买过它。

无论你做什么,它都会在很短的时间内被破解,特别是如果这个程序真的很有价值的话。

如果您确实采用许可方案,请使其简单且可用,这样您就不会惩罚那些实际为您的软件付费的人。另外,我会避免任何电话回家式检查,这样即使您不想在 3 年后继续为该域付费,您的客户也可以继续使用该软件。

于 2010-03-17T23:16:30.587 回答
1

我认为,鉴于上下文,目前最有效的保护形式是有限的演示/许可密钥方法:它会给人们时间来爱上您的应用程序,以便他们愿意为此付费,同时防止随意复制。

一旦您知道您的应用程序大获成功,并且破解者可能会吸走您可能收入的很大一部分,那么您仍然可以添加额外的检查。

要考虑的另一件事是您的应用程序将在哪里使用:如果人们将其放在笔记本电脑上以便在旅途中使用,那么网络连接不是给定的。

于 2010-03-17T23:43:37.647 回答
0

这是我听说过的最严苛的 DRM,您的用户会讨厌它。

另外,请记住,由于语言的性质,那里有很多好的 Java 反编译器,并且足够坚定的人可以找到处理您的 DRM 的程序区域并绕过/禁用它然后重新编译它根据这个重新编译将是不现实的)......所以你甚至不得不竭尽全力实现你的代码尽可能复杂,以防止黑客成功。(这可以使用他们可能拥有的那些代码混淆工具之一来完成。)

于 2010-03-17T23:01:57.683 回答
0

只要它是互联网应用程序,您就可以以这种方式对其进行限制。如果没有破解程序,除了重放攻击外,这将可以正常工作。

例如,如果我可以捕获流向您服务器的流量,并且每次只需将其重播到我的程序中,我仍然可以。例如,我可以创建自己的“网络服务器”并确保程序而不是您的服务器命中它。

于 2010-03-17T23:46:43.900 回答
0

您应该阅读 Collberg 和 Nagra 的“Surreptitious Software”。这本书真的很好帮助你理解软件保护机制是如何工作的(比如代码混淆、水印、胎记等等……)。

正如 lorenzog 所说,不存在完全的安全性,软件安全性就像软件供应商和盗版者之间不断进行的竞赛。

您应该使用廉价的混淆转换(因此它们产生的开销不会破坏性能)来防止尽可能多的攻击者(记住他们中的大多数是脚本小子)“窃取”您的杀手算法或任何秘密数据。

如果您愿意进一步提高安全性,您可以为您的算法添加胎记并为您的副本添加水印,以便找出谁泄露了您的创作。但即使你这样做了,这并不意味着你的软件是 100% 安全的。再加上您花在添加这些机制上的时间可能不值得。

这些概念在我之前提到的这本书中得到了很好的解释,值得一读。

于 2010-03-17T23:56:25.483 回答
0

如果我有足够的声望点,我会否决这个问题。出于多种原因,商业软件保护是浪费时间、金钱和精力。专注于制作一款值得购买的软件。如果您的软件足够流行以维持盗版的广泛播种,那么您可能在那个时候已经足够成功,您甚至不必担心盗版。无论如何,破解者破解软件保护主要是为了好玩。你的保护越强,它带来的挑战就越好,他们就越想破解它。您的最大努力将花费您数千美元,花费数月,并且仅在几天内就被破解。

于 2010-03-29T01:26:24.010 回答