制作商业Java软件(DRM)

时间:2010-03-17 22:40:24

标签: java reverse-engineering protection commerce

我打算制作一些可以通过互联网销售的软件。我之前只创建过开源,所以我真的不知道如何保护它免受破解和分发为warez。请记住,我知道两个程序既没有破解或没有真正有用,我认为唯一或多或少可靠的方式可能是这样的:

  1. 连接到服务器并提供许可信息和某种硬件摘要信息
  2. 如果一切正常,服务器会返回绑定到某个电脑的程序的一些关键缺失部分以及比如2天的使用限制
  3. 关键的东西没有保存到硬盘,因此每次程序启动时都会下载,如果程序运行超过2天,数据会再次下载
  4. 如果从不同的计算机使用相同的信息,请暂停客户帐户
  5. 您如何看待这个?这似乎有点限制,但我最好先减少销售,然后最终免费下载我的宝贝杀手级应用程序。无论如何,首先我需要一些基本的理论/教程/指南,关于如何确保用户只使用某个Java应用程序,如果他已付费,所以请建议一些。

    由于

14 个答案:

答案 0 :(得分:16)

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

我不会对用户身份验证方案发表评论,但我可以对在线许可证检查发表评论。

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

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

我们有数以百计的客户,而且没有人对此感到不满。不止一次。我们在每次运行时都会生成一个唯一的类,每次运行都会有不同的类,这取决于客户端启动时所特有的内容以及服务器端生成的内容。

除了让应用程序在每次发布时都与您的服务器联系,这是收集分析的一种很好的方式:下载到试用率,每次试用的平均启动次数等等。它不仅仅是一个Urchin / Google JavaScript跟踪器的讨厌在每个网页上都很讨厌。

简单地向人们说明您的软件执行在线许可证检查:我们打开或关闭了一个巨大的复选框:“在线许可证验证:确定/失败”。就是这样。人们知道有一张支票。如果他们不喜欢它,他们会使用劣质竞争产品,生活也很好。

人们习惯于生活在有线世界。

访问GMail的频率是多少?因为您的互联网连接已关闭?您是否经常访问FaceBook或SO,因为您的Internet连接已关闭?

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

  • 许可证检查
  • 保存用户首选项
  • 备份您的应用生成的数据

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

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

字符串混淆器有助于使其更难理解。

源代码混淆器有助于弄清楚。

像免费的Proguard这样的Bytecode混淆器让它变得更难(并产生更快的代码,特别是在移动世界中引人注目)。

如果您只发布Windows / Linux,那么您可以使用像Excelsior Jet这样的Java到本机转换器(对于初创公司而言,这种转换器不是免费且有点贵,但是它会生成您只是不能找回.java文件。)

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

答案 1 :(得分:10)

我很抱歉让你失望,但首先你应该知道你想要建立什么;那么你应该证明你的想法不仅有效,而且还被用户所喜爱,以至于他们想要盗版它。第三,你必须确保你投入使其“安全”的时间实际上值得申请的价值。

如果你以1美元的价格出售它,而你只卖了10份,并且你花了100个小时使它变得安全,你就算数学并告诉我你的时间是否值得花钱。

这里的带回家信息是:一切都可以被破解或复制。最后有比我们更聪明的人(iPhone破解,数字电视,游戏等),没有人找到银弹。您唯一能做的就是让更难来破解您的应用程序(通常以可用性,易于安装和某些使用场景的偷工减料为代价)。问问自己是否值得麻烦,这始终是一个很好的起点。

答案 2 :(得分:6)

不要打扰。

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

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

答案 3 :(得分:3)

除非您的应用程序是专门基于网络的,否则您的用户会发现要求互联网连接以便他们访问该产品是一个巨大的麻烦。您所建议的内容将起作用,除非它像所有DRM系统一样被破坏。我理解想要保护您的知识产权,但以许多公司为例,这些系统通常会被破坏,或者产品因此而更糟糕。

答案 4 :(得分:2)

  

我真的不知道怎么做   保护它免受破裂   以warez分发。

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

就此而言,即使是C ++也不是不会破解,但是知识产权保护与破解是两个独立的重要问题。

答案 5 :(得分:1)

这是一个非常棘手的任务,尤其是在VM中运行的某些东西。 我会说你可能正在思考正确的方向。对其进行模糊处理以使其难以修改可能会阻止人们绕过内置的许可证检查。

但是,最终,如果您的应用程序是自包含的,它将始终是可破解的。如果您可以构建它以便它使用您提供的服务,那么您可能会命令它使用。

答案 6 :(得分:1)

我看到你的例子中存在一个特定的弱点,除了大多数人已经提到的DRM很难(不可能)实现的评论,并且通常很容易规避。

在你的第二点:

  

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

这2(或X)天的限制很可能是非常简单的规避,这只需要几分钟就可以找到并修补(破解)。

如果您真的想拥有DRM模型,唯一合理的方法是将应用程序的重要部分作为Web服务放置,并且需要用户不断连接。

在尝试任何此操作之前,请务必阅读Exploiting Software,在尝试执行DRM之前,您需要三思。

答案 7 :(得分:1)

用Jeff Atwood先生的话来说,最好是让客户付钱给你,而不是破解你的应用。换句话说,我认为你正在攻击错误的问题。购买你的产品真的很容易,然后你的客户不会觉得他们需要努力破解它。

答案 8 :(得分:1)

在决定授权计划之前,我会看一下Spore游戏的反对意见。他们把它打电话回家,只允许那么多装置等等。孢子应该是他们的“杀手级应用程序”,它真的很难,仅仅因为许可。你说你愿意减少销售量而不是看到人们免费使用它,但你可能要小心你所要求的。我真的很期待孢子(我的孩子也是如此)但是我从来没有因为DRM计划而购买它。

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

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

答案 9 :(得分:1)

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

一旦你知道你的应用程序很大,并且那些破解者可以吸收大部分可能的收入,那么你仍然可以添加额外的支票。

另一件需要考虑的事情是你的应用程序将被使用的地方:如果人们会在他们的笔记本电脑上随意使用它,那么网络连接就不是特定的。

答案 10 :(得分:0)

这是我听过的一些最严厉的DRM,你的用户会讨厌它。

另外,请记住,由于语言的性质,有很多优秀的Java反编译器,而且有足够的人确定可以找到与DRM相关的程序区域并绕过/禁用它然后重新编译它according to this重新编译是不现实的......所以你甚至不得不尽可能地将代码实现为复杂的,以防止黑客获得成功。 (可以使用其中一种代码混淆工具来完成它们。)

答案 11 :(得分:0)

只要它是Internet应用程序,您就可以以这种方式限制它。如果没有破解程序,除了重放攻击之外,这样可以正常工作。

例如,如果我可以捕获到达您服务器的流量,并且每次只重放回我的程序,我仍然很好。例如,我可以创建自己的“Web服务器”并确保程序命中而不是服务器。

答案 12 :(得分:0)

你应该阅读Collberg和Nagra的“Surreptitious Software”。本书非常适合帮助您了解软件保护机制的工作原理(例如代码混淆,水印,胎记等)。

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

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

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

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

答案 13 :(得分:0)

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