强命名保护DLL文件

Posted on 2009-03-19 14:32 花猫.NET 阅读(1390) 评论(2) 编辑 收藏 

大家做项目开发一般都是分层的,比如UI层,业务层,数据访问层。业务层引用数据访问层的DLL(比如dataAccess.dll),并使用dataAccess.dll中的方法。当项目完成并给客户用了,可有些心里BT的客户这个时候也可以请个稍微懂NET的人来引用你的dataAccess.dll并调用其中的方法搞破坏。比如可以直接使用里面的ChangePwd(string UserName,string Pwd)方法把其他用户的密码改了,这个时候就你就.......

好了,该开始说怎么保护我们的代码了:

首先我们需要把我们的程序集做成强命名的程序集。

这里我们在.NET 命令提示中输入sn -k c:"test.snk 创建一个新的随机密钥对并将其存储在 c:"test.snk 中

然后新建立类库ClassLibrary1,里面只有个类文件Class1.cs,代码如下:
 1using System;
 2
 3namespace ClassLibrary1
 4{
 5    public class Class1
 6    {
 7        public Class1()
 8        {
 9            //
10            // TODO: 在此处添加构造函数逻辑
11            //
12        }
13
14        public string Insert()
15        {
16            return "ok";
17        }
18    }
19}
20
AssemblyInfo.cs代码:
//............其他的就用默认
[assembly: AssemblyKeyFile("c:""test.snk")]   // 连接上面用强命名工具SN.exe生成的文件.

接着创建个WindowApplication来调用我们的ClassLibrary1,代码:
private void button1_Click(object sender, System.EventArgs e)
{
    MessageBox.Show(new ClassLibrary1.Class1().Insert());
}不修改WindowApplication的AssemblyInfo.cs。
在这里就可以直接运行了,不过大家都看的出来,这样是能成功调用Class1中的方法的。

现在让我们来修改下Class1.cs,代码:
using System;
using System.Security.Permissions;

namespace ClassLibrary1
{
    [StrongNameIdentityPermissionAttribute(SecurityAction.LinkDemand, PublicKey = 
         "00240000048000009400000006020000002400005253413100040000010001000551684edd1600"+
         "8ccbdd337b1cf1490490d97fe0048c5f3629cc4f5104578499eace9b2a94115022edd620def472"+
         "8b4f088291cfa77a40659afba611fdafbb7894b93a64049d439936bd0cd8dc0704625aeb735892"+
         "e9eb3f910a49a2925af10515d935654d7adac5567ff6d780d23d587de0ff4d271da7b30680fa88"+
         "a47a4ba4")]
    public class Class1
    {
        public Class1()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

public string Insert()
        {
            return "ok";
        }
    }
}

然后再编译后运行windowapplication调用class1中的方法就会出错。

这里的StrongNameIdentityPermissionAttribute是NET提供的CAS(Code Access Security)中的1个类,具体可参考MSDN,SecurityAction.LinkDemand 是要求直接调用方已被授予了指定的权限,这里即windowapplication要授予了权限才行,如果使用SecurityAction.Demand要求调用堆栈中的所有高级调用方都已被授予了当前权限对象所指定的权限。他们的区别是:如果windowapplication已授权访问,而还有个windowapplication2(未授权访问)通过调用windowapplication中的button1_Click方法来调用class1,这个时候如果使用SecurityAction.LinkDemand就能成功调用,而使用SecurityAction.Demand  windowapplication2就不能调用,windowapplication 在这2种情况下都能调用。

说到这里大家一定再问PublicKey=后面一串那么长的字符串怎么来。PublicKey后面的字符串是你开始生成的c:"test.snk文件中保存的公钥。那怎么才能看到这个公钥了,照样是用SN.EXE。

输入sn -p c:"test.snk  c:"publicKey.snk (从 test.snk 中提取公钥并将其存储在 publicKey.snk 中)

再输入sn -tp c:"publicKey.snk (显示公钥信息)
上面这个命令就能看到PublicKey后面的字符串了,还想什么啊,把那字符串copy下来啊。

最后大家一定在关心这个时候windowapplication 要怎么调用class1了,其实也简单,只要把windowapplication 的AssemblyInfo.cs修改为:
[assembly: AssemblyKeyFile("c:""test.snk")]

到这里就一切OK了,大家都看到最关键的就是test.snk文件了,所以一定要保护好你自己的test.snk文件。

下面是我的代码,大家可以下载看看,在使用的时候记的要把我KEY文件夹下的test.snk copy到c盘。
不然会出错^_^。
http://files.cnblogs.com/BearsTaR/Solution1.rar

绿色通道: 好文要顶 关注我 收藏该文与我联系 
花猫.NET
关注 - 0
粉丝 - 5
+加关注

0
0
(请您对文章做出评价)

« 上一篇:2分法-通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高)
» 下一篇:dll保护

Feedback

#1楼   回复引用

2010-06-05 15:43 by 刘先勇

写得很好!
两点建议:
1)确保附件可以下载
2)输出public key时,可使用管道,如: sn -tp c:"publicKey.snk > key.txt

转载于:https://www.cnblogs.com/yanzhenan/archive/2013/06/06/3120692.html

强命名保护DLL文件相关推荐

  1. 强命名防止dll被篡改

    今天试了下强命名是不是能够防止Dll被篡改,按照原理,如果你更改了Dll,CLR在load Dll的时候,验证是不能通过的,Dll是不会被load的. 可是实际情况not the case! 当你用B ...

  2. 如何保护.net中的dll文件(防破解、反编译)

    .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间语言,再由.net编译器 JIT 解释映象为本机代码并交付CPU执行.中间语言很容易被反编译,所以研究下如何有效的保护dll文件. ...

  3. 公共语言运行库中的程序集-04强命名的程序集

    具有强命名的程序集 强命名是由程序集的标识加上公钥和数字签名组成的.其中,程序集的标识包括简单文本名称.版本号和区域性信息(如果提供的话).强命名是使用相应的私钥,通过程序集文件(包含程序集清单的文件 ...

  4. 第 3 章 共享程序集和强命名程序集

    3.1 节 两种程序集,两种部署 CLR 支持两种程序集:弱命名程序集(weakly named assembly,即无签名的程序集) 和 强命名程序集(strongly named assembly ...

  5. 共享程序集和强命名程序集(3):强命名程序集的一些作用

    强命名程序集能防篡改 用私钥对程序集进行签名,并将公钥和签名嵌入程序集,CLR就可以炎症程序集未被修改或破坏.程序集安装到GAC时,系统对包含清单的那个文件的内容进行哈希处理,将Hash值与PE文件中 ...

  6. 所引用的程序集没有强命名解决方法

    所引用的程序集没有强命名 1.打开SDK 命令提示窗口; 也就是VS2012 开发人员命令提示,一般所在目录C:\ProgramData\Microsoft \Windows\Start Menu\P ...

  7. 为没有源码的DLL文件添加强名称

    如果项目中引用了其他没有源码的dll文件,并且此dll文件是没有强名称的程序集,则编译时会出现类似 "Assembly generation failed -- 引用的程序集 'xxxxxx ...

  8. c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序

    引子 动态链接库DLL文件不仅可以实现代码.资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言 ...

  9. [原]Asp.net替换不同版本的Dll文件碰到的问题以及解决办法.

    情景还原: 今天一个朋友说网站不能上传图片,我检查后发现一直卡住在上传页面,一直滚动,是个Fckeditor控件2.6.3的. 经过google以后得到的结论是图片上传成功,但是没有返回结果,在服务器 ...

最新文章

  1. 华为云垃圾分类AI大赛三强出炉,ModelArts2.0让行业按下AI开发“加速键”
  2. 《Redis设计与实现》简读
  3. CTFshow 命令执行 web54
  4. 我的Java开发学习之旅------Base64的编码思想以及Java实现
  5. 索引 Index -- 快速查找数据
  6. Java中 break continue return 的用法以及区别
  7. ArcGIS js Api 4.x修改三维球背景技巧
  8. Android View之布局加载流程
  9. 游戏服务器系统安装,修复Win10系统游戏服务无法安装错误 0x80073D26(4种方法)...
  10. 标题中冒号的用法_英文中冒号的各种用法
  11. 十分钟理解线性代数的本质_线性代数的本质
  12. matplotlib.pyplot 绘制图中图
  13. R 语言实战-Part 3 笔记
  14. Mac下安装DBeaver
  15. 分享一下前几个月我做的超炫的登录页面
  16. 权重 缩写 英文_常用英语术语缩写--采购
  17. 位运算实现加减乘除四则运算
  18. 中投民生:股市实战小技巧,股民必看
  19. Java自动化测试菜鸟篇六之ZTestReport报告模板及其Java文件
  20. 取消参考文献自动编号_Word2016写论文之尾注功能——参考文献自动编号与引用(包括方括号去除方法)...

热门文章

  1. java smtp收信_求一个简单java编写的邮件收发程序,邮件发送程序为smtpsend,邮件接收程序为popreceive。急需,感谢。...
  2. 2020年领导最满意的可视化工具!分分钟吊打python
  3. 数据如何成为企业未来的商业资产?
  4. sql 临时表_深度分析 | JDBC与MySQL临时表空间的分析
  5. 国内搭建vite vue和国外的不一样的,跟着教程会踩很多坑
  6. main run方法没用_多线程:解决Runnable接口无start()方法的问题
  7. axios重新调用失败的ajax_Vue之axios实现ajax数据请求
  8. 洛谷P1087 FBI树
  9. Batch入门教程(2)
  10. 【caffe】Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERRO