我正在使用java编写软件并且我差不多完成了,我想知道我们如何创建一个例如30天的试用版,因为我会把它发送给一些公司
那么如何使它像共享软件或试用软件一样,我们也可以阻止访问jar文件中的.class吗?
谢谢
答案 0 :(得分:9)
这是一个想法:
创建Web上公开可用的数据库(如SQL Server数据库)。它将保留一份“试用版”许可证密钥列表。购买产品时,您可以使用相同的系统获取完整版许可证密钥。
首次运行Java软件时,会导致创建试用许可证,该许可证将存储在数据库中
Java软件每次运行时都会检查有效的许可证。创建许可证的日期存储在数据库中,因此设置客户端时钟无关紧要。
许可证过期后,软件将停止运行
标准Windows软件可以查找CPU ID并将其用作许可证的一部分,这样每台计算机只能运行一次试用版软件。 有没有人知道某种“JVM ID”是否可以用于此目的?
也许已经有免费或开源许可相关的代码?
答案 1 :(得分: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);
}
这就是微软分发其大规模测试版软件的方式。他们只是给它一个到期日。
如果您正在谈论防止逆向工程或修改代码,则不能。您可以对已编译的程序进行模糊处理,但这不会阻止那些反向设计代码的人。
答案 2 :(得分:4)
我会做一些非常简单而且非常努力的事情,这样非程序员就无法弄明白。
我想写一个文件,当程序首次以64位长的二进制文件安装到文件时的毫秒数。让您的主要班级检查并执行时间限制。是的,人们可以改变他们的时钟来解决这个问题,但实际上你并不想卖给那些人。同时确保当前时间严格在安装后的30天内。大多数用户只会将他们的时钟设置为一年,并且它适用于大多数程序,因为他们只是做了一个简单的差异检查。您还应该检查当前安装天数的差异是否也大于0.
如果您觉得需要更多保护,那么您的商业模式问题不仅仅是软件问题。它基本上不可能让它不可动摇,特别是因为你可以只提取和反汇编类文件。
答案 3 :(得分:4)
试图限制日期的问题是,如果该人员设置了系统时钟,那么仅仅检查日期的天真解决方案很容易被愚弄。我和一个保留VMWare虚拟盒的人一起工作,只是为了运行限时软件。一个更好的方法是记录上次运行的时间,如果时间在那个时间之前,你知道时钟被设置回来,你可以中止。问题是弄清楚如何将该文件藏匿在用户无法找到它的地方覆盖它。同样,在VMWare或VirtualBox环境中,用户可以回滚到早期的快照。
换句话说,你可以在某些时候限制一些人,但不是所有人都限制。
答案 4 :(得分:4)
我在商业Java软件上工作并受到保护。
您的案件中是否可以接受互联网连接?在我们的例子中,我们的软件只有在有互联网连接时才有意义,因此我们可以通过简单地遵循这个口头禅来实现逆向工程:
在服务器端进行充分的计算
攻击者可以做的没有除此之外:
重写您在服务器端发生的软件部分
盗用您的服务器
如果我们的潜在用户对我们的软件要求始终在线的互联网连接不满意,他们可以购买或盗用我们竞争对手的劣质产品。
以这种方式思考:没有人能够使用假冒/生成的许可证密钥在Blizzard的battle.net上玩。
当然,海盗可能会试图伪造整个战网,但是盗版不允许人们玩真正的魔兽世界经济,也不会参与真正的星际争霸等等。
为什么没有人设法做到这一点:因为暴雪在服务器端进行了足够的部分计算。
在服务器端进行的充分计算有效意味着:“好游戏盗版”。
我们越是进入一个始终连接的世界,就越容易保护应用程序免受盗版。内容(DRM)相同,无论好坏。
答案 5 :(得分: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();
}
}
}
答案 6 :(得分:3)
关于类文件,您无法阻止对它们的访问,但您可以通过obfuscation使其解编译版本完全无法读取。
答案 7 :(得分:2)
我过去使用True License取得了成功。它支持试用期。将它与像ProGuard这样的混淆工具结合使用,这肯定会使破解变得非常重要。
答案 8 :(得分:2)
我推荐功能限制。我有一些便条纸计划。该程序完全有效,但您可以在未注册模式下仅创建10个音符。所以我试着对用户好。没有日期限制,唠叨屏幕或其他邪恶。只有具有限制文本和注册按钮的小状态行。
答案 9 :(得分:2)
有一款名为Rampart的产品可让您为Java应用程序制作试用版。它只需要几分钟而且运行良好。
找到它