【发布时间】:2012-09-10 22:37:12
【问题描述】:
我对现有 .NET 程序集 dll 中的代码进行了一些更改。我没有用于签署代码的密钥文件。如何强制 .NET 可执行文件加载它,而不注册它以跳过验证(不可移植),而不删除 StrongNames(损坏应用程序)?
【问题讨论】:
标签: c# .net strongname strong-named-key
我对现有 .NET 程序集 dll 中的代码进行了一些更改。我没有用于签署代码的密钥文件。如何强制 .NET 可执行文件加载它,而不注册它以跳过验证(不可移植),而不删除 StrongNames(损坏应用程序)?
【问题讨论】:
标签: c# .net strongname strong-named-key
你不能,这就是强名称的全部意义所在。
强名称验证可执行文件未被非作者篡改。 (任何拥有原始密钥文件的人都被认为是作者。)由于您没有密钥文件,因此您一定不是作者,并且如此强的命名会阻止您进行您想做的更改。
如果要加载 DLL,则必须使用建议的任一解决方案。
编辑Since .NET 3.5 SP1, strong name verification is bypassed至少满足以下条件之一:
ApplicationBase 下的位置加载(即程序集与应用程序一起分发并存在于同一目录中)。基本上,除了 Silverlight 之外,所有用例都禁用了强名称验证。但是,系统管理员可以默认使用注册表项重新启用名称验证:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"AllowStrongNameBypass"=dword:00000000
Microsoft 表示允许此更改的原因是 strong names were not an integrity checking mechanism 是一个程序集识别机制。对于实际的完整性检查,Authenticode 是可行的方法。
这意味着,出于所有实际目的,强名称对于防止篡改没有用处,并且任何人都可以篡改任何程序集并使其正确加载,除非系统管理员阻止它。
为了正确回答这个问题,应该提到修改程序集将使其强名称无效,因此如果不使强名称无效,则无法编辑 DLL snk 不可用。但是,在大多数情况下,它不会阻止它加载。
【讨论】:
您可以在 Reflexil(.NET Reflector 插件)中编辑 .NET dll,并在修改后的代码上保留原始签名。谢谢你的回答。
对于那些希望编辑程序集而不是退出程序集的人,请使用 Reflexil。仅仅因为人们不赞成这个答案,并不意味着它是错误的。
【讨论】: