某壳对.Net程序加密的原理及解密探讨二

自上次写第一篇文章到现在不知不觉两个月过去了,这篇文章我们将介绍怎么获取解密后的IL字节代码。
我们先回顾一下前文,在上一回我们提到“InFaceMaxtoCode.Startup 正常启动后,在整个程序集中只会运行一次。”。
当时这种说法是很武断的,如果 “InFaceMaxtoCode.C______(num2, num3)” 的返回值总是 false的话,该函数就会被执行多次,
不过根据后来动态调试的结果,我们证实了“InFaceMaxtoCode.C______(num2, num3)” 的返回值为 true,因此上次的说法是正确的。

现在言归正传,怎么取得解密后的代码呢?大概两个方向,
1.正面交锋,直接攻破maxtocode的运行库。
这就将问题直接回到了传统的win32层面,不过这个东西是业内人士写的在这方面的保护工作做得很好,像我这样的菜鸟就很难直接攻破了。
我曾有一个设想,就是通过分析运行库找到解密函数的入口,然后弄一个stub dll,hook这个地方,把解密后的il代码dump出来。
实际跟踪几次后我就放弃了。从跟踪到的信息来看,我猜测,运行库是通过 mscorwks.dll 挂接到 jit,在jit的前面实时解密代码。
理论上我们也可以挂一个到jit前面,在那里dump解密的il代码,不过这个实现的方式,还不清楚,如果弄明白了,也就能写一个同样原理的加密软件了。
这个难度比较大,所以我最终放弃了这个方案。

2.避开运行库,我们直接利用dotNet 2.0的特性获取IL代码。
如是我就试着用2.0写了一个winform程序,加密,运行,发现报错。
maxtocode3.1不支持2.0的winform程序,这就使我的这个方案实验夭折了。
两个月过去了,发现maxtocode升级到3.11了修正了这个bug,今天终于可以继续实验了。

我们来建一个简单的winform程序。一个窗体,然后一个按钮。
代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.Reflection;
 9 using Spaces;
10 namespace Test5
11 {
12     public partial class Form1 : Form
13     {
14         public Form1()
15         {
16             InitializeComponent();
17         }
18    
19         private void TestMethod()
20         {
21             //  [7/17/2006]
22             int i = 0;
23             i = 1;
24             i++;
25             if(i>0)
26             {
27                 MessageBox.Show("OK");
28             }
29         }
30 
31         private void button1_Click(object sender, EventArgs e)
32         {
33             Type tp = this.GetType();
34 
35             MethodInfo mi = tp.GetMethod("TestMethod",
36                 BindingFlags.NonPublic|BindingFlags.DeclaredOnly|
37                 BindingFlags.Public|BindingFlags.Static
38                 |BindingFlags.Instance);
39             if(mi == null)
40             {
41                 MessageBox.Show("err");
42                 return;
43             }
44             MethodBody mb = mi.GetMethodBody();
45             byte[] bt= mb.GetILAsByteArray();
46             StringBuilder sb = new StringBuilder();
47             for (int i = 0; i < bt.Length; i++)
48             {
49                 sb.Append(bt[i].ToString("X2"));
50                 sb.Append(" ");
51             }
52             string stxt = sb.ToString();
53             MessageBox.Show(stxt);
54                        
55         } 
56      
57     }
58 }

编译运行,我们点击按钮就能看到 TestMethod 的IL字节码。
然后用maxtocode加密在运行,同样能看到 TestMethod 的IL字节码。
两次看到的结果一样的,这个是当然了,如果不一样,maxtocode就破坏了程序的正确性了。

好了,我们的实验成功了。

看到这里大家应该知道怎么获取解密后的IL代码了吧。

这种方式比在内存里面找代码或者hook到maxtocode解密后dump代码的方式要优越很多,
因为内存dump的方式你还要担心运行时的函数覆盖率,没有运行到的就dump不到。

这种方式我们利用 DotNet的反射机制,可以枚举出程序集中的所有类型,以及每个类型的所有方法,成员,字段,构造函数等。

初步实验了一下,对于加了密的dll文件还是比较好弄的,2.0的、1.1的都能弄出IL代码来。
对于exe文件还有一关需要解决,那就是如何将我们的DotNet dll程序集插入到exe的运行空间中去。

今回就先到这里了,下回再实际写程序演练获取解密后的IL字节代码。

ps:不知道大家手上是否有破解到的 Reflector 的源代码,如果有丢一份给我,感激不尽。

时间: 2024-11-27 06:08:45

某壳对.Net程序加密的原理及解密探讨二的相关文章

某壳对.Net程序加密的原理及解密探讨五(元数据还原以及IL解码的改进)

前一回讲了 IL字节码的解码问题,并提供了一个小工具,但解码的效果和 ildasm还是差很多,给阅读也带来了一些困难.还有就是有些文件选择文件后解码会出错,这是因为maxtocode对文件里面的元数据进行了随机加密.这一回主要解决元数据的还原以及对解码进行改进. 题外话:国庆后maxtocode推出了3.12版,称对.net formwork 2.0获取msil代码的方式进行了限制.即在不作任何改进的情况下,我们前面介绍的方法将无法取得IL字节码.dreaman已经找到了取消这个限制的方法了,不

某壳对.Net程序加密的原理及解密探讨一

  这里研究的对象是某壳3.1试用版.这里只探讨程序代码的加密.   对.Net程序代码的加密过程如下: 1. 运行 ildasm 将程序集反编译成 il代码文件. 2. 对IL代码文件进行处理.(*) 3. 运行 ilasm 将 IL代码文件编译成程序文件. 4. 直接对程序文件中的il字节码加密.(**)   粗体表示的 2 , 4 是关键步骤. 我们先来看看第四步.这一步就是加密的关键步骤,这里就是使用MaxtoCode的加密算法对程序代码进行加密. 显然,对于破解来说最直接直观的方法就是

某壳对.Net程序加密的原理及解密探讨三(实例解密)

上一回我们试验了通过反射的方式获取method的源代码.这次我们就用一个实例来演示dump一个程序集中的所有类型和方法的IL源代码. 首先打开VS2005 新建一个C#的windows程序:在窗体添加添加一个2个 button,2个label,一个textbox,一个 checkbox,一个savefiledialog.界面如下: 事件代码如下:   1  public class Form1 : Form  2       {  3             // Methods  4     

某壳对.Net程序加密的原理及解密探讨四(翻译IL字节码)

在前面几章我们已经能够去掉被加密程序原始的IL字节码了.这些字节码是十六进制的,我人脑直接来阅读是非常困难的.这一章主要介绍将字节码翻译成 可阅读的 MSIL 汇编代码,以及前几章的遗留问题解决.  这里我们将用到上面这个工具软件 IlByteDecoder. 软件下载地址:http://www.bbsftp.com/temp/ILByteDecode.rar使用比较简单,注意中间那个 文件名 一项,这个可以填也可以不填,如果没有填的话,解码出来的 msil 代码中将无法显示字符串值和方法名称.

android-求360隐私保险箱中的加密视频原理

问题描述 求360隐私保险箱中的加密视频原理 我的android系统手机中装了一个360隐私保险箱 用了一下其中的加密视频的功能 发现加密大视频一下子就完成了 所以我怀疑他只是改个文件名移动一下位置,于是我到他的目录下用播放器播放 发现无法播放 然后我又到保险箱里 发现竟然可以直接播放 没看见解密过程 感到十分不解 求解 解决方案 估计就是加密了头文件,头文件动了,别的播放器当然无法识别了. 加密音视频有特定的一套方案,卷积好像,是需要时间的 解决方案二: 这不难吧,它可以将关键的数据段比如一些

代码 还原 不执行-程序加密需要替换回车符,但解密还原后,遇到不执行的问题,怎么处理?

问题描述 程序加密需要替换回车符,但解密还原后,遇到不执行的问题,怎么处理? <%dd=5555bb=6666response.Write(dd&bb)%> 但换个方式就不执行.测试一下下面这个,它不运行. <%function UnEncode(cc)cc=replace(ccaaaa""vbcr)UnEncode=ccend functionss=""dd=5555aaaabb=6666aaaaresponse.Write(dd&

批量对加密的asp代码解密的asp程序

程序|加密|解密 <% @Language="JavaScript" %><% /* *--------------- decode.asp ----------------- * 功能:遍历某个目录下的所有文件,对加密过的.asp文件 *      进行解密,并写入源文件中. * 实例:单个文件解密 * Response.Write(DncodeFile(Server.MapPath("conn.asp"))); * 实例:目录下所有文件解密. 

网站安全之ASP程序加密/解密方法大揭密

安全|程序|加密|解密 如今,用ASP技术构建的网站随处可见.由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的难题,网上求解这类问题的帖子非常多,下面我们就来谈谈ASP程序的加密方法. 一.如何加密ASP程序? 目前对ASP程序的加密方法主要有三种:脚本编码器(SRCENC.EXE)加密.组件加密.自编程序加密,下面我们就来展开介绍这三种加密方法. 1.使用微软的MS Script En

C++ 学习之旅一——Windows程序内部运行原理

      学习C++与.net不同的是,一定要搞清楚Windows程序内部运行原理,因为他所涉及大多数是操作系统的调用,而.net毕竟是在.netFrameWork上唱戏.        那Windows应用程序,操作系统,计算机硬件之间的相互关系究竟什么了,下面的图就给予很好的解释.       向下箭头①是 应用程序运行判断处理的结果,输出到输出的设备.       向上箭头②是输入设备,输入到操作系统中.       向下箭头③代表API,我们要解释以下API是什么.API是应用程序接口