IL反编译的实用工具
初识Ildasm.exe——IL反编译的实用工具
Ildasm.exe 概要:
一.前言:
微软的IL反编译实用程序——Ildasm.exe,可以对可执行文件(ex,经典的控制台Hello World 的 exe 可执行文件)抽取出 IL 代码,并且给出命名空间以及类的视图。在讲述如何反编译之前,有必要从虚拟CPU的角度来看CLR,这样有助于先从正面了解代码执行过程。
虚拟CPU:
.NET 程序,其核心皆为 CLR ,而同时CLR的功能却与CPU非常相近,其中CLR执行IL代码(或叫做,IL指令)、操作数据,只不过操作的代码不同:CPU操作机器语言,而CLR操作IL代码。
由上,上述讲解的是从IL--机器语言的过程,而Ildasm则可以实现将可执行程序(机器语言)--IL代码,这就是Ildasm的主要功能。
在Anytao的《你必须知道的.NET》中对IL代码专门做了说明,虽然暂时悟不透其"深远意义",但我还是愿意去开始我的IL之旅的,呵呵~。 在此我们先看,Anytao对于掌握(或者了解) IL代码的重要性:
1.通用的语言基础是.NET运行的基础,当我们对运行结果有异议的时候,如何透过表面看本质,IL是必须的基础;
2. IL也是更好理解、认识CLR的基础;
3.大量的实例分析是以IL为基础的,所以了解IL,是读懂他人代码的必备基础,同时自己也可以获得潜移默化的提高;
有上述3条影响,足以让任何一个有追求的人都鼓足劲,去开始IL之旅了(自然包括我,呵呵~)。
二 .Ildasm.exe 的使用方法:
在应用Ildasm.exe具体反编译代码之前,先附上MSDN对于用Ildasm.exe反编译的经典帮助示例:

然后我们用Ildasm.exe具体反编译经典的"Hello World"控制台程序的可执行文件,展现出来的视图为:

分析具体IL代码:
1.MANIFEST清单:
MANIFEST是一个附加信息列表,主要包含程序集的一些属性,如程序集名称、版本号、哈希算法等;
2.ConsoleApplication1.Program类:
这才是我们介绍的主角。
首先是Program类: 代码为
.class private auto ansi beforefieldinit ConsoleApplication1.Program
extends [mscorlib]System.Object
{
} // end of class ConsoleApplication1.Program
1).class,表示Program是一个类。并且它继承自程序集—mscorlib的System.Object类;
2)private,表示访问权限;
3)auto,表示程序的内存加载全部由CLR来控制;
4)ansi,是为了在没有托管代码与托管代码之间实现无缝转换。这里主要指C、C++代码等;
5)beforefieldinit,是用来标记运行库(CLR)可以在静态字段方法生成后的任意时刻,来加载构造器(构造函数);
其次是 .otor方法,代码为:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Program::.ctor
1)cil managed:表示其中为IL代码,指示编译器编译为托管代码;
2).maxstack:表示调用构造函数.otor期间的评估堆栈(Evaluation Stack) ;
3)IL_0000:标记代码行开头;
4)ldarg.0:表示转载第一个成员参数,在实例方法中指的是当前实例的引用;
5)call:call一般用于调用静态方法,因为静态方法是在编译期就确定的。而这里的构造函数.otor()也是在编译期就制定的。而另一指令callvirt则表示调用实例方法, 它是在运行时确定的,因为如前述,当调用方法的继承关系时,就要比较基类与派生类的同名函数的实现方法(virtual和new),以确定调用的函数所属的Method Table;
6)ret:表示执行完毕,返回;
最后是Main()方法,代码为:
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello world"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::Main
1) .entrypoint指令表示CLR加载程序时,是首先从.entrypoint开始的,即从Main方法作为程序的入口函数;
2)ldstr:表示将字符串压栈,在这里就是将"Hello World." 压栈;
3)hidebysig:表示当把此类作为基类,存在派生类时,此方法不被继承,同上构造函数;
至此,我们对IL代码的一些指令有了了解,也纵观了IL世界里的概况,呵呵~
常用IL指令扩展:
一:创建对象实例的IL指令
关于创建对象的在内存分配的机制,在《内存探寻1之——值类型和引用类型的内存分配机制》 里有了详细的介绍。而常用的创建对象的IL指令使我们更好理解对象的步骤。其主要有4种:
1.newobj: 用于创建引用类型的对象;
2:ldstr:用于创建String对象变量;
3.newarr:用于创建数组型对象;
4:box:在值类型转换为引用类型的对象时,将值类型拷贝纸托管堆上分配内存;
二:通过IL代码,更好地理解属性
我们在C++中,在典型的类中,都会定义用于控制有效性输入的Set()函数,以及用于不同方式显示的Get()函数。然而在C#中,它将Get()函数和Set()结合在一起,刚开始难免会为之混淆。然而若通过 Ildasm.exe对程序反编译后观察属性的本质,即可看到其执行机制,如下图示(注:选自互联网):

由我们前面的分析IL代码的方法,以及上图的展示,我们可以看到属性被重新分为Get()函数和Set()函数。ex,属性Name,被分解为get_Name()函数和set_Name(String s)函数。这样我们对其本质就一目了然了!至于其属性的特殊表示形式,只看做是Set()函数和Get()函数的完美结合体就可以了,这也是C#语言的优美体现啊,呵呵~
综述之,我们对反编译工具Ildasm.exe有了一定认识,最主要的,我们通过它反编译的IL代码,对基本的IL指令有了一定的了解,也对以后的在把IL代码作为有力工具 使用的过程中,更向前了一步!然而,这些都还只是IL的基础,需要继续深入,呵呵~![]()
附:感谢姚凯(K-night),百忙之中对本文 代码提供的支持,呵呵~
IL反编译的实用工具的更多相关文章
- IL反编译的实用工具Ildasm.exe
初识Ildasm.exe——IL反编译的实用工具 https://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html 学 ...
- 转载文章----初识Ildasm.exe——IL反编译的实用工具
转载地址http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要:(路径:C:\Program ...
- 初识Ildasm.exe——IL反编译的实用工具
原文地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要: 一.前言: 微软的IL反 ...
- [No000013B]初识Ildasm.exe——IL反编译的实用工具
Ildasm.exe 概要: 一.前言: 微软的IL反编译实用程序——Ildasm.exe,可以对可执行文件(ex,经典的控制台Hello World 的 exe 可执行文件)抽取出 IL 代码,并且 ...
- 转载文章----IL反编译利器——Ildasm.exe和Reflector.exe:
转载地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662546.html 一:Ildasm.exe简介 这一微软VS自带工具, ...
- ubuntu下使用反编译apk,工具dex2jar和jd-gui
ubuntu下使用反编译apk, 工具 1:通过apk-tool反编译出资源文件: http://code.google.com/p/android-apktool/ 2.首先使用dex2jar反编译 ...
- 反编译APK的工具和方法
我们使用dex2jar以及JavaDecompiler反编译手机QQ浏览器V5.4,来学习和实践安卓反编译的技巧和方法.学习过程中需要用到的工具和资源,直接点击红色链接可以下载. 第一步:APK本身就 ...
- apk反编译(6)ProGuard 工具 android studio版官方教程[作用,配置,解混淆,优化示例]
ProGuard In this document Enabling ProGuard (Gradle Builds) Configuring ProGuard Examples Decoding O ...
- 反编译之jadx工具
1.jadx是个开源 https://github.com/skylot/jadx 2.下载后cd到文件的根目录 然后输入命令 ./gradlew dist 之后会出现build文件进入/build/ ...
随机推荐
- 使用C/C++发展Web系统开源
下载 见 C++开发的论坛系统 - BBS 下载地址:Fetch_source_code_release_vse2008_v1.2.1.7z 眼下先暂存在百度云上,最近会放入github 当前版本号的 ...
- 新手sqlserver数据库dba需要注意的小细节
前言:任何的优化和修改都是以业务情况为前提,可能有的写的有误或者不准确的地方,欢迎各位来拍砖. 1.在创建db的时候自增长建议设置成按MB(M)增长,步长根据业务量来设置,一般情况建议设置100-20 ...
- c语言发挥帕斯卡三角
我们已经确定了帕斯卡三角的规则,下面是我的代码,非常实用哦! !! #include<stdio.h> void main() { int i,j,n,k; sca ...
- 【Java&Android开源库代码分析】のandroid-async-http の开盘
在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...
- android项目总体界面架构(可直接复用)
文章解读.效果图.源代码下载链接 http://blog.csdn.net/gao_chun/article/details/37903673
- C#中调用Outlook API 发起会议
原文:C#中调用Outlook API 发起会议 在我上一篇博文中曾提到了 SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件 但是,里面的方法只能用于发送普通电子邮件.如果要发起会 ...
- 使用OpenWrt的SDK
原文:http://wiki.openwrt.org/doc/howto/obtain.firmware.sdk 为什么要使用SDK: Reasons for using the SDK are: C ...
- 【SSRS】入门篇(二) -- 建立数据源
原文:[SSRS]入门篇(二) -- 建立数据源 通过 [SSRS]入门篇(一) -- 创建SSRS项目 这篇,我们建立了一个SSRS项目: 接下来,我们以 AdventureWorks2012 示例 ...
- SpringMVC之 数据绑定-1
SpringMVC学习系列(4) 之 数据绑定-1 在系列(3)中我们介绍了请求是如何映射到一个action上的,下一步当然是如何获取到请求中的数据,这就引出了本篇所要讲的内容—数据绑定. 首先看一下 ...
- c#后台输出javascript语句和一些通用验证的类
大家在用MVC的时候,经常会用到MODEL层的验证或者是正则表达式,我这边看到了一篇不错的文章,转载过来http://blog.csdn.net/accpxcb/article/details/311 ...