10

我需要一些如何创建激活算法的想法。例如我有演示证书。假设应用程序在演示模式下运行。当提供完整版证书时,应用程序以完整模式运行。甚至有可能吗?创建这个系统的好方法是什么?

一个简单的事情是我在想只有 2 个加密字符串,现在当使用演示公钥证书成功解密时,应用程序将以演示模式运行等等。

编辑:使用 C# 和 Windows 7

4

7 回答 7

9

您可以执行以下操作:

  1. 生成公钥/私钥对
  2. 作为私钥的所有者,您可以签署那些“激活证书”(从现在起称为 AC)
  3. 在您的应用程序中,使用公钥,您可以检查签名是否正确

正如 Overbose 提到的——你不能阻止逆向工程。一般来说,有人可以获取功能并将其放入他/她自己的应用程序中,从而消除任何可能的激活算法。因此,您只能假设(或制造)这很难不值得付出努力(这与密码学相同-当您使破坏消息的成本大于获得它的利润时,您可以说它是安全可靠)。

所以你可以:

  1. 使可执行的自我验证(由你签名,基于硬编码的公钥进行自我检查(一件事:你必须在自我检查时跳过这个值))。
  2. 用指针做一些技巧(指向激活函数,转到第 7 位并根据另一个指针的值更改它的值;在一些奇怪的地方将硬编码值更改为基于其他地方出现的某些位的值代码;通常——比简单地使用十六进制编辑器更改可执行文件中的位更难破解)
  3. 尝试制定一些协议,您的服务器将使用该协议来询问有关应用程序的问题(“给你自己的 293 字节的值”)并检查答案。
  4. 发挥想象力,想一些以前没人用过的奇怪的自检方法:)

如前所述 - 这一切都不能安全地切断身份验证部分。但什么都不是,这可能会让饼干更难。

于 2011-08-12T12:56:30.557 回答
5

背景:我已经部署了一个建立在第三方许可系统之上的基于激活的系统,即服务器、数据库、电子商务集成。我还使用 RSA 密钥单独编写了一个 C# 激活系统,但从未部署它。

产品激活通常意味着必须在给定机器上激活软件。我想这就是你的意思。如果您只想拥有两个表示“演示”和“购买”的字符串,那么它们将在数小时内被解密和分发(假设您的产品很有价值)。没有意义。

所以。假设您想要“激活”,那么当用户购买您的软件时,需要发生以下过​​程:

  1. 订单履行软件告诉服务器生成“Purchase Key”并发送给用户
  2. 用户在软件中输入“Purchase Key”
  3. 软件将购买密钥和唯一机器 ID 发送到服务器。
  4. 服务器将购买密钥和机器 ID 组合成一个字符串,并用其证书对其进行签名并将其返回给用户。
  5. 软件使用服务器公钥检查签名是否有效。
  6. 软件可以检查很多地方:在很多地方加载签名,在其他地方检查。

在生成购买密钥时,服务器不仅可以存储购买的产品,还可以存储产品的级别。您还可以拥有有时间限制的“免费”产品,因此用户可以试用该软件的完整版 30 天。

您使用的是 C#,因此请确保使用 dotfuscator 或等效工具对二进制文件进行模糊处理。但是,即使这样,您也无法对抗坚定的黑客。我认为,您的目标是迫使非付费用户自己成为黑客,或者不得不冒险使用破解版:孩子们不会在意,公司可能会。YMMV。

执行检查的代码需要在每个需要保护的程序集中,否则攻击者可以通过替换执行检查的程序集来轻松删除保护。如果需要,请剪切并粘贴代码。

或者只是买点东西。

另一种选择是让服务器预先生成“购买密钥”并将它们提供给订单履行服务,但是您无法将密钥链接到客户详细信息(至少在他们注册之前)。购买后最好让电子商务服务器访问您的服务器,然后让您的服务器将其发送出去。

困难的部分不是激活密钥的生成,而是服务器、数据库的创建以及与电子商务软件的集成,最重要的是人为问题:您是否允许每个购买密钥无限制地安装?只有1个?如果只有 1 个,那么您必须拥有客户支持和一种允许用户将其安装在新机器上的方法。这只是一个问题。各种好玩。

于 2011-08-25T09:58:42.530 回答
3

这个人写了一篇关于类似想法的博客文章,解释了他用他们自己的商业软件做了什么。还写了一份关于最明显的破解技术的建议列表。希望能帮助到你。

于 2011-08-12T13:46:19.277 回答
1

一个简单的事情是我在想只有 2 个加密字符串,现在当使用演示公钥证书成功解密时,应用程序将以演示模式运行等等。

可能是一个简单的解决方案。但是这样你就不会阻止某人对你的二进制文件进行逆向工程并使执行跳转到正确的行。每个人都有你的程序,有一个完整的版本,所以只需要找到如何打破这个简单的机制。

也许更好的解决方案是加密使用完整应用程序版本所需的部分二进制文件,而不是简单的字符串。这种执行应用程序完整版本的方式需要解密这些二进制文件才能执行它们。

请考虑到即使这样的解决方案也不够。还有其他问题:

  1. 您的工具的所有版本都将共享相同的加密密钥吗?打破其中一个打破所有..
  2. 即使您为每个发布的二进制应用程序使用不同的密钥,加密的二进制文件是否相同?一旦破解,您可以将未加密的二进制文件重新用于所有分布式应用程序。

如何解决这些问题?没有简单的解决方案。大多数具有复杂保护系统的更重要的商业软件在发布后仅几个小时或几天就被破坏了。

于 2011-08-12T12:20:21.633 回答
1

产品激活不是非对称密码学可以解决的问题。非对称密码学是关于保守对手的秘密。问题是您无法保留存储在您的对手机器上的秘密,这将是安全的,尽管默默无闻

做产品激活的正确方法。是生成存储在服务器上的数据库中的加密随机数。您在客户购买产品时将此 Nonce 提供给客户,然后他们在线激活它。此激活过程可以下载新材料,这将使攻击者更难修改他们必须“解锁”新功能的副本。

但即使使用要求您在使用产品时在线的 DRM 系统。就像在“From Dust”这样的新游戏中发现的那样,它们在发布后的几个小时内仍然被破坏。

于 2011-08-21T19:04:31.410 回答
0

公钥加密的好处之一是您可以验证给定数据的来源。因此,如果您将公钥存储在您的程序集中,然后签署给定的数据(例如授权码或序列号),您的程序集可以可验证地确定您是创建该数据的人 - 而不是黑客。实际数据本身并不是那么重要——它可以是一个简单的通过/失败值。

这实际上用 .NET 很容易做到。您可以使用 x509 证书或像我们在DeployLX Licensing the RSACryptoServiceProvider中使用的那样。

我强烈建议购买商业产品(尽管 DeployLX 非常出色,但并不重要),并且出于 2 个原因自己不要这样做

  1. 即使您是一位出色的开发人员,您也可能第一次就搞错了。并且您可能通过自己滚动获得的任何节省都将因从该错误中恢复而失去。
  2. 你会花更多的时间在你自己的系统上工作——你应该花时间让你的产品变得更好。

保护软件的第二阶段是确保它以您创建它的方式运行 - 并且没有被黑客修改。if( licensed )如果黑客可以检查到,你使用什么加密真的没关系if( true )

于 2012-03-07T22:01:14.183 回答
-2

您可以使用AsProtect解决此问题。这是一个很好的起点。

于 2011-08-22T17:52:17.420 回答