没有强名称的.NET程序集是否可以防止意外损坏?

时间:2015-07-03 08:27:41

标签: c# .net clr assemblies

假设我构建一个.NET程序集并且没有使用强名称签名,然后将其复制到某个存储,然后复制到另一个存储,然后最终生成。如果一部分或两个程序集内容被意外更改(某些硬件问题或类似的东西),.NET运行时是否有可能没有注意到它并仍然认为程序集图像有效?

3 个答案:

答案 0 :(得分:6)

写下这个程序:

using System;

namespace ConsoleApplication13
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world!");
        }
    }
}

编译它,运行它......

现在在Notepad ++中打开它,转到查找,选择扩展研究类型,搜索H\0 ...找到H NUL e NUL l ...并将H替换为{{ 1}} ...保存并重新启动...

X

请注意,强名称程序集无法正常验证...尝试添加强名称... compile ... run

Xello world!

并检查它是否正确...

现在修改它......重新运行

sn -v yourprogram.exe

并看到验证失败......

现在尝试运行它......它运行正常!

来自MSDN

  

从.NET Framework 3.5版Service Pack 1(SP1)开始,当程序集加载到完全信任的AppDomain对象(例如MyComputer区域的默认AppDomain)时,不会验证强名称签名。

答案 1 :(得分:1)

是的,有机会。

让我们回答这个问题。

我可以随意更改程序集中的任何一位并仍然执行/使用它吗?

不,在加载和执行期间会读取大量的位和字节,并且大多数都很重要。

如果文本或数字(基本上是数据)发生变化,则机会会逐渐降低,但不会完全降至零,具体取决于更改的确切数据。

所以问题的答案是:

  • 程序集可能能够加载和执行,但可能有错误/奇怪的结果
  • 程序集可能无法加载

然而,无论如何都无法保证。

答案 2 :(得分:0)

不确定你的意思.net运行时不会注意到它? 如果没有强签名,.net运行时将不会运行DLL验证。它会尝试加载DLL。 如果更改破坏了dll,则dll加载将失败。