我正在我的应用程序中实现一个"锁定"系统,以保护我的应用程序免遭非法复制和使用.系统检查基于硬件的代码的签名,并期望使用仅由我公司拥有的私钥进行签名.(该应用程序已获得公钥来验证签名.)
我想确保没有人在应用程序中更改我的锁定机制,所以我想签署我的应用程序的程序集,我认为这是有道理的.
由于我还没有看到CLR曾经谈论过程序集的签名无效,我想确保这个系统真的有效.可以?我该怎么做才能让它发挥作用?
攻击者是否可以将注意力集中在CLR上,使其不关心我的签名?也就是说,如果他因为签名而无法篡改我的代码,他可以篡改CLR吗?
一般来说,我想了解您对此类安全防护和保护技术的经验.任何人都可以提出其他建议吗?
mackenir.. 12
程序集签名旨在允许应用程序/程序集引用程序集,并确保它们获得它们最初引用的程序集.如果有人想,他们理论上可以反编译整个应用程序并重新编译而不签名.(即:他们可以重新编译引用组件,以便它引用的签名版本引用的程序集).
然后,他们可以根据需要修改代码,因为客户端(exe)现在将引用未签名(或"重新签名")的dll.
要使反编译和重新编译过程更加困难,您可以尝试创建包含托管代码和本机代码的混合模式C++/CLI程序集.但是,是的...最终人们拥有你所有的二进制文件并付出足够的努力可能会绕过你想到的任何许可系统.
程序集签名旨在允许应用程序/程序集引用程序集,并确保它们获得它们最初引用的程序集.如果有人想,他们理论上可以反编译整个应用程序并重新编译而不签名.(即:他们可以重新编译引用组件,以便它引用的签名版本引用的程序集).
然后,他们可以根据需要修改代码,因为客户端(exe)现在将引用未签名(或"重新签名")的dll.
要使反编译和重新编译过程更加困难,您可以尝试创建包含托管代码和本机代码的混合模式C++/CLI程序集.但是,是的...最终人们拥有你所有的二进制文件并付出足够的努力可能会绕过你想到的任何许可系统.
关于已签名的程序集存在一定程度的误解.正如mackenir指出的那样,程序集签名不是用于防止程序集被篡改的安全机制.以下关于codeproject的文章对该主题给出了相当好的处理:
http://www.codeproject.com/KB/security/StrongNameExplained.aspx
仅对代码进行签名允许篡改检测,但不会阻止它.知道自己在做什么的人可以删除你的签名,如有必要,可以添加自己的签名.
实际上,大多数复制保护方案都是浪费时间并且可能被破坏,并且它们也往往会惹恼付费客户.最终,您无法阻止某人在他们控制的硬件上修改和运行您的代码.只是让它变得非常困难,以便更容易去购买部门并获得支票,并且很难忘记您没有获得许可的副本.那些关心的人最终会付钱,而那些不会永远不会付钱的人.
另请注意,即使您认为大多数人都不会打扰您的计划,或者没有相应的技能,也无所谓.因为一旦一个人破坏了你的版权保护计划,他们就可以在一个洪流网站上为那些没有技能的人提供它,并且游戏结束了.