2012-03-07 72 views
2

需要保护某些程序集免于修改(换句话说,如何确定程序集编译后是否修改了程序集二进制文件)。我怎么能通过内置的.NET手段在.NET 4.0中实现这一点?如何保护修改的C#代码

问题只出在DLL文件修改检测,而不是防止反编译,逆向工程等。

回答

2

您可以我们强名称程序集(见HERE)。
他们有一个公钥和附加数字签名,一旦他们被改变,他们将不会被JIT了加载:

强名称提供了有力的完整性检查。通过.NET 框架安全检查保证程序集 的内容自构建以来未被更改。

但是作为史蒂夫提到它并不是绝对安全!

+0

这只适用于主程序集(.exe)未更改的情况。 – 2012-03-07 16:02:00

0

我建议在编译时做一个哈希程序集。将它存储在应用程序的某个位置,并在运行时用程序集的新计算散列进行检查。

由于@Steve建议(和其他人)使用这个过程被称为“强命名程序集”

+0

这是强名的全部目的。 – Steve 2012-03-07 15:52:19

+2

修改后,你怎么知道它是你的(原始)散列? – 2012-03-07 15:53:09

+0

啊谢谢史蒂夫从来没有新的“强名签名”! – RvdK 2012-03-07 15:54:46

0

Strong name signing your DLL并使用您的引用(包括签名)的完全限定名称应该有助于此。

这不是傻瓜式的 - 有人可以随时反汇编DLL,但也可以反汇编使用它的任何其他应用程序,并将这些引用更新为其新版本的DLL。

3

不幸的是,强名称为消费者提供保护。它们对程序集的开发者没有保护,他们的代码没有被修改过。这对remove a strong name是微不足道的。一旦删除它可以根据需要进行修改。

即使提供给消费者的保护也受到强名的限制。由于没有公共密钥的中央注册表,因此无法知道该程序集是否由特定发布者签名。黑客可以在修改后更改签名并使用自己的密钥进行签名。事实上,强名称实际上只能防止黑客修改系统运行时库......即使如此,我也不确定它们对系统的实际攻击有多有效。

由于代码可以是easily modified,即使强命名,在您自己的代码中添加某种简单的哈希检查也不会提供任何额外的保护。有任何希望的唯一方法是使用专业级software protection tool,提供tamper detection