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