标 题: 【原创】MaxtoCode对.Net程序加密的原理及解密探讨三(实例解密)
作 者: rick
时 间: 2006-09-29,23:16:28
链 接: http://bbs.pediy.com/showthread.php?t=32658

上一回我们试验了通过反射的方式获取method的源代码。
这次我们就用一个实例来演示dump一个程序集中的所有类型和方法的IL源代码。

首先打开VS2005 新建一个C#的windows程序:
在窗体添加添加一个2个 button,2个label,一个textbox,一个 checkbox,一个savefiledialog。
界面如下:

事件代码如下:
  1  public class Form1 : Form
  2       {
  3             // Methods
  4             //选择IL字节码保存文件
  5             private void button1_Click(object sender, EventArgs e)
  6 {
  7       if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
  8       {
  9             this.textBox1.Text = this.saveFileDialog1.FileName;
 10       }
 11 }
 12              //点击开始dump。
 13             private void button3_Click(object sender, EventArgs e)
 14 {
 15       this.button3.Enabled = false;
 16       this.DumpAssembly(Assembly.GetExecutingAssembly(), this.textBox1.Text);
 17       MessageBox.Show("dump ok");
 18       this.button3.Enabled = true;
 19 }
 20             //这个函数将一个Assembly全部dump到path中。
 21             private void DumpAssembly(Assembly ass, string path)
 22 {
 23       StreamWriter writer1 = new StreamWriter(path, false);
 24       Type[] typeArray1 = ass.GetTypes();
 25       for (int num1 = 0; num1 < typeArray1.Length; num1++)
 26       {
 27             this.DumpType(typeArray1[num1], writer1);
 28       }
 29       writer1.Flush();
 30       writer1.Close();
 31 }
 32 
 33             //dump单个类型,由dumpassembly调用
 34              private void DumpType(Type tp, StreamWriter sw)
 35 {
 36       BindingFlags flags1 = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;
 37       string text1 = tp.ToString();
 38       sw.Write("TYPE: " + text1 + "\r\n");
 39       if (tp.IsEnum)
 40       {
 41             sw.Write("IsEnum ");
 42       }
 43       if (tp.IsImport)
 44       {
 45             sw.Write("IsImport ");
 46       }
 47       if (tp.IsNested)
 48       {
 49             sw.Write("IsNested ");
 50       }
 51       if (tp.IsClass)
 52       {
 53             sw.Write("IsClass");
 54       }
 55       sw.Write("\r\n");
 56       if ((text1 != "InFaceMaxtoCode") || !this.checkBox1.Checked)
 57       {
 58             sw.Write("**********Begin MemberInfo**********\r\n");
 59             MemberInfo[] infoArray1 = tp.GetMembers(flags1);
 60             for (int num1 = 0; num1 < infoArray1.Length; num1++)
 61             {
 62                   MemberInfo info1 = infoArray1[num1];
 63                   sw.Write(info1.MemberType.ToString() + "\t" + infoArray1[num1].ToString() + "\r\n");
 64                   if ((info1.MemberType == MemberTypes.Method) || (info1.MemberType == MemberTypes.Constructor))
 65                   {
 66                         this.DumpMethod((MethodBase) info1, sw);
 67                   }
 68             }
 69             sw.Write("**********  End MemberInfo**********\r\n");
 70             sw.Write("\r\n\r\n");
 71       }
 72 }
 73 
 74  
 75 
 76         //dump单个方法,由dumptype调用
 77          private void DumpMethod(MethodBase mb, StreamWriter sw)
 78 {
 79       MethodBody body1 = mb.GetMethodBody();
 80       if (body1 != null)
 81       {
 82             byte[] buffer1 = body1.GetILAsByteArray();
 83             try
 84             {
 85                   sw.Write("\tMaxStackSize: " + body1.MaxStackSize.ToString());
 86                   sw.Write("\tCodeSize: " + buffer1.Length.ToString());
 87                   sw.Write("\r\n");
 88             }
 89             catch (Exception exception1)
 90             {
 91                   MessageBox.Show("1:" + mb.ToString() + "\r\n" + exception1.ToString());
 92             }
 93             foreach (LocalVariableInfo info1 in body1.LocalVariables)
 94             {
 95                   sw.Write("LocalVar: " + info1.ToString());
 96                   sw.Write("\r\n");
 97             }
 98             sw.Write("\r\n\r\n");
 99             StringBuilder builder1 = new StringBuilder();
100             foreach (byte num1 in buffer1)
101             {
102                   builder1.Append(num1.ToString("X2"));
103             }
104             sw.Write(builder1.ToString());
105             sw.Write("\r\n\r\n");
106             foreach (ExceptionHandlingClause clause1 in body1.ExceptionHandlingClauses)
107             {
108                   sw.Write(clause1.ToString());
109                   sw.Write("\r\n");
110             }
111             sw.Write("\r\n");
112       }
113 }
114 
115  
116 
117             
118      
119       }
120 
121

编译这个程序,运行,dump出il字节码,
然后拿 maxtocode加密。再运行,dump出il字节码,然后找一个method 如 button1_click,比较一下他们的IL字节码是 否一样。
当然结果应该是一样的。

这里主要有三个关键函数 
            private void DumpAssembly(Assembly ass, string path);
            private void DumpMethod(MethodBase mb, StreamWriter sw);
            private void DumpType(Type tp, StreamWriter sw);
这三个就是一个例子演示如何dump整个程序集。

如要dump 一个加密的dll,我们就可以直接用这个程序来改,
首先添加引用,引用那个dll,然后随便实例话一个该dll中的type。

然后获取该dll的 Assembly 对象,再调用DumpAssembly函数即可

附上工具,查看il字节码的软件。

下载地址:
http://www.bbsftp.com/temp/ILByteDecoderV1.85.rar

转载于:https://www.cnblogs.com/niuniu502/archive/2010/09/26/1834957.html

[转载]MaxtoCode对.Net程序加密的原理及解密探讨三(实例解密)相关推荐

  1. 《嵌入式 – GD32开发实战指南》第19章 程序加密

    开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 19.1程序加密工作原理 GD32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭.96位 ...

  2. 三、mysqld程序的运行原理及数据库结构

    mysqld程序的运行原理及数据库结构 三.mysqld程序的运行原理及数据库结构 数据库的逻辑结构 数据库的物理结构 1. 库的物理存储结构 2.表的物理存储结构 3 .表的段.区.页(16k)(了 ...

  3. 加密狗原理-高强度加密-程序加密技巧

    加密狗原理,加密狗加密的基本原理 本文将介绍软件加密加密狗原理,加密狗加密的基本原理的一些编程技巧,以及软件开发者将如何编写安全可靠 的代码,如何对付各种各样的加密狗破解,编写加密程序时应该尽量避免的 ...

  4. Paillier半同态加密:原理、高效实现方法和应用

    简介: <数据安全法>已于9月1日起正式实施,两个月后<个人信息保护法>也将开始施行,意味着数据安全和隐私保护方面的监管将会在年内陆续到位.在合规收紧大背景下,"数据 ...

  5. Paillier 半同态加密:原理、高效实现方法和应用

    一 简介 1 背景 <数据安全法>已于9月1日起正式实施,两个月后<个人信息保护法>也将开始施行,意味着数据安全和隐私保护方面的监管将会在年内陆续到位. 在合规收紧大背景下,& ...

  6. JAVA加密狗(JAVA程序加密保护,防拷贝和防止反编译)

    JAVA加密狗(JAVA程序加密保护,防拷贝和防止反编译)      众所周知,java为开发语言提供了很方便的开发平台,但开发出来的程序很容易在不同的平台上面被移植,现在越来越多的人使用它开发软件. ...

  7. .net 程序加密方法

    .net 程序加密,一般是对生成的exe文件或者dll直接进行加壳,配合加密锁或者许可进行授权控制,既能保证安全性,又控制软件的使用. 加壳工具的选择 一般要考虑几点,第一是加壳的安全性,不能被轻易脱 ...

  8. Java程序的运行原理及JVM的启动是多线程的吗?

    Java程序的运行原理及JVM的启动是多线程的吗? A:Java程序的运行原理 Java通过java命令会启动java虚拟机.启动JVM,等于启动了一个应用程序,也就是启动了一个进程. 该进程会自动启 ...

  9. MapReduce程序之序列化原理与Writable案例

    [TOC] MapReduce程序之序列化原理与Writable案例 前言 在编写MapReduce程序时,我们会发现,对于MapReduce的输入输出数据(key-value),我们只能使用Hado ...

最新文章

  1. AFNetworking 取消请求
  2. UNIX文件mode_t详解
  3. CMake入门指南-编译教程
  4. oracle 内存结构 share pool sql解析的过程
  5. mysql修改i数据库名_数据库操作之mysqli语句的增删改查0424/14:36
  6. 表单验证JavaScript实现正则匹配、随机验证码、密码强度、加拖拽加蒙板
  7. Java学习4大阶段完成入门,小白必读!
  8. OpenShift 4 - Knative教程 (6) Eventing之Channel和Subscription
  9. Spring Security 学习-环境搭建(一)
  10. python入门第六章 信息安全策略-文件备份 用户账户管理
  11. java实体类实现抽象类_java接口、抽象类、实体类关系介绍
  12. linux 查看链接文件,Linux下的链接文件详解
  13. vc编程的ime输入法菜单开发
  14. 计算机海报大赛策划书,海报策划书模板.docx
  15. 2021工作总结, 展望2022
  16. Unity 调用 JAR
  17. 深入理解JavaScript学习笔记-第一章
  18. (附源码)springboot在线学习网站 毕业设计 751841
  19. gui设计模式_GUI的完整形式是什么?
  20. corex9服务器组装攻略,ROG M7H+ GTX980+Tt Core X9怪兽级主机攒机记

热门文章

  1. javascript优化_如何通过使用服务人员来优化JavaScript应用
  2. 我希望支持JavaScript GraphQL实现的API
  3. javascript_治愈JavaScript疲劳的研究计划
  4. java程序员遇到的问题_Java 程序员平时最常遇到的故障:系统OOM (一)
  5. access百度翻译 get_百度AI攻略:智能上色
  6. iOS开发经验总结,我的2019进阶之路!
  7. HDU 6051 - If the starlight never fade | 2017 Multi-University Training Contest 2
  8. Python全栈开发day2
  9. Hibernate之继承映射
  10. 天猫双十一神话恐终结