我正在创建一个功能齐全的软件试用版。现在,因为我不希望有时间限制(如 30 天试用)或功能受限试用,所以最好使用“用户可以执行软件的次数”试用。
它是一个基于 C# 的 .NET 应用程序,我正在努力寻找一种方法来实现它。尝试了注册表项、基于文件的跟踪等,但它们似乎不太可靠。
非常感谢有关此主题的帮助。
谢谢,罗汉
跟踪试用期的两种正常方式是使用注册表项和 Web 服务:
注册表项:实施某种方法,将程序启动次数保存到 Windows 注册表中的一个键中,可能带有某种混淆。一个“加盐”加密方案,你加密一个包含你的值加上一些机器相关值(如 NIC 的 MAC 地址)的方案,可能效果最好;使用 Dotfuscator 之类的工具,确保您的代码难以反编译。最好使用安装程序将密钥放在适当的位置,因此程序可以简单地将缺少密钥视为试图篡改。
然后,在启动时,检索密钥、解密并检查它。如果这是您所期望的,则将该值加 1,将其写回注册表,如果新值大于允许的启动次数,则将用户锁定。如果注册表项是您不期望的值(意味着他们篡改了它),包括根本不存在,只需将用户锁定。
这种方法的优点是它提供了非常强大的安全性,而无需 Internet。不利的一面是,“机器相关”的详细信息可能会出于正当原因而更改,当这种情况发生时,您的用户在使用完所有开始之前就被锁定了,这会使用户感到沮丧。此外,您的加盐和加密实现存在于用户的计算机上;即使你混淆了代码,一个老练的黑客也会有办法检查你的程序,并且可以发现你的实现并模仿它来“重置”计数器。只需要一个人就可以做到这一点,并且会有一个简单的 Warez 应用程序允许其他人这样做。
Web 服务:在您控制的服务器上实现 WCF 服务。将其牢牢锁定,因此从 LAN 外部进出的唯一方法就是按照 WCF 的预期方式通过 WCF 端口。现在在您的程序及其安装程序中实现一个客户端。安装时,安装程序将调用服务方法,说明软件正在安装在具有特定 MAC 地址或硬件 ID 的机器上。如果您的数据库中没有列出该唯一机器,请添加它;否则什么都不做。然后,在程序启动时,从您的程序中调用 Web 服务,传入相同的信息,Web 服务将更新启动次数,并返回一个值告诉客户端是否允许启动。
Web 服务的好处是很难通过 Warez 进行大规模营销。攻击此类系统的主要方法是破解许可证服务器,或者放置一个“中间人”,他可以将您的程序对 Web 服务的请求重定向到他控制的计算机。不利的一面是,对计算机硬件 ID 的更改仍可能导致早期锁定,或者更糟糕的是,允许攻击者简单地欺骗您从未见过的新 MAC 地址或硬件 ID,然后重新安装您的软件,从而提供解决方法。用户在“新”机器上进行一组新的启动。也有一些方法可以防止这种情况发生,但是您添加的每个级别的混淆和反黑客检查都会增加一层复杂性。
无论您做什么,请记住 80/20 规则;80% 的用户将通过最基本的措施保持诚实,以确保试用过程的安全。20% 的用户会找到解决方法。在这 20% 中,其中 80% 会因您采取的任何额外措施而受到阻碍。这个过程是递归的;关键是,某个地方的某个人会绕过您采取的任何措施,但如果数学成立,那么当面临移位加密的注册表项和混淆程序时,您 96% 的用户只会屈服并支付您的完全访问权限代码。您可以通过添加任何其他内容来为 99.2% 的用户提供此功能,例如使用特定于机器的内容对混淆的密钥进行加盐处理。