c# 反编译与混淆代码的加密方法

转自http://baike.baidu.com/view/3803210.htm与 http://www.cnblogs.com/crazycxy/archive/2012/04/28/2474420.html


反编译

Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。

reflector诞生

  程序集,作为.NET时代的 动态链接库 ,蕴藏了太多的 软件 秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见绌。因为,Reflector能提供更多的程序集信息,而且是免费的工具。
  如今,在Visual studio中编译 源代码 (无论是VB还是C#)时, 编译器 都会将高级源代码翻译成MSIL,即“ 微软 中间语言 ”,而不是特定的机器指令。具有更多安全性、 版本控制 、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或 可执行文件 中的。
  基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级 程序设计语言 更为熟悉。
  Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方 插件 的支持。

下载与运行

  这个软件经常更新,可以在本词条提供的扩展阅读提供的链接中下载最新的版本。 默认情况下,Reflector会打开一组公共程序集(mscorlib、System、System.Data、System.Drawing等等)。每个打开的程序集都列在Reflector的主窗口中。单击程序集旁边的+图标可以展开树结构并展示程序集的命名空间。每个命名空间旁边都有一个相关的+图标,单击这个图标将显示这个命名空间内的类。除此以外,还可以展开每个类,显示类的成员:事件、字段、方法与属性。
  要想查看其它程序集(包括我们自己创建的程序集)的细节,你可以使用菜单命令“File→Open”。然后,浏览到想要查看的程序集。只要选择了有效的.NET程序集,这个程序集就可以在Reflector的主窗口中与其它默认程序集共同显示。要想从Reflector的主窗口中删除程序集,只需右击程序集并选择“Close”。 提供基本的程序集是Reflector唾手可得的功能,然而,Reflector真正的威力体现在它的反汇编能力。只要浏览到类级的成员,就可以通过Tools菜单中的Disassembler项(或在该项上单击右键)反汇编此成员。这将打开第二个窗格,以C#、Visual Basic、Delphi或者IL显示反汇编后的内容。有了Reflector的反编译功能,要研究.NET框架基类库就容易多了。我们完全可以在没有源代码的情况下研究我们所创建或者正在使用的程序集相应源代码。
  不用太担心,自己的.NET应用程序还有其它受保护措施。但是,想阻止别人查看.NET程序集的IL(继而反编译成C#或者Visual Basic)是不可能的,但你可以使用“混淆”技术使IL变得混乱。目前,市场上有许多.NET混淆产品,比如:PreEmptive Solution的Dotfuscator、WiseOwl的Dmeanor以及Remotesoft的.NET Obfuscator等。

其他功能

  除了作为 对象浏览器 与反汇编器之外,Reflector还可以显示类与其成员的调用与被调用图、提供单键访问Google或MSDN搜索的能力并提供了允许第三方开发人员为Reflector创建 插件 的框架。

  要查看调用或被调用图,只需要在树视图中选择一个成员,访问Tools菜单,选择Call Graph或Callee Graph选项即可。Call Graph会列出所选项所调用的成员,而Callee Graph列出调用所选项的成员。  

       通过使用插件,Reflector的功能可以得到进一步扩展。目前有能显示程序集依赖图、自动加载当前运行中的程序集、输出整个程序集的反汇编内容以及在Visual Studio中作为Reflector的宿主等的插件。还有更多插件都列本词条扩展阅读中。在此,我极力推荐有兴趣的读者前去一看。

  不出乎所料,的确存在一个Reflector.VisualStudio插件。有了这个插件,就可以让Reflector集成在Visual Studio环境中,进而取代以前那个有些“拙漏”的对象浏览器。

  首先,我们需要在机器上准备Reflector的最新版,然后下载最新版本的Reflector.VisualStudio插件。据说安装了此插件之后,Reflector能够与Visual Studio完美融合。但遗憾的是,有人试下载此软件并安装(仅能得到testdriven-2.8.2130 RTM个人测试版本,时间7/30/2007,大小3.3M)后,没有大发现—仅是在VS2005中添加“Go to Reflector”和一个帮助菜单项。点击“Go to Reflector”菜单项仅是从VS2005内部启动Reflector而已。   Reflector最新版本收费
 现在打开Reflector的老版本要求强制更新到最新版本,最新版本收费.现在网上很少有破解版本




=================================================================

=================================================================

混淆

    C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破。使用VS自带的Dotfuscator可以实现混淆代码、变量名修改、字符串加密等功能。
    飘易使用的是 Dotfuscator 4.2 PRO 版本,有需要的可以到网上搜索下载 Dotfuscator Professional Edition 4.9破解版本。安装 Dotfuscator 好 打开界面,有几个需要配置的地方: Options、Input、Rename、String Encryption、Build,其他的默认即可,下面飘易一一讲解。

c# 反编译与混淆代码的加密方法_第1张图片
     Options 选项  这是全局配置选项:
    把 Disable String Encryption 设为 NO,即启用字符串加密;检查 Disable Control flow、Dsiable Renaming 也为 NO,即保证控制流和混淆功能打开,其他默认。如下图:
c# 反编译与混淆代码的加密方法_第2张图片

 

     Input 选项里  选择你需要混淆加密的 dll、exe文件,参考第一幅图;
     Rename 选项  勾选“use enhanced overload induction”(使用增强模式),注意:不要勾选下方的“ Do not suppress on serializable types”,即序列化类型的变量不加密,否则编译后可能异常; “Renaming Scheme” 选择“Unprintable”(不可打印字符,即乱码),也可以选择其他如小写字母、大写字符、数字的方式。如下图:
c# 反编译与混淆代码的加密方法_第3张图片
     String Encryption 选项  include里勾选需要字符串加密的工程文件exe、dll等。
c# 反编译与混淆代码的加密方法_第4张图片

 

     Build 选项  设置输出目标文件夹,点击下方的 “Build”按钮即可重新生成新的 exe、dll文件了。
c# 反编译与混淆代码的加密方法_第5张图片

 

    好了,我们来看一下加密混淆后的效果:
   原来的代码:
        string tt = "fm";
        bool vip = false;
        private void Form1_Load(object sender, EventArgs e)
        {
            richTextBox1.Text = "start";
        }
        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "button1 Clicked";
            vip = true;
            richTextBox1.Text += vip.ToString();
        }
    经过Dotfuscator混淆加密后,我们使用著名的 反编译软件 Reflector  来查看,可以发现函数体内的代码已经看不到了,提示:“  This item is obfuscated and can not be translated.”;字符串也变成了乱码,函数名称也不可见了,效果图如下:
c# 反编译与混淆代码的加密方法_第6张图片

 

    【 使用Dotfuscator混淆的几个注意点 】:
       1、如果你加密的dll、exe里有public类,需要被外部引用的话,那么引用这个public的相关dll、exe也要一起放到Dotfuscator Input 里,同时进行混淆加密,不然外部调用出错。
       2、如果有public类,但是你不想照着第1点的方式做的话,可以勾选 Library 模式(input 里 展开项目,见下图),或者不选择 rename 选项,仅仅用 control flow 混淆(该种方式下会看见类名、函数名,但是看不到函数体)。

         3、如果有public类,但是你也不想按照我的第一点、第二点的方法做的话,可以在rename选项里排除这些public的类名、方法名、属性名即可:使用 rename exclude 里左侧排除项目,或 右侧 正则排除方法,见下图:
c# 反编译与混淆代码的加密方法_第7张图片
    这里有一篇其他网友写的 用Dotfuscator 混淆asp.net程序实践心得 ,可以参考阅读。
    当然,软件世界没有不能破解的,但是利用Dotfuscator混淆加密后 至少可以挡住不少新手们!


你可能感兴趣的:(.net,加密,汇编,C#,basic,Graph)