我一直在为我们的用户寻找一个简单的密钥/许可证系统。它的一部分是为了阻止盗版(避免用户共享应用程序),另一半是为了跟踪我们拥有的“许可用户”的数量。我已经阅读了一些关于 SO 的好建议,但我很好奇人们是如何实施 30 天评估标准的。
您是否生成了一个将日期存储在某处并每次进行比较的密钥,或者它是否更复杂一些 - 删除文件/删除注册表不应该停用。
是否有任何示例实现可以让我领先一步?具有讽刺意味的是,我们的 PM 不想授权第三方系统为我们做这件事。
这适用于 Windows 窗体应用程序。
我一直在为我们的用户寻找一个简单的密钥/许可证系统。它的一部分是为了阻止盗版(避免用户共享应用程序),另一半是为了跟踪我们拥有的“许可用户”的数量。我已经阅读了一些关于 SO 的好建议,但我很好奇人们是如何实施 30 天评估标准的。
您是否生成了一个将日期存储在某处并每次进行比较的密钥,或者它是否更复杂一些 - 删除文件/删除注册表不应该停用。
是否有任何示例实现可以让我领先一步?具有讽刺意味的是,我们的 PM 不想授权第三方系统为我们做这件事。
这适用于 Windows 窗体应用程序。
您是否查看过Ayende Rahien的Rhino-Licensing项目。您还可以看到他关于许可商业产品的博客文章,这导致他开发了这个解决方案。
我之所以这么说,不仅仅是因为我的公司销售适用于 .NET 的 OffByZero Cobalt 软件许可解决方案:您的 PM 应该知道软件许可很难获得正确的许可,如果您自己推出,您将支持它可以预见的将来。
查看文章为软件保护和许可而开发;它解释了如何选择一个解决方案,为什么你应该混淆你的应用程序,并提供了一些让你的代码更难破解的技巧。
特别是它表明绝大多数公司应该外包他们的软件许可,因为将开发人员的时间花在构建和维护一个不是您的核心业务的复杂系统上是没有意义的。
对您的公司来说更重要的是:为您的产品添加重要的新功能,还是在旧版本的 Windows 上追踪破坏您的许可系统的特殊权限行为?
我从事的一个项目通过将一些关键功能(例如数据存储、报告或支付)放在我们运行的外部服务器上来处理这个问题,并要求用户登录到该服务器以获取该功能。
客户可以在本地进行备份、共享或运行应用程序,但要访问这一关键功能,他们必须在我们的应用程序中输入密码并连接到我们的服务器。客户知道密码允许更改他们的数据,因此他们不想与其他人共享密码。
这很方便,因为我们不关心应用程序有多少副本在野外,我们只跟踪服务器连接。我们在连接数据中包含了机器识别数据(如 MAC 地址),因此我们可以跟踪哪些机器正在连接。
我不确定您是否可以真正保护 .NET - 可能有商业解决方案可以解决问题。原因是 .NET 代码可以通过Lutz Roeder(感谢 Jasonh 的提醒)Red Gate 的 Reflector(以前是上面提到的那个人)看到的。处理它的最佳方法是寻找代码混淆,这会使反射更加棘手,我可以为您指出一个我知道的免费提供此功能的地方 - Phoenix - NtCore.Com。
更深奥的解决方案是在 C++ 中创建一个 .NET 托管环境,加载二进制图像(可以加密)和托管环境,而不是在内存中解密它 - 听说过这个理论,但不确定如何在实践。请不要使用您自己的保护方案,因为可能存在弱点。
有人曾经说过 - “通过默默无闻的安全”....
希望这会有所帮助,最好的问候,汤姆。
有两个不同的挑战: i. 如何防止复制的应用程序运行。ii. 如何防止用户撕掉/绕过您的预防方案。第一个通常是通过获取用户系统的硬拷贝签名(例如硬盘 ID + 处理器 ID + RAM 等)并将其用作种子/密钥并通过调用“home”在线激活它来完成。
第二个问题在 .Net 中更难做,因为源代码可以以某种方式提取并重新编译以排除您的保护系统。这里的关键是让购买许可证比在用户端删除保护更便宜。您可能会发现,对于大多数产品,建议使用自定义引擎来加密您的产品库,其中还包含您的复制保护并在初始运行时对其进行解密,这可能就足够了。