我已经创建了我的产品并为此生成了许可证密钥,但我想在 30 天后询问该密钥。我已经使用注册表值来存储日期并在其中添加 30 天。但我发现如果用户在我的逻辑前 30 天更改系统日期是行不通的。
那么试用版软件有什么解决方案,不检查系统日期,只允许试用 30 天?
我已经创建了我的产品并为此生成了许可证密钥,但我想在 30 天后询问该密钥。我已经使用注册表值来存储日期并在其中添加 30 天。但我发现如果用户在我的逻辑前 30 天更改系统日期是行不通的。
那么试用版软件有什么解决方案,不检查系统日期,只允许试用 30 天?
您可以在每天使用后增加另一个注册表项。这样,即使他们更改了计算机的日期,此键也会向您的程序表明它已运行超过 30 天。
此外,这个值可以被加密,因此如果用户试图手动更改它,程序可以拒绝运行,因为它无法解密该值并从中获取有效数字。
为了避免重新安装,您可以将一些信息添加到与应用程序的试用版一起保存的任何文件中,这些信息对于该应用程序的特定版本是唯一的(可能是安装时的时间戳)。当您的应用程序的试用版尝试打开文件时,它将检查此签名并确保它是使用同一实例创建的,否则拒绝打开文件。这基本上消除了简单地重新安装应用程序并继续使用它的能力。
但归根结底,用户可以完全控制他们的机器,并且可能会找到一种方法来解决你想做的任何事情(在你让用户使用应用程序之前访问保存这些详细信息的 Web 服务) )。您可能不应该花费太多精力来阻止那些愿意经历这些额外麻烦的人,而应该花费额外的时间/金钱/精力来为那些愿意付费的人改进应用程序。
您可以使用许可组件。您可以自己制作一个(参见LicenseManager 类),或从供应商处购买一个(例如CryptoLicensing)。
我有一个简单的解决方案给你。
为注册表取 2 个变量:1. 日期 2. 计数器
脚步:
设置一个计数器 = 1
复制系统日期到日期
每次检查日期是否与当前日期不同,然后将该日期复制到注册表日期,还将计数器加 1。如果日期相同,则不要执行任何操作。
现在你可以检查你的柜台试用天数到期
通过使用这些技巧,如果用户将系统日期更改为以前的日期,它也可以工作。
对于注册表,您可以加密日期和计数器,以便技术人员无法识别您的逻辑!
干杯...
添加
仅当用户不更改每天的日期时,此逻辑才会失败!再次,我们有解决方案!
我不知道这是否可能,但你总是可以有一些解决方案:
您需要有一种方法来检测用户是否更改了您首次开始试用的日期。在我之前使用过的解决方案中,我们保存了“最后执行”日期和“第一次执行”日期,如果时钟更改为“最后执行”两天以上,我们将终止试用。您还需要一个“执行天数”计数器,这样他们就无法将日期向后移动两天(忘了提及那部分) - 每次执行时计数器都会增加。
当然,这样的软件许可系统总是可以通过卸载和重新安装并适当刷新注册表来避免 - 诀窍是混淆和复制您的许可证信息足以使这变得困难,但最终,它会被发现(特别是如果你是使用未混淆的 .NET 代码库)。
如果不参考系统日期/时钟,很难处理 30 天。您始终可以保留应用程序启动日期的列表,并在每次与上次不同时计数 1。这样,您的用户每次启动您的应用程序时都必须设置相同的日期。
除此之外,如果有 Internet 访问权限,您可以查询当前日期的已知良好时间服务器。这可以通过断开连接来规避,但您始终可以在应用启动之前要求互联网连接。
最后,通过硬件加密狗或类似的外部本地时间源,但我认为你已经进入了一个极端,你最好直接亲自管理试验。
您可以使用免费项目 Libprot。该站点是https://github.com/libprot/trunk。
这个想法是它应该简单易用。您可以在保护上花费 $$,但它可能会在一周内被黑客入侵。如果有人想对您的代码进行逆向工程,那么没有人可以阻止它。我的建议是使用有效的简单方法。
写一个像这样的字符串:
X公司|10.2.2014|1.12.2015
其中 10.2.2014 是当前日期,如果系统时间小于那么有人更改了系统时钟 => 我们不应该运行
1.12.2015 - 直到密钥有效的时间
以及购买/下载它的公司名称。
例如,该字符串应使用具有私钥/公钥的非对称算法进行混淆,并编码为您可以通过电子邮件发送的字符串。
您可能还需要一些用于验证的 Web 服务。当互联网连接打开时,您可以验证密钥,如果它被黑客入侵并且可以在互联网上公开,您可以禁止它。或者,如果有人会编写密钥生成器,您可以验证该密钥是真实的。
您可以在您的站点中添加一些 PHP/java 脚本来自动发送试用代码。
如果您可以保证互联网连接,您可以实施在线方案(检查时间服务器或您自己的身份验证服务器)。当然,这会引入另一种依赖关系——如果互联网消失,您的用户将无法工作。
最终我会说购买第三方许可解决方案 - 它仍然不是牢不可破的,但它可能会比您无需大量时间和精力就可以自己做的事情更强大。
存储上次运行日期,只要系统日期早于该日期,试用期就会过期。
唯一的故障安全方法是针对您托管的服务验证应用程序,假设没有人破解您的连接代码;)
只要他们可以清除注册表值/隔离存储文件/保存的设置:他们可以重新开始试用。你对此无能为力。这就是为什么人们除了基于时间的试用期外,还选择减少试用软件的功能。
如果允许 8 小时试用(而不是 30 天试用)是可以接受的,那么消除对 System DateTime 依赖的一种方法是在您的应用程序中使用一个计时器,该计时器每分钟触发一次。计算这些,因此每次应用程序运行时,它都会累积总使用分钟数。然后,您可以将此计数值存储在某处,例如注册表中。
这是简单的商店评估结束日期并每天检查。为避免因日期操作而延长使用时间,请在应用程序中保持小时计数;不断增加并将其写入注册表。应对照评估结束日期和小时数进行检查,不超过 24 小时(可能是 30 小时,有一些 teolrence)。
还想一想:
保存应用程序关闭的日期时间,下次午餐时,您的应用程序将能够检测日期时间设置是否已更改(至少他们之前无法将其更改为关闭时间之前的内容)。例子 :
在申请结束时:
节省时间 => 15:34 03/31/2014(已保存)
应用程序的下一个启动:
检查 Datime.Now > 15:34 03/31/2014。(所以他们不能这样做......)
添加 :
尝试以某种方式将系统的日期时间设置集成到您的应用程序使用中:生成发票、票证、收据……随便!