3

我搜索了保护 .net 程序集免受欺骗,发现这篇文章非常有用。但是,我在帖子中看到了一个非常明显的矛盾。有一点指出,如果用户是同谋,则强名称是没有用的:

但是,如果用户是欺骗的同谋(如果他试图作弊,就会出现这种情况),那么代码签名将只不过是一个减速带,并不能提供真正的保护。当然,强名称不提供与例如 PunkBuster 相媲美的保护。

几行之后,作者完全相反地陈述了一些事情:

然后,当您添加对已签名程序集的引用时,如果有人尝试使用相同的程序集名称(不是完全限定的程序集,只是没有版本、哈希和公钥的名称)和相同类型名称的不同程序集,则尝试加载类型时CLR填充失败,表示找不到;使用完全限定的程序集名称以及命名空间和类型名称来解析类型。

所以:

1)这是矛盾还是我失去了什么?第一段中的作者是否在谈论验证强名称被禁用并且不会重新启用的情况?

此外,令人惊讶的是,它指出:

如果攻击者能够修改您引用的程序集的强名称,那么他们就可以轻松修改您的程序集和所有其他参与执行的程序集

2) 如何修改已部署程序集(例如 DLL)的强名称?

4

1 回答 1

1

这里似乎没有矛盾 - 第二个引用正确地表明,简单地将引用的程序集替换为另一个包含相同名称类型、具有不同(或没有)强名称的程序集将失败,因为此程序集将不匹配参考文献中指出的那个。本质上,这是系统保护自己免受用户非预期修改的方式。

但是,如果打算进行修改(用户是同谋,根据第一个引号),那么有简单的方法可以加载修改后的程序集,例如通过禁用强名称检查(这将允许程序集具有无效签名,比如说因为它已经被修改)仍然被加载,或者通过改变程序集引用本身。

在回答您的第二个问题时,虽然标准程序集签名工具sn没有选项可以将程序集的强名称替换为另一个,但这当然是可能的,并且简单的搜索应该会找到能够这样做的各种工具。(事实上​​,用一个简单的十六进制编辑器就很容易做到)。

于 2013-01-04T16:40:05.453 回答