14

我正在我的应用程序中实施一个“锁定”系统,以保护我的应用程序不被非法复制和使用。系统检查基于硬件的代码的签名,并期望使用只有我公司拥有的私钥对其进行签名。(该应用程序已获得用于验证签名的公钥。)

我想确保没有人更改我在应用程序中的锁定机制,所以我想签署我的应用程序程序集,我认为这是有道理的。

  1. 由于我从未见过 CLR 谈论过程序集的签名无效,因此我想确保该系统确实有效。可以?我应该怎么做才能让它工作?
  2. 攻击者能否将精力集中在 CLR 上,使其不关心我的签名?也就是说,如果他不能因为我已经签名而篡改我的代码,他可以篡改CLR吗?
  3. 一般来说,我想知道您对此类安全防护和保护技术的经验。任何人都可以提出其他建议吗?
4

4 回答 4

12

程序集签名旨在允许应用程序/程序集引用程序集并确保它们获得最初引用的程序集。如果有人愿意,理论上他们可以反编译您的整个应用程序并重新编译而无需签名。(即:他们可以重新编译引用程序集,以便它引用被引用程序集的未签名版本)。

然后他们将能够根据需要修改代码,因为客户端 (exe) 现在将引用未签名(或“重新签名”)的 dll。

为了使反编译和重新编译过程更加困难,您可以尝试创建一个包含托管代码和本机代码的混合模式 C++/CLI 程序集。但是,是的……最终人们手头有你所有的二进制文件,只要付出足够的努力,你就可以绕过你想到的任何许可系统。

于 2008-12-18T12:02:44.300 回答
6

对已签名的程序集存在一定程度的误解。正如 mackenir 所指出的,程序集签名并不是一种用于防止程序集被篡改的安全机制。以下关于 codeproject 的文章对该主题进行了很好的处理:

http://www.codeproject.com/KB/security/StrongNameExplained.aspx

于 2008-12-18T12:29:26.367 回答
5

签署您的代码只允许篡改检测,它不会阻止它。知道自己在做什么的人可以删除您的签名,并在必要时添加自己的签名。

确实,大多数复制保护方案都是浪费时间并且可以被颠覆,而且它们也往往会惹恼您的付费客户。最终,您无法阻止某人在他们控制的硬件上修改和运行您的代码。只是让它变得足够困难,以便更容易去采购部门并获得书面支票,并且很难忘记您没有获得许可副本。那些关心的人最终会付出代价,而那些不关心的人永远不会。

另请注意,即使您认为大多数人不会费心破解您的计划,或者没有这样做的技能,也没关系。因为一旦有人颠覆了您的版权保护方案,他们就可以在洪流网站上将其提供给那些没有技能的人,然后游戏就结束了。

于 2008-12-18T12:00:51.057 回答
2

您可以使用的一种技术是防止篡改,即使用程序集的公钥来加密软件的重要部分,例如应用程序/算法参数。如果公钥已更改,则解密将无法进行,您的应用程序将崩溃。

一些混淆器(例如Crypto Obfuscator )将此技术与字符串加密功能一起使用。它使用程序集的公钥来加密所有字符串。如果公钥已更改或删除,解密将失败,您的应用程序甚至无法启动。

于 2009-11-04T09:44:35.547 回答