StrongName无法访问原始密钥文件的.NET程序集

Kur*_*uck 4 .net c# strongname strong-named-key

我对现有的.NET程序集dll中的代码进行了一些更改.我没有用于签署代码的密钥文件.如何在不删除StrongNames(Damages应用程序)的情况下强制.NET可执行文件加载它,而无需注册它以跳过验证(不可移植)?

zne*_*eak 12

你不能,这就是强名的全部意义.

强名称验证可执行文件未被作者非篡改.(原始密钥文件的任何人都被认为是作者.)由于您没有密钥文件,因此您不能是作者,因此强名称会阻止您执行您想要执行的更改.

如果要加载DLL,则必须使用您建议的任一解决方案.

编辑 自.NET 3.5 SP1以来,只要满足以下条件之一,就会绕过强名称验证:

  • 程序集与Authenticode完全签名;
  • 集会是完全信任的(没有任何关于其强名称证据);
  • 程序集被加载到完全受信任的AppDomain(在大多数情况下,桌面应用程序会发生这种情况);
  • 程序集从AppDomain下的某个位置加载ApplicationBase(即程序集随应用程序一起分发并存在于同一目录中).

基本上,除了Silverlight之外,每个用例都禁用了强名称验证.但是,系统管理员可以使用注册表项默认重新启用名称验证:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"AllowStrongNameBypass"=dword:00000000
Run Code Online (Sandbox Code Playgroud)

微软表示允许这种改变的原因是强名称不是完整性检查机制,而是一种程序集识别机制.对于实际的完整性检查,Authenticode是可行的方法.

这意味着,出于所有实际目的,强名称对防止篡改没有用,任何人都可以篡改任何程序集并仍然正确加载,除非系统管理员阻止它.

为了正确回答这个问题,应该提到的是,修改程序集使其强名称无效,因此如果snk不可用,则无法在不使强名称失效的情况下编辑DLL.但是,在大多数情况下,它不会阻止它加载.