知识大全 怎样保护你的.NET程序

Posted

篇首语:春蚕到死丝方尽,人至期颐亦不休。一息尚存须努力,留作青年好范畴。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 怎样保护你的.NET程序相关的知识,希望对你有一定的参考价值。

怎样保护你的.NET程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  摘要 阐述怎样保护用Microsoft Net开发的软件代码的安全性 本人通过一次实际开发 总结出一个有效的方法

  众所周知 软件产品是智力的成果 是具有无形价值 而软件又是极其容易复制 所以牵涉到版权的问题 一个公司或个人辛辛苦苦开发出来的软件 突然发现被别人窃用了 那是一件非常令人难过的事

  微软公司的 NET开发效率非常高 使用Microsoft Visual Studio NET 开发工具 参考 NET Framework SDK 你很快能开发出实用的程序 快速而且高效

  最近我公司开发了一个大型网站开发项目 其中包括了一个网站后台管理系统(CMS) 是用C#开发 整个项目开发效率很高 使用Microsoft Visual Studio NET 开发工具 自动生成aspx页面 在项目实施阶段 出现了一个问题 因为对方公司项目款还没完全给付 所以需要对相关代码进行保护 防止被窃用 损害本公司利益

  但是MSIL本身是很容易被反编译的 利用像 ILDASM( NET Framework SDK 附带的 MSIL 反汇编程序)这样的工具或诸如 Anakrino 和 Reflector for NET 这样的反编译程序 任何人都可以轻松地研究您的程序集并利用反向工程将它们转换为可读的源代码 黑客可以搜索可利用的安全漏洞 盗取独特的思想 甚至破解程序

  由此 我想到了 应该对这些代码进行某种程度的保护 想过加密 但怕影响程序速度 后来决定采用模糊处理 它将帮助防止反向工程 模糊处理是一种提供程序集中无缝重命名的符号以及阻止反编译程序的其他技巧的技术 正确应用该技术后 模糊处理可以极大地增加免遭反编译的保护 而使应用程序不受任何损害 模糊处理通常用于 Java 环境中 很多年来一直用于公司保护基于 Java 的产品的知识产权 很多第三方根据需要创建了适用于 NET 代码的模糊处理程序 Microsoft 在与 PreEmptive Solutions 的合作中将 Dotfuscator Community Edition 包括在 Visual Studio® NET 中 提供了多种模糊处理程序包

  经过一段时间的研究 发现目前有几种基于 NET的模糊工具

    Dotfuscator Community Edition 我最不喜欢的混淆器 由于是 免费版 所以必须混淆所有模块 导致部分功能不能使用 但我们不关心那些 我们一会将展现被混淆的注册代码(因为类和方法都被混淆 所以必须要花点时间)     XeonCode 一个相对强大的混淆工具 我一直认为他与某著名的反编译工具捆绑 导至其它工具能反编译的代码而它不能反编译 我们把它的强度开到最大 勾上所有能勾的选项 (它混淆的Windows Application可以正常运行)     MaxtoCode 这是一个加密器 可以与XeonCode叠加使用 并且在 版中 将会加入自混淆功能 成为混淆加密一体化的工具 (它混淆的 Windows Applicaton 可以正常运行)

  由于Dotfuscator Community Edition是微软自带的一个模糊工具 而且最主要是免费软件 所以决定采用这个工具对我们写的代码进行保护

  先了解一下模糊处理的原理及效果  

  模糊处理是使用一套相关的技术完成的 它的目标就是隐藏程序的意图 而不更改其运行时行为 它并不是加密 但在 NET 代码的上下文中 它可能会更好 您可以加密 NET 程序集以使它们完全不可读 但是 这种方法会面临进退两难的局面 - 因为运行库必须执行未加密过的代码 而加密密钥必须保存在已加密的程序中 因此 可以创建一个自动的实用工具来恢复密钥 解密代码 然后将 IL 以其原始的格式写入磁盘 只要发生这种情况 程序就完全暴露于反编译

  作一个比喻 加密就像将六道菜锁入了一个带锁的盒子中 只有希望进餐的人(在这个例子中是 CLR)才有钥匙 我们并不想让其他任何人知道他或她想吃什么东西 遗憾的是 就餐时食物将会被所有旁观者一览无余 模糊处理工作就像是将六道菜放入了搅拌器 然后将其放入塑料袋送给进餐者 当然 每个人都可以看到传递中的食物 但是除了幸运的豌豆或者某些牛肉色的糊状物之外 他们并不知道原来的菜到底是什么 进餐者仍然获得了想要的菜肴 并且菜肴仍然提供了与以前相同的营养价值(幸好 CLR 并不过分挑剔味道如何) 模糊处理程序的诀窍就是使观察者糊涂 同时仍然为 CLR 提供相同的产品

  当然 模糊处理(或者加密)并不是百分之百的安全 即使编译的 C++ 也可以被反汇编 如果黑客足够有耐力 她可以重新生成您的代码  先启动Microsoft Visual Studio NET 〉Visual Studio NET 工具 〉Dotfuscator Community Edition 我们将得到以下的界面

  我们新产生一个模糊处理项目 在 触发器 选项中 选择一个要进行模糊处理的dll 如图

  然后在 重命名 项中 选择要进行模糊处理的类 如图所示

  然后点击 生成 按钮 生成一个进行了模糊处理的dll

  为了查看处理效果 将前后代码进行对比 我用一个现在流行的MSIL反编译工具进行反编译

  模糊处理前

  反编译的效果如

public static DataTable DeleteData(DataTable table int templateid ArrayList deletelist ref ArrayList RowIDS)      TemplateInfo info = DataTemplate GetTemplate(templateid);      DataTable table = table Copy();      ArrayList list = (ArrayList) RowIDS Clone();      string text = Env GetIndustryDbConnStr(DataTemplate getIndustry(info DeptID));      ArrayList list = DataTemplate GetDeleteTables(table info DeptID);      for (int num = ; num < deletelist Count; num ++)                  int num = Convert ToInt (deletelist[num ]);            Hashtable hashtable = (Hashtable) RowIDS[num ];            RowIDS RemoveAt(num );            for (int num = ; num < list Count; num ++)                              string text = list [num ] ToString();                  int num = Convert ToInt (hashtable [text ]);                  if (((text != Product ) && (text != Area )) && (text != Company ))                                          for (int num = ; num < RowIDS Count; num ++)                                                      Hashtable hashtable = (Hashtable) RowIDS[num ];                              int num = Convert ToInt (hashtable [text ]);                              if (num == num )                                                                  table Rows RemoveAt(num );                                    RowIDS RemoveAt(num );                                                                              string text = string Concat(new string[] Delete from text where DataTemplate GetTableID(text info DeptID) = num ToString() );                        int num = ;                        try                                                      SqlHelper ExecuteNonQuery(text CommandType Text text );                                                catch (Exception exception )                                                      string text = exception Message;                                                                  return table ;

 可以看出 和原始代码相差无几   对模糊处理后进行反编译 代码如下   public static DataTable DeleteData(DataTable table int templateid ArrayList deletelist ref ArrayList RowIDS)        d d = DataTemplate c(templateid);       DataTable table = table Copy();       ArrayList list = (ArrayList) RowIDS Clone();       string text = o a(DataTemplate a(d h));       ArrayList list = DataTemplate b(table d h);       for (int num = ; num < deletelist Count; num ++)                    int num = Convert ToInt (deletelist[num ]);             Hashtable hashtable = (Hashtable) RowIDS[num ];             RowIDS RemoveAt(num );             for (int num = ; num < list Count; num ++)                                string text = list [num ] ToString();                   int num = Convert ToInt (hashtable [text ]);                   if (((text != Product ) && (text != Area )) && (text != Company ))                                            for (int num = ; num < RowIDS Count; num ++)                                                        Hashtable hashtable = (Hashtable) RowIDS[num ];                               int num = Convert ToInt (hashtable [text ]);                               if (num == num )                                                                    table Rows RemoveAt(num );                                     RowIDS RemoveAt(num );                                                                                 string text = string Concat(new string[] Delete from text where DataTemplate f(text d h) = num ToString() );                         int num = ;                         try                                                        v d(text CommandType Text text );                                                  catch (Exception exception )                                                        string text = exception Message;                                                                       return table ; 

  可以看出 模糊处理对相应的类 方法进行了重命名 同时增加了代码机密性

cha138/Article/program/net/201311/15537

相关参考

知识大全 你的应用程序为.NET做好准备了吗

你的应用程序为.NET做好准备了吗?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  从底层开始重

知识大全 .net程序中资源文件的保护办法探讨

在编程序(特别是WinForm时)经常会遇到一些需要加以保护的资源文件比如一些数据库文件图片文件等等我们希望能被自己的程序访问但是又不希望别人把我们辛辛苦苦收集来的数据被别人毫不费力地用于自己的程序中

知识大全 如何有效监控.NET应用程序

如何有效监控.NET应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当你的NET应用出现

知识大全 开发中如何有效监控.NET应用程序

开发中如何有效监控.NET应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当你的NET应

知识大全 保护你的代码——谁动了我的组件

  摘要本文描述了如何用CodeAccessSecurity技术来保护代码使代码不致被恶意调用  作为一名NET开发人员你没日没夜地写代码你的组件运行在越来越多的机器上忽然有一天你发现你写的组件被引用

知识大全 给.Net程序员和WEB程序员建议:.Net篇

给.Net程序员和WEB程序员建议:.Net篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  好

知识大全 让.Net 程序脱离.net framework框架运行

让.Net程序脱离.netframework框架运行  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 .net中应用程序域的概念

  在NET平台下程序集并没有直接承载在进程中(而传统的win程序是直接承载的)实际上NET可执行程序承载在进程的一个逻辑分区中术语称为应用程序域(也称AppDomain)可见一个进程可以包含多个应用

知识大全 ASP.Net中程序构架与程序代码的分离

ASP.Net中程序构架与程序代码的分离  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一年前当

知识大全 ASP.NET程序员应用程序域须知

ASP.NET程序员应用程序域须知  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文将讨论NE