0

像许多现代软件公司一样,我的公司使用产品密钥来检查用户对某个软件的合同。解析产品密钥时,我可以检查某人拥有什么类型的产品(试用版/完整版等)。我们希望用户能够从代码库的免费版本升级到付费版本,并希望能够检查产品密钥是否有效的试用版。

试用版不包含完整版的所有代码。使用算法检查产品密钥(它不使用 Web 服务或类似的东西),因此可以非常快速地完成。

这里有两个子问题:

  • 从试用版到完整版。我正在考虑通过 MSI 升级解决这个问题,但不确定如何实现。(使用 WIX)
  • 制作一个包含额外代码的试用版,用于检查它是否是试用版。我知道使用#if 语句可以做到这一点,但我想知道是否也可以更改 DLL - 更准确地说:为检查试用版的每种类型添加静态构造函数。

我的问题是:这是正确的方法吗?如果是这样,是否有实现这种功能的标准方法(或工具)?如果没有,最好的方法是什么?

更新

到目前为止,感谢您提供的所有出色答案。我认为是时候根据答案来解释更多的背景了——幸运的是,我们似乎或多或少地走在了正确的轨道上。

对于我们的产品,将其安装在私有(非互联网连接)VLAN 上是有意义的,这样就可以使用产品密钥......我真的不想像“电话激活”那样麻烦微软做到了:-)。因此,正如建议的那样,我目前正在使用加密一些数据的产品密钥,这些数据被解密以查看密钥是否对给定产品有效。当然,我可能是软件盗版的受害者,但我想我们现在将其视为一种“营销工具”。

正如其中一个答案所建议的,我目前正在生成多个 MSI 文件:一个用于 x64,一个用于 x86。然后是试用版、完整版和蓝图版。总共有 6 个 MSI 文件 (pfff)。在进程混淆过程中,会发生强命名和代码签名。蓝图版本包括完整的源代码。

我比较关心试用版。当然,我可以在这里和那里添加一些检查,但我宁愿自动在每个类中放置检查...我想过复制所有 CS 文件并添加/更改静态 c'tors (f.ex.使用 cecil 或 nrefactory .. 或只是几个正则表达式 ...)。在我看来,我不是唯一想要这个的人。必须有更好的方法,对吧?

此外,我真的不想考虑更新和升级,因为这似乎是在重新发明 MSI 轮子。从试用版到完整版在我看来像是 MSI 升级,就像完整版到蓝图版感觉像是 MSI 升级。但是,结合正常升级,我担心这是否可能?

4

4 回答 4

1

试用Rhino 许可(开源)

使用计算机 SID、HDD 序列号、CPU 标识符等机器唯一标识符将生成的许可证绑定到个人机器。使用浮动许可证并在运行时检查服务器上许可证的可用性。Rhino Licensing 为您提供必要的基础设施来实现这一目标。Rhino Licensing 还可以在许可证文件中包含自定义数据,这样您就可以轻松地将客户信息存储在许可证文件中。综上所述,在您的应用程序上拥有许可方案并不意味着您是完全安全的。黑客和破解者试图对您的应用程序代码进行逆向工程以查看许可是如何完成的,因此您需要考虑其他安全问题,建议使用混淆工具来使恶意用户更难做到这一点。

于 2013-02-04T17:17:12.400 回答
0

您可以只发布完整版并禁用试用版的某些功能。当用户升级他的许可证时,他不需要下载任何东西。不要太担心裂缝和keygens。如果有人破解了你的软件,那就意味着你成功了,而且你已经赚了很多钱。

于 2013-02-04T17:21:56.203 回答
0

为了解决我们的应用程序的这个问题,我们使用了一个 Guid 并在 Guid 中选择了设置点,让我们知道他们正在使用什么版本。之后,我们只是安装了完整的系统并在软件启动时使用了布尔值。

于 2013-02-04T17:25:05.810 回答
-1

混合试用和生产环境可能会变得混乱。如果可能,请为每个安装两个单独的安装程序。

使您的保护尽可能强大有一些先决条件:

  • 用你能买到的最好的混淆器来混淆你的代码。
  • 在代码中的几个关键位置传播有效签名的检查,不要在启动时只检查一次。
  • 了解 .NET 加密 API,例如非对称加密和 签名
  • 请记住,生成的产品密钥可能会被逆向工程,如果您的应用程序是大容量或高价值的,这主要是一个问题

激活场景:

在安装后或之后的一段时间内,您可以要求用户“激活”您的产品。激活时,您可以生成一个纯文本 XML 文件,其中包含一些标识系统的组件 - CPU ID、HDD ID、域名、用户名等。将所述 XML 发送到您的 Web 服务。

然后,该服务可以附加一个随机标签,将数据散列在一起并使用私钥对其进行签名,然后返回签名和随机标签。

您的客户端软件将内置匹配的公钥,并将随机标签和签名存储在本地。

要检查许可证文件是否有效,应用程序会将明文数据和随机标签一起散列,并检查签名是否与该散列匹配。

这为您提供了一种非常可靠的方法来确定您的客户端正在运行的实例是否已购买,并且几乎可以保证他们不能只修改 XML 本身。

没有激活的场景:

购买后发送包含一些客户数据的文件,例如他们的姓名、电子邮件、电话等 - 使其有点个人化,这样用户将不愿意分享他们自己的许可证文件。

包括一个随机标签并将所有数据散列在一起。对哈希进行签名并将其也存储在文件中。

用户必须将文件保存在预定位置或将其粘贴到应用程序的文本框中。

于 2013-02-04T17:27:56.797 回答