C#强烈命名dll,而不是检测修改

时间:2010-07-15 01:41:58

标签: c# corruption strongname

据我了解,强命名会创建程序集的加密哈希值,该哈希值用作加载dll的强名称。

我希望使用此功能来检测二进制文件的损坏,以通知用户软件存在问题,并且需要重新安装。

这适用于对二进制文件的一些更改,但是我发现修改二进制文件,特别是二进制文件中的静态字符串,不会导致应用程序报告它找不到相应强名称的dll。

有人可以向我解释一下程序集中的哪些数据用于创建强名称,以及为什么强命名并不总能检测到dll的修改?有没有办法可以强制它在强命名中包含其他信息?

我是否有另一种方法可以检测到二进制文件的损坏?

干杯

赖安

4 个答案:

答案 0 :(得分:0)

您应该在这里查看:Authenticode Signatures and Strong Name SignaturesHow do I Sign .Net assemblies with Authenticode signature?

  

这两个签名完全相互独立。强名称有助于为程序集提供唯一标识。 Authenticode允许您验证程序集的作者是谁。

  

如果两种类型的签名都应用于程序集,则强名称签名将包含在Authenticode签名中。这意味着我可以修改Authenticode签名的字节,使其在不使强名称签名失效的情况下不再有效。反之亦然 - 修改强名称签名的字节会使它和Authenticode签名无效。

答案 1 :(得分:0)

据我所知,强命名中使用的哈希包含整个文件,因此我不确定为什么某些更改不会使验证失效。

你的装配是否有可能被添加到跳过验证列表中?

答案 2 :(得分:0)

强大命名程序集时创建的数字签名散列程序集的内容,使用任何Authenticode签名的异常,程序集的强名称数据和PE头校验和,然后签署哈希用私钥。

也许这是您正在更改的被排除项目之一,在这种情况下,强名称仍将正确验证,并且程序集仍将正常加载。

根据定义,强名称由四个属性组成:文件名(减去扩展名),版本号,文化标识和公钥标记(公钥的哈希)。无法在强命名约定中包含其他信息。

答案 3 :(得分:0)

我检测到相同的行为。我强命名了程序集,然后使用十六进制编辑器修改了一些静态字符串。令人惊讶的是,正在加载程序集的可执行文件没有引发任何异常,而只是加载了更改后的库。 在Microsoft文档中进行了一些搜索之后,我发现了一条提示对我有帮助。

这是说有一种旁路机制,在某些情况下,该机制可以更快地加载程序集。

https://docs.microsoft.com/de-de/dotnet/standard/assembly/create-use-strong-named#bypass-signature-verification-of-trusted-assemblies

要禁用此旁路功能,请在app.config中添加一个标志。

<runtime>
   <bypassTrustedAppStrongNames enabled="false" />
</runtime>

这样做之后,在修改程序集时,可执行文件将引发异常。

enter image description here