首页 > 养蜂技术 > 软件开发 > 其他

养蜂技术正文

由浅至深,谈谈.NET混淆原理 (一)

湖北天马养蜂场2010-03-16 11:10:14其他2064
分为这么几个部分来试着谈谈.NET混淆原理

1.       IL基础,什么是IL

2.       最简单的混淆

3.       什么是流程混淆,它的利与弊

4.       反混淆实战(原理+工具篇)

5.       新一代.NET代码保护加密工具MaxtoCode基本原理

6.       其它保护手段

好,今天我们来讲讲基础――.NET中的IL

相信大家都知道不管你使用C#还是VB.NET还是C++托管,最后编译出来的都是IL语言程序集。

什么是IL呢,它是一种中间语言字节码,存在于高级语言和机器码的一种中间语言。它的作用就是建立“统一”运行的.NET运行环境,使net可以跨平台(不过,从实际情况来看,MS是不会允许net跨平台的,至少3年内不会,甚至更长。其实,跨平台也没什么好的,看看Java,号称一次编译,到运行,结果变成一次编译,到处调试!我就在Windows系统下没见过大量用Java编写的好工具,也许是偶不经常关注它的原因吧!!)。

不好意思,刚刚又跑题了,近来思想老打岔,唉,这是个不好的现象。IL的格式与汇编语言的格式极为相似,所不同的是,IL语言比汇编语言更加易懂,因为它里面可以直接调用已封装好的Object,而且运行逻辑也与高级语言一致,所以基本上是差不多的。湖北天马养蜂场,加我们的微信一起学养蜂。

我们不能对IL做一个系统的介绍,所以我们用一段非常简单的C#代码,让我们看看:(凡事从简单入手,熟悉后再开始复杂)

这段代码没有意义,我只是为了增加运算量,做强度测试的时候再这样写的。我们看看这段代码被译为IL将是什么模样。C#的代码对比一下,基本上还是比较清楚的,可能有的朋友已经被ldargstargldlocstloc搞糊涂了,呵呵,其实看熟释了就好了,他可比Mov好清楚的多啊,后面所跟的变量所指也比EAX等寄存器清楚的我。

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051.methodpublichidebysiginstanceint32  Level3(int32a)cilmanaged
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051          
//.method是说这个区域是方法区域指的是{}中的内容
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051              
//publichidebysiginstance是此方法的属性
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051              
//int32是这个方法的反回值,如果是VB.NET中的sub在这里翻译出来返回值为void
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051              
//Level3是方法名称,与原代码一至
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051              
//int32a是进入的参数,与原代码一至
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
//cilmanaged是托管方法
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
//由于net的一大特性就是MetaData,而它带上了许多的程序信息,所以基本上,il与C#很相以。还是一句老话嘛,凡事有利必有弊。
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051{
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  .maxstack  
2                             //最大的堆数量2
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051                                                    
//此值是能过代码中的交换需求计算而来的
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  .localsinit([
0]strings,              //交换变量的类型定义,这里可以看得很清楚。
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
//三个变量与一个参数(或返回值)都在这里
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051           [
1]unsignedint8[]b,
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051           [
2]class[mscorlib]System.Text.ASCIIEncodingasii,
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051           [
3]int32CS$00000003$00000000)
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051      
//下面是代码区
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0000:  ldstr      
"215dsgfdart42315s"         //赋值字符器
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0005:  stloc.
0                       //赋值给变量感觉如push
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0006:  newobj     instance
void[mscorlib]System.Text.ASCIIEncoding::.ctor()  
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051                    
//建立一个System.Text.ASCIIEncoding对象
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_000b:  stloc.
2  //赋值给变量
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_000c:  ldloc.
2  //取出System.Text.ASCIIEncoding对象感觉如pop
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_000d:  ldloc.
0   //取出字符串
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_000e:  callvirt   instanceunsignedint8[][mscorlib]System.Text.Encoding::GetBytes(
string)  //进行转换
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0013:  stloc.
1   //将结果给byte[]
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0014:  ldarg.
1   //
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0015:  ldloc.
1     //取出byte[]
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0016:  ldlen        
//计算长度
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0017:  conv.i4   
//
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0018:  add      
//与a相加
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0019:  starg.s    a
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_001b:  ldarg.
0       //
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_001c:  ldarg.
1
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_001d:  call       instanceint32Name1.strong::Level4(int32)
//调用Level4方法
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0022:  starg.s    a   
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0024:  ldarg.
1
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0025:  stloc.
3
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0026:  br.s       IL_0028  
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
//我不知道这里为什么会出现这一句,这一句完全是没必要的
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0028:  ldloc.
3
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051  IL_0029:  ret                   
//ret表示方法结果,如果上面有入栈值,则当成返回变量
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051}

由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051
由浅至深,谈谈.NET混淆原理(一)-50190875-湖北天马养蜂场13127561051