使用SNK密钥文件保护你的DLL和代码不被反编译

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

  代码如下:

  using System;

  namespace ClassLibrary1

  {

  public class Class1

  {

  public Class1()

  {

  //

  // TODO: 在此处添加构造函数逻辑

  //

  }

  public string Insert()

  {

  return "ok";

  }

  }

  }

  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文件。

时间: 2024-11-05 18:10:58

使用SNK密钥文件保护你的DLL和代码不被反编译的相关文章

使用SNK密钥文件保护你的DLL和代码不被反编译教程_实用技巧

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

ILSpy反编译DLL文件后改动其中一小部分,怎么再将其编译到该DLL中

问题描述 各位大神们,我用ILSpy反编译.net程序里的Dll文件后,将其中一个文件保存为.cs文件并修改后,怎么将其再编译到该Dll文件? 解决方案 解决方案二:有没有人能给解答一下啊,小女子感激不尽!!!解决方案三:你先学会不用反编译怎么生成dll文件,然后把你反编译并修改过的代码粘进去生成就行了解决方案四:如果改动很小,可以用一些支持.net元数据分析的工具比如CFFExplorer找到方法的位置,用16进制编辑工具修改方法体.也有直接支持分析和修改的比如SAE,还有作为插件的Refle

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

.net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间语言,再由.net编译器 JIT 解释映象为本机代码并交付CPU执行.中间语言很容易被反编译,所以研究下如何有效的保护dll文件. 我大致的方法为 :强签名+混淆+加密. 强签名 强命名程序集,可以确保你的程序集唯一,而不被篡改.冒用等:即使相同名字的程序集如果签名也会不同. 强签名很简单,本站另一文章已经详细进行了讲解,请参考:http://www.cn-web.com/shtml/article/net /fxsj/2009

反编译-有没有篡改exe dll的方法?

问题描述 有没有篡改exe dll的方法? 我想改编一个exe(C#),我试着反编译了它和他所有的dll, 然后发现程序里有奇怪的引用,让我无法启动项目. 我自己的目的就是改编这个exe不超10行的代码,有没有比反编译更奏效的改编方法? 解决方案 修改 EXE 中资源比较简单,但想改功能代码基本上是不可能的. 除非你全部反成汇编,或者使用 C# 专用反编译工具. 解决方案二: 如果没加壳并混淆的话,改个资源,加上一些简单功能跳转,还是很容易实现的.否则就比较麻烦了.你可以去看雪论坛问问 解决方案

关于dll的反编译问题,请高手指点

问题描述 近日做工程,得到一份dll,是用.net编写的源代码,语言是c++.我特别想将该dll反编译回c++源代码,因为里面有很多我关心的物理.技术等细节问题(汇编语言的话读来可能意义不大了,我对汇编语言也不熟).高手们从第一句话就可以看出,我对编程并不专业.我先从网上找到reflectorfor.net(最新的)想直接反编译回c++的源代码,但得到"cannotfindacliheader".又经过一番学习,我找到了peid0.94,对dll进行察看,得到以下信息:entrypoi

大家来讨论一下如何防止编译后的dll文件被反编译~~~~~

问题描述 最近在开发网站的时候因为有些加了限制但还不想被反编译,不知道用什么方法好,请大家讨论一下我使用了一下dotfuscator工具,但是老出错误,我的操作如下选择目录bin/*.dll全选生成模糊dll然后再使用ie浏览页面的时候忽然提示找不到App_Web_index.aspx.28963a75.dll比较郁闷 解决方案 解决方案二:请问有没有什么更高效更好用的防止反编译的方法呢解决方案三:.NET时代代码还有什么好保密的呢,大家都是用那个类库解决方案四: 解决方案五:不让别人看懂道可以

resharper如何反编译封装好的dll

问题描述 resharper如何反编译封装好的dll,在网上没有找到方法. 解决方案 解决方案二:什么叫封装好的,只要是托管dll,如果没有加密防止反编译的话,都可以,比如NETReflector这个工具就很好用解决方案三: 解决方案四:引用1楼bdmh的回复: 什么叫封装好的,只要是托管dll,如果没有加密防止反编译的话,都可以,比如NETReflector这个工具就很好用 resharper这个工具不行吗

软件-关于反编译DLL文件的问题

问题描述 关于反编译DLL文件的问题 我想问下,现在有写好的DLL反编译软件嘛?我有个DLL文件里面设置了个生效日期,我能看到这个生效日期到什么时候甚至能修改嘛? 解决方案 有反编译的DLL文件,你去网上找找

新手请教dll反编译后的问题

问题描述 请教高手,Index.aspx中代码是:<%@PageLanguage="C#"Inherits="ReadygoNews.Pages.TempTrans"EnableSessionState="false"EnableViewState="false"%><%Trans(TemplateType.Index);%>是不是继承ReadygoNews.dll这个啊?我用ILSpy.exe反编译后