C#dll的强命名,不检测修改

C#dll的强命名,不检测修改,c#,corruption,strongname,C#,Corruption,Strongname,我的理解是,强命名会创建程序集的加密哈希,并将其用作加载dll的强名称 我希望使用此功能检测二进制文件的损坏,以通知用户软件有问题,他们需要重新安装 这适用于对二进制文件的某些更改,但是我发现修改二进制文件,特别是二进制文件中的静态字符串,不会导致应用程序报告无法找到具有适当强名称的dll 有人能向我解释一下,使用程序集中的哪些数据来创建强名称,以及为什么强名称并不总是检测dll的修改吗?是否有一种方法可以强制它在强命名中包含其他信息 有没有其他方法可以检测二进制文件的损坏 干杯 Ryan你应该

我的理解是,强命名会创建程序集的加密哈希,并将其用作加载dll的强名称

我希望使用此功能检测二进制文件的损坏,以通知用户软件有问题,他们需要重新安装

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

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

有没有其他方法可以检测二进制文件的损坏

干杯


Ryan

你应该看看这里:和

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

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


据我所知,强命名中使用的散列包含整个文件,因此我不确定为什么某些更改没有通过验证


是否有可能将您的程序集添加到跳过验证列表中?

强命名程序集时创建的数字签名对程序集的内容进行哈希运算,除了任何身份验证码签名、程序集的强名称数据和PE标头校验和之外,然后使用私钥对哈希进行签名

可能是您正在更改的排除项之一,在这种情况下,强名称仍将正确验证,程序集仍将正常加载


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

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

这是说,有一个旁路机制,应加载组件更快时,某些条件是真实的

要禁用此旁路,请在app.config中设置一个标志

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

执行此操作后,可执行文件将在修改程序集时引发异常


感谢您的回答,但Authenticode是对程序集进行签名,以表明作者是他们所说的作者,并且软件是可信的。我关心的不是是否信任源代码,因为此软件仅供内部使用。我担心的是,该软件将在一个关键过程中使用,因此我们想知道二进制文件是否已损坏,以便我们可以通知操作员需要重新安装。不,某些更改似乎会破坏强命名,而其他更改则不会。特别是,如果修改静态编译数据(如常量或字符串)的内容,则不会收到无法找到具有正确强名称的dll的警告,并且应用程序会毫无怨言地执行,但输出不正确。