首页 新闻 会员 周边

强名称程序集被篡改后仍然正常运行,为什么?

0
悬赏园豆:20 [待解决问题]

按照CLR via C#中的说法,"如果强名称程序集的文件是从GAC之外的一个位置加载的,CLR会在程序集加载时比较哈希值.换言之,应用程序每次执行并加载程序集时,都会对文件执行一次哈希处理,以牺牲一定性能为代价,保证程序集文件的内容没有被篡改.CLR在运行时检测到不匹配的哈希值,会抛出一个System.IO.FileLoadException异常."

然而我进行了实验,修改了一个强命名的程序集,运行时并未抛出异常.实验方法如下:

程序集代码: 

class Program
{
public static void Main()
{
System.Console.WriteLine(
"xxxxxxxxxxxxxxxxxxx");
}
}

生成密钥:

 

sn -k myKey.snk

编译强命名程序集:

csc /keyfile:mykey.snk main.cs

修改程序集:

用16进制编辑器打开main.exe,找到字符串"xxxxxxxxxxxxxxxxxxx"(78 00 78 00...),修改成"yxxxxxxxxxxxxxxxxxx"(79 00 78 00...),保存.

运行main.exe,正常输出yxxxxxxxxxxxxxxxxxx,并未抛出System.IO.FileLoadException异常,为什么?

013231的主页 013231 | 初学一级 | 园豆:135
提问于:2011-02-28 13:50
< >
分享
所有回答(1)
1

按照MSDN的说法,.net 3以后,对于Full Trust的程序集是不进行强名检查的

你的这个例子由于不是部署在GAC中的,认为是Full Trust的,所以符合这个条件,没有进行检查

如果强制它验证,参考http://msdn.microsoft.com/en-us/library/cc679069.aspx加上配置项再运行就出错了,此时进行了强名检查

这样也是有一定的方便性,如果程序集放在自己的目录,一般情况下肯定是信任的

安全性的保证: 如果这样的修改的程序集如果要放到gac中,是放不了的,因为sn -v main.exe会检测到修改的问题

2012 | 园豆:21230 (高人七级) | 2011-03-01 14:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册