我对现有 .NET 程序集 dll 中的代码进行了一些更改。我没有用于签署代码的密钥文件。如何强制 .NET 可执行文件加载它,而不注册它以跳过验证(不可移植),而不删除 StrongNames(损坏应用程序)?
2 回答
你不能,这就是强名称的全部意义所在。
强名称验证可执行文件未被非作者篡改。(假定拥有原始密钥文件的任何人都是作者。)由于您没有密钥文件,因此您一定不是作者,并且如此强的命名会阻止您进行您想做的更改。
如果要加载 DLL,则必须使用建议的任一解决方案。
编辑 自 .NET 3.5 SP1 起,只要满足以下条件之一,就会绕过强名称验证:
- 该程序集已使用 Authenticode 完全签名;
- 程序集完全受信任(不考虑其强大的名称证据);
- 程序集被加载到完全受信任的 AppDomain 中(在大多数情况下桌面应用程序都会发生这种情况);
- 程序集是从 AppDomain 下的位置加载的
ApplicationBase
(即程序集与应用程序一起分发并存在于同一目录中)。
基本上,除了 Silverlight 之外,每个用例都禁用了强名称验证。但是,系统管理员可以默认使用注册表项重新启用名称验证:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"AllowStrongNameBypass"=dword:00000000
微软表示,允许这种更改的原因是强名称不是一种完整性检查机制,而是一种程序集识别机制。对于实际的完整性检查,Authenticode 是要走的路。
这意味着出于所有实际目的,强名称对于防止篡改没有用处,并且任何人都可以篡改任何程序集并且仍然可以正确加载它,除非系统管理员阻止它。
为了正确回答这个问题,应该提到修改程序集将使其强名称无效,因此如果 snk 不可用,则无法在不使强名称无效的情况下编辑 DLL。但是,在大多数情况下,它不会阻止它加载。
您可以在 Reflexil(.NET Reflector 插件)中编辑 .NET dll,并在修改后的代码上保留原始签名。谢谢您的回答。
对于那些希望编辑程序集而不退出程序集的人,请使用 Reflexil。仅仅因为人们不赞成这个答案,并不意味着它是错误的。