【问题标题】:How to create a trial version of a Java program [closed]如何创建 Java 程序的试用版 [关闭]
【发布时间】:2011-02-15 16:44:26
【问题描述】:

我正在用 java 编写一个软件,我几乎完成了,我想知道我们如何创建一个试用版,例如可以使用 30 天,因为我会将它发送给一些公司

那么如何让它像共享软件或试用软件一样,我们也可以阻止对 jar 文件中的 .class 的访问吗?

谢谢

【问题讨论】:

    标签: java trial trialware shareware


    【解决方案1】:

    我检查原子时间服务器在代码开头发送给我的日期。 然后,我将该日期与特定日期进行比较。如果原子时间更短,则 System.exit(0)。

    public static GregorianCalendar getAtomicTime() throws IOException {
        BufferedReader in = null;
    
        try {
            URLConnection conn = new URL("http://64.90.182.55:13").openConnection();
            GregorianCalendar calendar = new GregorianCalendar();
            conn.setConnectTimeout(1000);
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    
            String atomicTime;
            while (true) {
                if ((atomicTime = in.readLine()).indexOf("*") > -1) {
                    break;
                }
            }
            //System.out.println("DEBUG : " + atomicTime);
            String[] fields = atomicTime.split(" ");
    
            String[] date = fields[1].split("-");
            calendar.set(Calendar.YEAR, 2000 + Integer.parseInt(date[0]));
            calendar.set(Calendar.MONTH, Integer.parseInt(date[1]) - 1);
            calendar.set(Calendar.DATE, Integer.parseInt(date[2]));
    
            // deals with the timezone and the daylight-saving-time
            TimeZone tz = TimeZone.getDefault();
            int gmt = (tz.getRawOffset() + tz.getDSTSavings()) / 3600000;
            //System.out.println("DEBUG : " + gmt);
    
            String[] time = fields[2].split(":");
            calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0]) + gmt);
            calendar.set(Calendar.MINUTE, Integer.parseInt(time[1]));
            calendar.set(Calendar.SECOND, Integer.parseInt(time[2]));
            return calendar;
        } catch (IOException e) {
            throw e;
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
    

    【讨论】:

    • 如果他们不在计算机上确定日期怎么办?你最终会给他们更多或更少的试验吗?甚至更糟糕的是:如果他们发现了这一点并手动更改了日期,这样他们就永远无法真正使用真实版本了。
    【解决方案2】:

    有一个名为 Rampart 的产品可以让您为您的 Java 应用程序制作试用版。只需几分钟,效果很好。

    你可以在http://Rampartlicensing.com找到它

    【讨论】:

    【解决方案3】:

    我建议功能限制。我几乎没有便笺程序。该程序可以完全运行,但您只能在未注册模式下创建 10 个笔记。所以我尽量对用户好。没有日期限制、唠叨屏幕或其他邪恶的东西。只有具有限制文本和注册按钮的小状态行。

    【讨论】:

      【解决方案4】:

      这是一个想法:

      1. 创建在 Web 上公开可用的数据库(例如 SQL Server 数据库)。它将保留“试用版”许可证密钥的列表。购买产品后,您可以将同一系统用于完整版许可证密钥。

      2. 当您的 Java 软件首次运行时,会创建一个试用许可证,该许可证将存储在数据库中

      3. Java 软件每次运行时都会检查有效的许可证。许可证的创建日期存储在数据库中,因此客户端时钟设置的时间无关紧要。

      4. 许可证过期后软件停止运行

      标准 windows 软件可以查找 CPU ID 并将其用作许可证的一部分,因此每台计算机只能运行一次试用软件。 有谁知道是否有某种“JVM ID”可用于此目的?

      也许已经有免费或开源许可相关代码?

      【讨论】:

      • @Jon 非常有趣的想法谢谢
      【解决方案5】:

      我过去曾成功使用过True License。它支持试用期。将它与ProGuard 之类的混淆工具结合使用,它肯定会让破解变得不简单。

      【讨论】:

        【解决方案6】:

        我从事商业 Java 软件的工作,它受到保护。

        在您的情况下可以接受强制互联网连接吗?在我们的例子中,我们的软件只有在有互联网连接的情况下才有意义,因此我们可以通过简单地遵循这个口头禅来使逆向工程变得不可能:

        让足够的部分计算发生在服务器端

        除此之外,攻击者没有什么可以做到:

        • 重写在服务器端发生的软件部分

        • 盗版您的服务器

        如果我们的潜在用户对我们的软件要求始终在线的 Internet 连接这一事实不满意,他们可以购买或盗版我们竞争对手的劣质产品。

        这样想:没有人使用伪造/生成的许可证密钥成功地在暴雪的战网上玩游戏。

        当然,盗版者可以尝试伪造整个战网,但盗版版将不允许人们玩真正的魔兽世界经济,也不允许在真正的星际争霸天梯上竞争等。

        为什么没有人能做到这一点:因为暴雪在服务器端做了足够的部分计算

        在服务器端发生的足够部分计算实际上意味着:“优秀的游戏海盗”

        我们越是进入一个始终连接的世界,就越容易保护应用免受盗版。内容 (DRM) 相同,无论好坏。

        【讨论】:

        • 请看在上帝的份上,如果您使用此方法,请对从服务器接收到的所有数据进行数字签名。否则你只是为了你自己的利益让客户端容易受到攻击,当一些黑客暴露这一点时,它会让你看起来真的真的,糟糕。
        • 如果(真的)您的公司倒闭会怎样?
        • @Kevin Brock:很简单:你发布服务器端的源代码(或者简单地制作一个最终版本,在其中你没有设置复制保护并将该版本作为免费升级发布) ...注意顺便说一句,几十年来,该行业的一些公司一直在某些特定领域销售具有超级限制性反复制保护(如硬件加密狗)的软件。顺便说一句,几家公司已有 150 年历史;)
        • @Longpoke:你只是为了你自己的利益让客户容易受到攻击我可以拿一些你在抽烟的东西吗?
        • @WizardOfOdds:“我能要一些你抽的东西吗?”您没有看到这里的安全漏洞吗?您的程序将根据服务器指定的任意逻辑进行操作,一个简单的中间人攻击现在足以危及任何客户端。如果您对服务器逻辑响应进行数字签名,则可以防止这种情况发生。
        【解决方案7】:

        关于类文件,你不能阻止对它们的访问,但你可以让obfuscation完全无法读取它们的反编译版本。

        【讨论】:

          【解决方案8】:

          为什么不将到期日期硬编码到试用程序中,这样您就不必继续支持它了?你可以把它放在 main() 中。

          // Die after October 1, 2010
          Calendar expireDate = Calendar.getInstance();
          // January is 0 (y, m, d)
          expireDate.set(2010, 9, 1);
          // Get current date and compare
          if (Calendar.getInstance().after(expireDate)) {
            // Die
            System.exit(0);
          }
          

          这就是 Microsoft 分发其大规模测试版软件的方式。他们只是给它一个有效期。

          如果您说的是防止逆向工程或修改代码,则不能。你可以混淆编译后的程序,但这不会阻止那些对你的代码进行逆向工程的人。

          【讨论】:

          • 如果用户将他的系统时钟设置回来,它会欺骗你的系统。
          • @Paul,确实如此,但它很简单,至少我不会支持它。
          • 谢谢,这是个好主意,但正如@Paul 所说,系统时钟可以修改:(
          【解决方案9】:

          尝试限制日期的问题在于,如果人们调回系统时钟,那么只检查日期的幼稚解决方案很容易被愚弄。我和一个人一起工作,他保留了一个 VMWare 虚拟盒,只是为了运行时间有限的软件。更好的方法是记录最后一次运行的时间,如果时间早于该时间,您就知道时钟已调回并且您可以中止。问题是弄清楚如何将该文件存储在用户找不到它的地方并覆盖它。同样,在 VMWare 或 VirtualBox 环境中,用户可以回滚到较早的快照。

          换句话说,您可以在某些时候限制一些人,但不能一直限制所有的人。

          【讨论】:

          • @Paul Tomblin: 啊啊,我就是那种人 ;) 存放用户找不到的文件的地方是在服务器端,在您自己的服务器上 :) 然后您的同事和我将重新映像/重新使用/复制 Windows 的“全新安装”,伪造 MAC 地址,然后重新安装新的“30 天”副本评估 :) 请注意,我这样做只是为了了解破解尝试(请参阅我的回答),以便更好地保护我们的软件 :)
          • 如果你将日期保存到 MySQL 中,你就没有任何机会使用这个技巧。
          • 你在说什么@ApopeiAndreiIonut?您可以进入 MySQL 命令行并更改任何表中的任何值。
          【解决方案10】:

          我只会做一些非常简单且足够困难的事情,以至于非程序员无法弄清楚。

          我想将程序首次以 64 位长的二进制文件安装到文件时的毫秒数写入文件。并让您的主要班级检查并执行时间限制。是的,人们可以改变他们的时钟来解决这个问题,但你真的不想卖给那些人。还要确保当前时间严格在安装后的 30 天内。大多数用户只会将他们的时钟调回一年,并且它适用于大多数程序,因为他们只是做了一个简单的小于差异检查。您还应该检查从当前到安装的天数差异是否也大于 0。

          如果您觉得自己需要更多的保护,那么您的商业模式问题比软件问题还多。基本上不可能让它无法破解,特别是因为您可以提取和反汇编类文件。

          【讨论】:

          • “商业模式问题”+1。
          • @Pyrolistical:你能解释一下暴雪是如何存在商业模式问题的,他们基本上让 Battle.net 无法破解吗?在这个互联网连接无处不在的时代,人们慢慢开始意识到,当服务器端发生足够的计算时,软件实际上就变得无法破解(除非重写它们)。
          • @WizardOfOdds:如果每个人都使用你的方法,那么世界的整个能源消耗将增加 200%,并且每条互联网线路都会 24/7 被淹没。请,这不是一个“最终”的解决方案。如果您销售的产品与互联网无关怎么办? 为什么我会永远购买需要连接互联网才能正常运行的东西,即使产品域与互联网无关。 ..我首先会想,“为什么要联系互联网做计算,木马很多?”。
          • @WizardOfOdds 显然 OP 没有通过 Internet 提供服务,您的观点证明了我的观点。如果 OP 需要更多保护,那么他们目前销售软件的商业模式存在缺陷,因此他们需要考虑其他模式,例如暴雪通过 Internet 销售服务。暴雪的模式与 OP 不同
          • 并非在每个域中都可以强制您的客户端在使用您的软件时始终连接到 Internet。在某些行业和企业网络中有法律禁止这样做。
          猜你喜欢
          • 2012-10-17
          • 1970-01-01
          • 2011-02-07
          • 1970-01-01
          • 2013-01-25
          • 2010-10-22
          • 2011-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多