如何在VS 2010或VS 2013中分析已签名的程序集

27

我有一个使用AjaxControlToolkit.dll和Log4Net.dll的网站。

当我在VS 2010中尝试运行性能分析工具时,它会给我以下警告:

AjaxControlToolkit.dll已签名,对其进行仪器化将使其签名无效。如果您在不进行后续仪器事件重新签名二进制文件的情况下继续进行,则可能无法正确加载。

现在,如果我选择不重新签名的选项,则分析开始,但程序集不会加载,并引发ASP.NET异常。


请注意,[PathofDLL](根据Vince&ghusse的答案)将位于obj项目文件夹中,而不是bin文件夹中。 - Mark
6个回答

21
如果您是在开发计算机上进行此操作,可以使用sn -Vr *完全禁用强名称验证。如果这样做,您就不必重新签名任何内容。这种方法可能存在安全风险,但是如果您对此感到舒适,那么它比重新签名更容易。
具体来说,从MSDN中可以看到:
注册需要跳过验证的程序集。可选择指定逗号分隔的用户名列表。如果指定infile,则保持启用验证,但在验证操作中使用infile中的公钥。程序集可以指定为*,strongname以注册具有指定强名称的所有程序集。应将Strongname指定为表示令牌化公钥的十六进制数字字符串。请参阅-t和-T选项以显示公钥令牌。
同时也存在安全风险:
注意:只能在开发期间使用此选项。将程序集添加到跳过验证列表会创建安全漏洞。恶意程序集可以使用添加到跳过验证列表的程序集的完整指定程序集名称(程序集名称、版本、区域性和公钥令牌)来伪造其身份。这将允许恶意程序集跳过验证。

7
不要忘记相反的意思: sn -Vu * (这是重新启用此方法进行验证) - Sean Aitken
2
sn -Vx 还重新启用了所有程序集的验证。引用文档中的话:“删除所有跳过验证的条目。”。 - user456814
1
对于需要进行第三方程序集的分析,但我没有签名密钥,这被证明是我能够使用的唯一解决方案。 - Blake Mitchell
1
那么...是 sn -Vu* 还是 sn -Vx 呢? :) - Ignacio Soler Garcia
1
比添加后置仪器事件快得多,您不必记住添加/删除条目,而且可以使用Vx命令轻松撤消。 - jbeanky
显示剩余3条评论

17

ghusse链接到一个包含答案的博客文章。答案在那里描述。正如他所指出的,您必须在每个已签名的程序集上使用后置事件。

直接调用sn.exe是最简单的方法:

"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -R [pathOfDll] [pathOfSNK]

请注意,[pathOfDll]位于与项目关联的目录obj\Debug中。


这是什么答案?它应该在哪里被调用? - serhio
答案是ghusse提供的链接:http://blogs.msdn.com/b/ianhu/archive/2005/07/25/443021.aspx。 - Vince
1
这似乎已经帮我解决了最初的问题,但不幸的是,在此之后启动Web服务器时遇到了问题。我还要注意的是,当你像我们项目中一样有30多个程序集时,为每个程序集实现此事件是很麻烦的。 - jpierson
sn.exe 可能位于不同的位置。例如,在我的情况下,它位于 "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\sn.exe"。因此,如果您找不到它,请在 Windows 驱动器中搜索 sn.exe。 - Abdul Rauf


5

让未重新签名的已签名二进制文件进行检测的最简单方法是完全禁用签名检查。这是一项机器范围内的设置,您可以通过为 * 模式注册例外来激活该设置:

sn.exe -Vr *

这个命令必须从管理员权限的命令提示符中执行。你可以在SDK中找到sn.exe(在我的情况下,我在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin中找到了它)。

当测试完成后,应该注销该异常:

sn.exe -Vu *

否则,您的机器可能会受到恶意代码的攻击,因为即使程序集被篡改,它们也会被信任。
另请参阅在Windows 7上运行sn.exe时访问被拒绝

1

性能分析器可能会更改程序集,因为它之前被签名过。 显然,您需要添加一个后置操作,对程序集进行重新签名。

这可能是一个问题,因为您没有用于签署第三方程序集的 sn 文件。


0
可能我有点懒,但最终我通过编写 PowerShell 脚本来取消解决方案中所有项目的签名 -- 运行得很好。作为脚本的一部分,我保存了原始的 csproj 文件,以便在需要时可以还原它们。(你也可以在源代码控制中撤销更改)。

http://pastebin.com/UbABvz7d

应该能够通过调用传递-revert开关来撤消。


请注意,这可能不适用于所有遇到类似问题的人。CodeAnalysis规则Code Analysis rule CA2240可能会导致编译错误,并且使用InternalsVisibleTo属性也无法解决此问题。 - Johny Skovdal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接