当前位置:编程学习 > C#/ASP.NET >>

为何用UltraEdit修改了强签名的DLL后,先前的程序还可以正常调用?

最近在学习强签名,遇到以下疑问:

我做一个简单的DLL,将它强签名。强签名的DLL主代码如下:
using System;

namespace NET.SN
{
    public class Compile
    {
        public int I = 9;
        public string S = "SSSSSSSSSSS";
        public override string ToString()
        {
            return I.ToString() + "_" + S;
        }
    }
}

我将此DLL强签名,然后在控制台程序ConsoleApp1中引用该DLL,编译,运行正常。
然后我用UltraEdit打开所引用的强签名的DLL,找到字符串SSSSSSSSSSS的位置,手动改成了SSSSSSSSSSA,保存,然后再运行ConsoleApp1,居然正常运行!打印出来的是SSSSSSSSSSA

不是说经过强签名的程序集是可以防篡改的么?以上的事实哪里证明可以防了?

请各位指教! --------------------编程问答-------------------- 自己先支持一下吧~~ --------------------编程问答-------------------- 强签名就是唯一标识一个Assembly文件的名称。它由Assembly的文件名、版本号、区域信息、公钥信息和处理器架构信息组成
张三先将自己的身份和公钥注册在权威机构里面。 
张三发送代码给用户。 
用户去权威机构去查询张三的身份是否和他声明的相符。 
黑客发送代码给用户。 
用户去权威机构查处代码声明的身份和它实际的身份不符。因此就可以采取保护措施。 
--------------------编程问答-------------------- 同意楼上。
单个assembly强“签名”就是给一个标志用于识别,是否通过权威机构公钥体系认证就要看看应用而言了。多个assembly强签名,可以检查体系内部是否倍更改。 --------------------编程问答-------------------- 谢谢楼上两位。不过你们似乎没有解答我的问题啊。。 --------------------编程问答-------------------- 你证明了强签名的程序集是不可以防篡改的.

--------------------编程问答-------------------- to 楼上,哪里证明到了?我改了里面的字符串,它还可以被调用啊。。 --------------------编程问答-------------------- TO Dobzhansky,不好意思,我看错了,我以为你说我这是在证明可以防篡改。
没错,我的确证明了强签名不能防篡改,哈哈。。。 --------------------编程问答-------------------- 你能用这个assembly是因为,你没有核对签名。
打个比方,你买了个带防伪标识的iphone,只是这个防伪标识无法到apple那里确认(奸商自己贴的),但这个iphone的一般功能还是能用的,只有那些需要身份验证的功能不能用。 --------------------编程问答-------------------- 还是不明白呀。。倒底强签名怎样做才能完全地将DLL防篡改? --------------------编程问答-------------------- 单个assembly没法防止篡改,多个强签名的assembly,在主调单元中检查签名。 --------------------编程问答--------------------
引用楼主 randb 的回复:
最近在学习强签名,遇到以下疑问:

我做一个简单的DLL,将它强签名。强签名的DLL主代码如下:
using System;

namespace NET.SN
{
    public class Compile
    {
        public int I = 9;
        public string S = "SSSSSSSSSSS";
        public override string ToString()
        {
            return I.ToString() + "_" + S;
        }
    }
}

我将此DLL强签名,然后在控制台程序ConsoleApp1中引用该DLL,编译,运行正常。
然后我用UltraEdit打开所引用的强签名的DLL,找到字符串SSSSSSSSSSS的位置,手动改成了SSSSSSSSSSA,保存,然后再运行ConsoleApp1,居然正常运行!打印出来的是SSSSSSSSSSA

不是说经过强签名的程序集是可以防篡改的么?以上的事实哪里证明可以防了?

请各位指教!


用 UltraEdit 直接打开一个 .dll 文件,见到的就是一堆二进制

请问你是这么找到字符串 SSSSSSSSSSS 的? --------------------编程问答--------------------
引用 11 楼 cgabriel 的回复:
引用楼主 randb 的回复:最近在学习强签名,遇到以下疑问: 我做一个简单的DLL,将它强签名。强签名的DLL主代码如下: using System; namespace NET.SN {     public class Compile     {         public int I = 9;         public string S = "SSSSSSSSSSS";         public override string ToString()         {             return I.ToString() + "_" + S;         }     } } 我将此DLL强签名,然后在控制台程序ConsoleApp1中引用该DLL,编译,运行正常。然后我用UltraEdit打开所引用的强签名的DLL,找到字符串SSSSSSSSSSS的位置,手动改成了SSSSSSSSSSA,保存,然后再运行ConsoleApp1,居然正常运行!打印出来的是SSSSSSSSSSA 不是说经过强签名的程序集是可以防篡改的么?以上的事实哪里证明可以防了? 请各位指教!

用 UltraEdit 直接打开一个 .dll 文件,见到的就是一堆二进制

请问你是这么找到字符串 SSSSSSSSSSS 的?


UTLTRAEDIT 右边可以显示一些字符串的啊,你没用过?我在里面找了,就一处有SSSSSSSSSS --------------------编程问答-------------------- LZ需要的功能应该是通过Authenticode实现。对于.net assembly,须要先进性StrongName Sign,然后Authenticode Sign。

Authenticode参考:http://msdn.microsoft.com/en-us/library/ms537364(VS.85).aspx --------------------编程问答--------------------
引用 8 楼 leafold 的回复:
你能用这个assembly是因为,你没有核对签名。
打个比方,你买了个带防伪标识的iphone,只是这个防伪标识无法到apple那里确认(奸商自己贴的),但这个iphone的一般功能还是能用的,只有那些需要身份验证的功能不能用。

同意,好象.NET可以设置必须核对签名。 --------------------编程问答-------------------- 强命名好像是与程序版本有关的,防止相同名称的程序集,不同版本程序集在系统文件夹可以放在一起而使用的吧 --------------------编程问答-------------------- 你可以看到C:\Windows\assembly
文件夹中的程序集,里面有同名称程序集,不同版本的程序集
这里就是强命名程序集  强命名程序集也就是为了安装到这个文件夹中
补充:.NET技术 ,  .NET Framework
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,