如何创建Java程序的试用版本

19

我正在编写一款Java软件,几乎已经完成,我想知道如何创建一个30天的试用版本,因为我将要把它发送给一些公司。

那么如何制作共享软件或试用版?另外,我们能否阻止.jar文件中的.class访问?

谢谢!

10个回答

10

这里有一个想法:

  1. 创建一个数据库(如SQL Server数据库),可以在网络上公开访问。它将维护一个“试用版”许可证密钥的列表。当您的产品被购买时,可以使用相同的系统来管理完整版本的许可证密钥。

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

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

  4. 当许可证过期时,软件将停止工作。

标准的Windows软件可以查找CPU ID,并将其用作许可证的一部分,以便每台计算机只能运行一次试用软件。是否有任何人知道是否存在可以用于此目的的“JVM ID”?

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


@Jon,非常有趣的想法,谢谢。 - Eddinho

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);
}

这是微软分发大规模测试软件的方式。他们只是给它设置了一个到期日期。
如果您想防止反向工程或修改代码,那么您是做不到的。您可以混淆编译后的程序,但这并不能阻止那些本来就会反向工程您的代码的人。

6
如果用户将系统时钟往回调,那么它会欺骗你的系统。 - Paul Tomblin
2
@Paul,这是真的,但它很简单,至少我不会支持它。 - Marcus Adams
1
谢谢,这是一个好主意,但正如@Paul所说,系统时钟可以被修改 :( - Eddinho

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();
        }
    }
}

1
如果他们没有修复计算机上的日期怎么办?你会给他们更多的试用时间还是更少?或者更糟糕的是:如果他们发现这个问题并手动更改日期,以便永远无法使用真正的版本呢? - Gherbi Hicham

4
我会做一些简单而又足够难以让非程序员理解的事情。例如,将程序安装时的毫秒数以64位长整型二进制形式写入文件,并在主类中检查和执行时间限制。是的,人们可以更改他们的时钟来规避此问题,但你真的不想向这些人销售。还要确保当前时间与安装时间的间隔严格在30天以内。大多数用户只需将其时钟向后调整一年即可,而且它适用于大多数程序,因为只需要进行一个简单的小于差值的检查。你还应该检查从当前到安装时间的天数差异是否大于0。如果你觉得需要更多的保护措施,那么你面临的是商业模式问题而不是软件问题。基本上不可能使其无法被破解,尤其是因为可以提取和反汇编类文件。

1
“商业模式问题”加1。 - Paul Tomblin
@Pyrolistical:你能解释一下暴雪为什么有商业模式问题吗?他们基本上让 Battle.net 无法被黑客攻击了。在这个无处不在的互联网连接的时代,人们会逐渐意识到,当足够的计算发生在服务器端时,软件实际上变得几乎不可能被破解(除非重写它们)。 - SyntaxT3rr0r
4
如果每个人都使用你的方法,全球能源消耗将增加200%,而且每条互联网线路都会24/7被洪水般的信息淹没。请注意,这不是一个“解决所有问题”的方案。如果你正在销售与互联网无关的产品,为什么我要购买一个需要连接互联网才能正常运行的产品呢?我首先会想:“为什么这需要连接互联网来进行计算,难道是木马病毒?” - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
2
@WizardOfOdds 显然,OP并没有在互联网上提供服务,而您的观点证明了我的观点。 如果OP需要更多保护,那么他们目前销售软件的商业模式存在缺陷,因此需要考虑其他模式,例如暴雪通过互联网销售服务的模式。 暴雪的模式与OP的模式不同。 - Pyrolistical
并非在所有领域中,都可以强制要求客户在使用软件时始终保持互联网连接。在某些行业和企业网络中,法律禁止这样做。 - alwi

4
尝试限制日期的问题在于,如果用户将系统时钟调回,那么仅仅检查日期的天真解决方案就会轻易被欺骗。我曾经和一个人一起工作,他保留了一个VMWare虚拟盒子,只用于运行有时间限制的软件。更好的方法是记录上次运行的时间,如果时间早于上次运行时间,你就知道时钟被设置回去了,可以中止程序。问题在于如何将该文件存储在用户找不到且无法覆盖的地方。同样,在VMWare或VirtualBox环境下,用户可以恢复到早期的快照。换句话说,你可以限制某些人的某些时间,但不能限制所有人的所有时间。

@Paul Tomblin:啊啊,我就是那种人 ;) 隐藏用户找不到的文件的最佳位置是在服务器端,即您自己的服务器上 :) 然后您的同事和我将重新安装/复制“干净安装”的Windows,伪造MAC地址,并重新安装新的“30天”评估副本 :) 请注意,我只是为了了解破解尝试(请参见我的答案),以便更好地保护我们的软件 :) - SyntaxT3rr0r
如果你将日期保存到MySQL中,你就没有任何机会使用这个技巧了。 - Apopei Andrei Ionut
你在说什么,@ApopeiAndreiIonut?你可以直接进入MySQL命令行并更改任何表中的任何值。 - Paul Tomblin

4
我在一家商业Java软件公司工作,该软件是受保护的。
在你的情况下强制要求互联网连接可接受吗? 在我们的情况下,只有在有互联网连接的情况下我们的软件才有意义,因此我们可以通过遵循以下信条使反向工程成为不可能:
使足够的计算发生在服务器端
除了以下内容之外,攻击者无法对此进行任何操作:
1.重写正在服务器端发生的软件部分 2.盗版你的服务器
如果我们的潜在用户对于我们的软件强制要求始终处于联网状态感到不满意,他们可以购买或盗版我们竞争对手的劣质产品。
这样想:任何人都没有成功地使用虚假/生成的许可证密钥玩Blizzard的battle.net游戏。
当然,海盗可以尝试伪造整个battle.net,但是那个盗版版本将不允许人们在真正的WoW经济中玩或在真正的Starcraft排行榜上竞争等。
为什么没有人能做到这一点:因为暴雪使计算的足够部分发生在服务器端。
在服务器端发生足够多的计算实际上意味着:“好的游戏海盗”。
随着我们越来越多地进入一个始终连接的世界,保护应用程序免受盗版变得更加容易。 对于内容(DRM)也是如此,无论好坏。

3
如果(实际上是“当”)你的公司倒闭了,会发生什么? - Kevin Brock
1
@Kevin Brock:非常简单:你发布服务器端源代码(或者仅制作一个最终版本,在其中不设置任何副本保护,并将其作为免费升级发布)...... 顺便提一下,有些公司几十年来一直在某些特定领域销售具有超严格的防复制保护措施(如硬件加密狗)的软件。另外,一些公司已经存在150年了 ;) - SyntaxT3rr0r
@Longpoke:你只是让客户变得脆弱来追求自己的利益,我能拿点你在抽的东西吗? - SyntaxT3rr0r
1
@WizardOfOdds:“我能要一些你在抽的东西吗?” 你难道没有看到这里的安全漏洞吗?你的程序将根据服务器指定的任意逻辑进行操作,现在一个简单的中间人攻击就足以可能危及任何客户端。如果你对服务器逻辑响应进行数字签名,就可以防止这种情况发生。 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
有点晚了,但是在我还是个孩子的时候,大约在2010年左右,我玩过盗版战网魔兽争霸3和暗黑破坏神:),甚至认识那个让这成为可能的人。据我所知,他现在在暴雪公司工作。 - SüniÚr
显示剩余3条评论

3

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


2

过去我使用True License成功了。 它支持试用期。结合混淆工具ProGuard使用,肯定会使破解变得非常困难。


2

我建议设置功能限制。我有一个小的便签程序,该程序可以完全使用,但是在未注册模式下只能创建10个便签。所以我试图对用户友好。没有日期限制,烦人的弹窗或其他恶意内容。只有一个小的状态栏,显示限制文本和注册按钮。


2

有一个名为Rampart的产品,可以让你为你的Java应用程序创建试用版。只需要几分钟时间,它的效果非常好。

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


链接被损坏了。能有人修复一下吗? - Rajkumar R
链接已损坏,请更新。 - Shersha Fn
请查看此链接http://www.codeproject.com/Articles/15496/Application-Trial-Maker。它可能会有所帮助。 - ELITE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接