签署.NET程序集:这是否真的可以防止我的程序集被篡改?

时间:2008-12-18 11:50:38

标签: clr piracy-prevention

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

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

  1. 由于我没有看到CLR曾经谈论过程序集的签名无效,我想确保这个系统真的有效。可以?我该怎么办才能让它发挥作用?
  2. 攻击者是否可以将注意力集中在CLR上,使其不关心我的签名?也就是说,如果他因为签名而无法篡改我的代码,他可以篡改CLR吗?
  3. 一般来说,我想了解您对此类安全防护和保护技术的经验。任何人都可以提出其他建议吗?

4 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:6)

对签名的程序集存在一定的误解。正如mackenir指出的那样,程序集签名不是用于防止程序集被篡改的安全机制。关于codeproject的以下文章为该主题提供了相当好的处理:

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

答案 2 :(得分:5)

仅对代码进行签名允许篡改检测,但不会阻止它。知道自己在做什么的人可以删除你的签名,如有必要,可以添加自己的签名。

实际上,大多数复制保护方案都是浪费时间而且可能被破坏,而且它们也会让您的付费客户感到厌烦。最终,您无法阻止某人在他们控制的硬件上修改和运行您的代码。只是让它变得非常困难,以便更容易去购买部门并获得支票,并且很难忘记您没有获得许可的副本。那些关心的人最终会付钱,而那些从不会付钱的人会付钱。

另请注意,即使您认为大多数人都不会打扰您的计划,或者没有这方面的技能,也没关系。因为一旦一个人破坏了你的版权保护计划,他们就可以在没有技能的情况下在torrent网站上使用它,并且游戏结束了。

答案 3 :(得分:2)

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

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