【问题标题】:StrongName a .NET assembly without access to original keyfileStrongName 一个 .NET 程序集,无需访问原始密钥文件
【发布时间】:2012-09-10 22:37:12
【问题描述】:

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

【问题讨论】:

    标签: c# .net strongname strong-named-key


    【解决方案1】:

    你不能,这就是强名称的全部意义所在。

    强名称验证可执行文件未被非作者篡改。 (任何拥有原始密钥文件的人都被认为是作者。)由于您没有密钥文件,因此您一定不是作者,并且如此强的命名会阻止您进行您想做的更改。

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

    编辑Since .NET 3.5 SP1, strong name verification is bypassed至少满足以下条件之一:

    • 程序集已使用 Authenticode 完全签名;
    • 程序集完全受信任(不考虑其强大的名称证据);
    • 程序集被加载到完全受信任的 AppDomain 中(在大多数情况下桌面应用程序都会发生这种情况);
    • 程序集从 AppDomain 的ApplicationBase 下的位置加载(即程序集与应用程序一起分发并存在于同一目录中)。

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

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
    "AllowStrongNameBypass"=dword:00000000
    

    Microsoft 表示允许此更改的原因是 strong names were not an integrity checking mechanism 是一个程序集识别机制。对于实际的完整性检查,Authenticode 是可行的方法。

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

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

    【讨论】:

    • 如果您找到了,请随时通知我们。您有权访问应用程序的源代码吗?
    • 不好笑,但我真的希望你不能。
    • 就像我说的,我正在查看一个经过编辑并与未修改的 .NET 应用程序一起使用的 DLL。我真的很想知道这个人是怎么做到的。
    • 当然可以编辑。您可以通过 reflexil 或 ilspy 导出所有源代码并重新编译。如果你愿意的话,你可以简单地导出 MSIL 程序集并将其移植到一个新的可执行文件中。强签绝对可以绕过,能保留吗?我不这么认为,但这不是问题。
    【解决方案2】:

    您可以在 Reflexil(.NET Reflector 插件)中编辑 .NET dll,并在修改后的代码上保留原始签名。谢谢你的回答。

    对于那些希望编辑程序集而不是退出程序集的人,请使用 Reflexil。仅仅因为人们不赞成这个答案,并不意味着它是错误的。

    【讨论】:

    • 真的吗? Reflexil 页面说您可以删除强名称(并相应地编辑来自其他程序集的引用),但您可以保留原始签名 更改程序集似乎在密码学上令人怀疑。介意解释一下你是怎么做到的吗?
    • 通过获取原始 dll,修改您想要的方法/等...,保存程序集,然后执行延迟签名。我有这方面的证据,但我不确定我是否可以发布我这样做的 dll。
    • Delayed signatures don't constitute a valid strong name。你确定你不只是关闭了对你的 DLL 的验证吗?
    • 你没有读懂我在说什么。我不会辞职,我根本不会改变签名(延迟不会改变它)。我 100% 肯定我不只是转而删除强名称,因为 a) 破坏了应用程序,b) 我没有“意外”按下 5 个不同的按钮并删除强名称,以及 c) 大约有 50 人使用我修改后的 dll。谢谢。
    • 我通过电子邮件向 Reflexil 的作者发送了电子邮件以确认并收到了 interesting answer(法语)。使用 Reflexil 编辑程序集确实删除强名称并将其替换为延迟签名,但大多数情况下这不会阻止程序集加载。这个答案是错误的,因为它确实删除了原始签名,但在大多数情况下,它不会阻止程序集加载(并且不会损坏应用程序,如问题中所述)。跨度>
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2021-05-28
    • 2018-01-31
    • 2012-12-15
    相关资源
    最近更新 更多