初识Ildasm.exe——IL反编译的实用工具(转自Youngman)

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的基础,需要继续深入

转载于:https://www.cnblogs.com/zhcw/archive/2013/02/20/2919747.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

就想问问你们,这种女朋友从哪里来的?

1 女朋友从哪里来的2 能养好这宠物的对女朋友包容心肯定不赖3 墙都不扶就服这些停车的人4 成功避过所有的球,将白球打入底袋5 谁知道我六年级经历了什么6 这设计,做到了真正意义上的防盗7 这就是我想要的生活面朝大海、春暖花开我也想梦想成真↓ …

mybatis 取传进来的参数 mybatis #{ } ${ }区别是啥?

#{ }将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。${ }方式一般用于传入数据库对象,例如传入表名转载于:https://blog.51cto.com/4925054/1718347

基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试

原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part11-run-unit-tests-inside-a-docker-container/在本教程中,我将展示如何在docker容器中运行单元测试。因为我将使用kubernetes在容器中运行微服务&#x…

【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!...

为什么80%的码农都做不了架构师?>>> 李华明Himi 原创,转载务必在明显处注明: 转载自 【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/516.html 最近写了不少Cocos2d的博文了,那么由于Himi介绍的一般都是…

学计算机的做近视眼手术,长期的电脑工作者,也可以做近视眼手术矫正视力吗?...

随着信息化时代的来临,电脑成为了人们的生活中不可缺少的一种工具,无论是平时的娱乐还是办公室办公都需要用到电脑。特别是对于长期需要使用电脑办公的人来说更是离不开电脑。那么在长期需要面对电脑的情况下还可以做手术来矫正近视眼吗?会不…

Android之编程中存在性能影响的主要方面

1.循环中; 1)在重要的循环里,消除循环终止判断时的方法调用。 例如:将 for(int i=0; i<collection.size();i++){ ... } 替换为… 尽量减少对变量的重复计算 for(int i=0; n=collection.size();i<n;i++){...} 2) 通常把大循环放在里面,把小循环放在外面 例如:将 for…

中柏平板u盘启动_大冶深圳东莞平板硫化机推选得新科技自动化

大冶深圳东莞平板硫化机推选得新科技自动化东莞市得新科技有限公司, 在国内外的销售机器公司。公司位于广东省东莞市。企业致力于点胶设备&#xff0c;硅胶设备&#xff0c;纺织品涂层的先进技术、检测经验发展国外&#xff0c;全面提升国外产品质量&#xff0c;推动国内行业健…

Console-算法-递归算法示例

ylbtech-Arithmetic:Console-算法-递归算法示例1.A&#xff0c;案例-- -- ylb&#xff1a;算法-- type&#xff1a;递归算法-- thankyou:sunshine, 谢谢你的默默付出-- 10:50 2012-04-06-- 1.B&#xff0c;解决方案1.B.1,阶乘 using System;namespace ConsoleApplication1 {cla…

如何才能避免聚会尬聊

全世界只有3.14 % 的人关注了爆炸吧知识如何丰富空闲时光&#xff1f;如何在短时间内获取最最专业的文化、艺术&#xff1f;小编给大家推荐几个公众号它们有趣有颜有料长按二维码&#xff0c;选择“识别图中二维码”关注印客美学id&#xff1a;inkbetter△长按二维码“识别”关…

Excel快速改变行列的次序

改变行列次序是在Excel中常常需要进行的操作&#xff0c;多数用户的方法是先剪切要调整的行或列&#xff0c;然后选定目标位置&#xff0c;单击菜单“插入”→“剪切单元格”。事实上&#xff0c;使用键盘来配合的话&#xff0c;改变行列的次序可以更快捷。比如&#xff0c;在图…

.NET6 如期⽽⾄

.NET6大家好&#xff0c;经过多个月的迭代&#xff0c;.NET 6正式版如期和大家见面了&#xff01;你安装好了吗&#xff1f;还是等等党&#xff1f;希望看完这篇文章你会对.NET 6有更多了解。自2014年11月12日宣布开源后&#xff0c;.NET就成为了一个跨平台、面向多场景的技术。…

Wordpress 提速之 Gzip 压缩

今天来聊下 wordpress 提速&#xff0c;其实关于这方面的话题网上其实蛮多的&#xff0c;速度对一个网站来说无疑是非常重要的&#xff0c;对于速度的追求也是无止境的&#xff0c;在这方面的表率无疑就是 shawn 了&#xff0c;看他博客的很多技巧都是针对速度来的……不过话说…

html弹性盒子垂直排列,css3弹性盒子布局

css3弹性盒子布局CSS3 弹性盒( Flexible Box 或 flexbox)&#xff0c;是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间。display:f…

忍“乳”负重,身材好的女孩子究竟有多不容易?我从科学的角度算出来了……...

全世界只有3.14 % 的人关注了爆炸吧知识大家好&#xff0c;满肚子奇怪知识&#xff0c;用科学眼光看世界的小编又来了。先问大家一个问题&#xff1a;你最喜欢看女孩子的哪里&#xff1f;相信不少人&#xff0c;不论男女都想到了一个地方。不论男女&#xff0c;都希望自己能“大…

getchar()到底怎么用_怎样才能真正发挥肥效,腐植酸水溶肥到底怎么用

施肥是农业生产中的重要环节&#xff0c;不管是大田作物还是花草苗木&#xff0c;水肥充足才能健康生长。而施肥不是看用了多少&#xff0c;而是看转化率&#xff0c;有多少真正被植物所吸收利用。许多化肥看着一大袋一大袋的用&#xff0c;结果都浪费了或者造成徒长一点用处都…

Windows API GetVersionEx()判断系统版本详解

转载自:http://bbs.7boo.com.cn/thread-8093-1-1.htmlAF注:TCHAR cstCSDVersion[128];sprintf(cstCSDVersion,"%s",os.szCSDVersion);//spkWindows API 中有两个函数可以得到系统版本信息&#xff1a;GetVersion和GetVersionEx。 GetVersion这个函数曾经困扰了…

Android之Json转换利器Gson之实例一-简单对象转化和带泛型的List转化

看代码可以最快速学习 实体类 public class Student {private int id;private String name;private Date birthDay;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this…

可视化ASP.Net Core Web API健康检查

前言ASP.NET Core提供运行状况检查Middleware和库&#xff0c;以便于报告应用的运行状况。使用方式也很简单。引用Nuget包Microsoft.Extensions.Diagnostics.HealthChecks。然后修改Startup.cs文件:public void ConfigureServices(IServiceCollection services) {...services.A…

利用网站模板创建子网站

1. 打开顶层站点&#xff0c;进入网站内容&#xff0c;最底部&#xff0c;子站点-->新建子网站 2.配置如下&#xff1a; 3. 可能会出现的BUG http://blog.csdn.net/chenxinxian/article/details/12189293 4, 解决方法&#xff1a;安装或卸载用于SharePoint的Reporting Servi…

Firefox 10正式发布

Firefox 10是Firefox的首个长期支持版本&#xff08;Extended Support Release&#xff09;&#xff0c;Firefox 10的支持周期为1年&#xff0c;不会增添新功能&#xff0c;仅会提供安全性更新。经过6个Beta测试&#xff0c;Firefox 10正式版今天终于发布了。 Firefox 10新特性…