17

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

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

谢谢

4

10 回答 10

10

这是一个想法:

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

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

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

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

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

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

于 2010-05-04T23:43:27.310 回答
6

为什么不将到期日期硬编码到试用程序中,这样您就不必继续支持它了?你可以把它放在 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 分发他们的大型 beta 软件的方式。他们只是给它一个有效期。

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

于 2010-05-04T22:39:11.423 回答
4

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

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

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

于 2010-05-04T22:39:49.343 回答
4

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

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

于 2010-05-04T22:43:21.210 回答
4

我在一个商业 Java 软件上工作,它受到保护。

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

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

攻击者对此无能为力,除了

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

  • 盗版你的服务器

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

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

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

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

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

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

于 2010-05-04T23:30:20.743 回答
4

我检查了原子时间服务器在代码开头发送给我的日期。然后,我将该日期与特定日期进行比较。如果原子时间更短,则 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();
        }
    }
}
于 2012-03-13T15:21:17.987 回答
3

关于类文件,您不能阻止对它们的访问,但可以通过混淆使它们的反编译版本完全不可读。

于 2010-05-04T22:48:31.120 回答
2

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

于 2010-05-04T23:49:44.563 回答
2

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

于 2010-05-11T22:13:18.020 回答
2

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

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

于 2010-12-11T03:50:59.847 回答