大家做项目开发一般都是分层的,比如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

from:http://www.cnblogs.com/BearsTaR/archive/2006/05/25/protectdll.html

转载于:https://www.cnblogs.com/gxh973121/archive/2006/05/26/409648.html

保护你的DLL和Code不被别人使用。相关推荐

  1. QT调用dll且进入DLL src code调试

    qt应用程序AA.exe调用qt写的BB.DLL时,进入BB.DLL src code调试 1.debug生成AA.exe 2.将debug生成的AA.exe整包debug folder放到BB.dl ...

  2. could not load library cudnn_ops_infer64_8.dll. Error code 126

    could not load library cudnn_ops_infer64_8.dll. Error code 126 解决could not load library cudnn_ops_in ...

  3. Error loading Python DLL python27.dll (error code 14001)

    先贴上环境: 开发环境: Windows10专业版 64位操作系统 版本号:20H2 python版本: Python 2.7.9, 32位的 pyinstaller版本:3.1.1 生产环境: wi ...

  4. .NET的Snk使用方法

         保护你Asp.Net生成的DLL和Code不被别人反编译     大家做项目开发一般都是分层的,比如UI层,业务层,数据访问层.业务层引用数据访问层的DLL(比如 dataAccess. ...

  5. .NET DLL 保护措施详解(四)各操作系统运行情况

    我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...

  6. C# SDK exe dll 防止反编译

    / C# SDK (Software Development Kit) exe dll 防止反编译 加密工具 dotNET Reactor 是一款强大的 .NET 代码保护和授权管理系统,安全可靠.简 ...

  7. 端游代码保护:从原生代码到游戏引擎

    近几年,移动端游戏发展迅速.在碎片化的时间争夺战中,手游因其好玩.易玩的优势,收获了大量玩家. 在此之上,部分硬核玩家为了追求更好的游戏体验,会在PC上使用模拟器来操作手游,虽然相比于原生的PC端游戏 ...

  8. Visual Studio Code中文文档(一)-快速入门

    Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行.Visual Studio Code内置了对J ...

  9. [选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)

    多年不考试,一夜回到解放前 T1:花园 title solution code T2:月亮神树 title solution code T3:保护出题人 title solution code T1: ...

最新文章

  1. oracel 不为null 保存空字符串
  2. Magazine App Demo
  3. 独家解析英伟达最新GPU-A100对AI行业带来的影响
  4. boost::phoenix::for_each相关的测试程序
  5. python开两个守护线程_python 守护线程
  6. pve安装黑群晖直通硬盘_PVE+lede+DSM网卡硬盘直通+win10
  7. 百度进军游戏;腾讯起诉抄袭者;苹果急撤 watchOS 5.1 更新 | 极客头条
  8. 由php nginx 出现 500错误的启示
  9. [贴图]博客园T恤男士版
  10. p6spy的使用和配置
  11. 樊登讲亲密关系_《亲密关系》
  12. EChart饼图文字大小调整
  13. U盘图标改变与文件隐藏
  14. Java web+MySQL编写简易候选人投票(完整代码)
  15. linux嵌入式在线升级,嵌入式linux Kernel 在线升级参考资料
  16. NASA授予下一代航天计算处理器合同,中国情况如何?
  17. SmartScreen 筛选器带来的麻烦
  18. 数据库备份-XtraBackup
  19. 网络入侵检测--Snort软件规则编写
  20. Win2019AD域DNS服务器NSLOOKUP出现 Non-existent domain访问不了某一网站

热门文章

  1. python通用数据库连接_python 连接数据库pg
  2. ts 变量后面加问号或者叹号_关于记录型信号量与TS指令的理解
  3. vue 实现文本的拖拽_基于Vue实现拖拽功能
  4. iis服务器并发支持人数 主要参数_服务器常见问题解决
  5. c语言剪枝函数,[求助]关于剪枝算法
  6. Jdk自带bin目录命令
  7. html代码id,浅谈html中id和name的区别实例代码
  8. java中 15db9742_请问我这个报错[I@15db9742是怎么回事啊?
  9. 生成新的dataframe_Python之Pandas使用系列(九):DataFrame中列操作的技巧
  10. hibernate mysql 视图_转:hibernate映射视图的两种方式