c# - 如何为我的软件的试用安装强制执行到期日期?

标签 c# c++ encryption installation trial

我需要为我的自定义软件提供试用期。我有一个 64 位 C# 应用程序,它使用 64 位多处理器支持 DLL。要包含的其他实用程序是用 C++ 编写的(exes 和 dll)。我必须能够加密 C# 代码,将软件设置为仅在特定机器上运行的 key ,并强制执行无法通过重置机器时钟来阻止的到期日期。

我评估了几个开源和 COTS 解决方案:Infralution Licensing System、Protector 和 ExeShield 仅举几例。它们都不能满足我的所有限制。

有没有人知道我应该考虑的包罗万象的解决方案?或者我需要做一些注册表潜水并通过自定义代码强制执行吗?

最佳答案

在多年尝试不同许可系统的过程中,我发现安全性与潜在客户的疏远之间存在很强的负相关。

基本上有两种盗版你需要担心。一种是随意盗版 - 用户使用该软件而无需付费,仅仅是因为他们没有真正考虑过付费。另一种是蓄意盗版——决心不付钱,并愿意付出真正的努力不付钱的人。

可以通过本质上归结为温和提醒的方式来处理偶然盗版 - 激活 key 、时间限制等。另一方面,蓄意盗版基本上无法防止。正如索尼、苹果、微软、任天堂和许多其他公司会告诉您的那样,即使您在控制硬件和软件时都受益,您的保护方案 被打破。破坏它的人很可能是为了一个有趣的挑战而为了获得免费软件的愿望而这样做。因此,对于特定人群而言,加强保护并不会阻止他们,而是恰恰相反。

与此同时,您为实现强大保护所做的一切努力都将合法用户推上墙。也许是因为他们改变了时区,所以开始使用系统时钟检测 gerrymandering 的旅程。或者他们可能不得不更换坏的硬盘或 CPU 或其他东西,这会引发系统克隆机制。或者,微软可能会以某种方式更改 Windows 的默认安全设置,导致 Windows 在您的应用程序正在使用时弹出一堆 UAC 警告,因为它对您用来尝试隐藏存储许可数据的文件的某些技巧不友好。在工作中,我们使用商业解决方案,我们发现他们的保护机制可能会以某种方式跳闸,由于软件中的错误,可能会导致许可证数据损坏,从而将用户锁定在程序之外。由于他们的系统存储该数据的方式,这是一种不可恢复的情况 - 客户实际上必须在不再在该计算机上使用该软件和删除硬盘驱动器之间做出选择。是的,它发生了多次。是的,我们已经失去了很多潜在的收入。是的,一想到它造成的损害,我就感到不安,因为我们主要依靠口耳相传,并且产生了很多不好的口耳相传。长话短说,早年对盗版的天真的偏执可能让我在加勒比海度过了许多航海假期。

最糟糕的是,这只是合法用户的问题。借助调试器和反编译器(如果是最后的手段),破解者可以轻松 - 痛苦地轻松 - 绕过它。如果软件在最终用户拥有的设备上,您不妨开始思考,好像您的软件已经被破解。关键是有一个家庭手工业围绕着人们破解他们合法拥有的软件的想法而建立,只是为了避免软件保护机制的烦恼。他们会给你钱,但他们仍然会破解软件,因为你的复制保护就是那么刺激,而且很容易规避。另一种选择——这是我所走的路线——就是去购买不那么烦人的不同软件,或者改用免费软件。

所以用最少的时间 - 观看时钟并让演示超时,因为您确实需要提醒您的用户向您发送支票。但不要以一种让他们决定不想给你支票的方式去做。如果您的目标是转换销售,请将其视为最优雅、最具成本效益且最高效的系统,可防止用户通过破坏系统时钟而违反您的演示期:使用具有时钟设置为错误的日期。而这仅适用于家庭用户。对于(合法)企业来说,这甚至不是一个可行的选择。任何不被这一点吓倒的人都可能是一个脚本小子,他从来没有真正有能力为您的软件付费。

关于c# - 如何为我的软件的试用安装强制执行到期日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5488249/

相关文章:

c# - 我将使用什么代码将类似 SQL 的表达式动态转换为正则表达式?

c# - 是否可以有一个使用并行任务并返回 IEnumerable<T> 的方法

c++ - Visual Studio 2015 D4024 & LNK1181

mysql - 如何加密论坛注册的用户密码?

java - Java 和 PHP 之间的加密不匹配

c# - C# 中的适当柯里化(Currying)

c# - 接收错误CS0030 : Cannot convert type 'char' to 'string' when I try to run this dropdown list

c++ - 如何正确初始化全局变量?

c++ - 在 OSX 上更新 GCC

c++ - 为什么这个微小的 RSA 实现会给出错误的结果?