C# IL DASM 使用
IL DASM反编译工具
使用C#的猿人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认识。我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改。感觉他还是很强大。
IL是微软平台上的一门中间语言,我们常写的C#代码在编译器中都会自动转换成IL,然后在由即时编译器(JIT Compiler)转化机器码,最后被CPU执行。ildasm.exe反编译工具将IL汇编成可跨平台可执行的(pe)文件。可供我们了解别人代码和修改。有了他我们看待问题可以不用停留在编辑器层面,可深入中间层。
VS中增加IL DASM工具
我们在安装VS同时都会自动安装ildasm工具,无需另行安装。ildasm工具打开方法如下图:
我们也可以直接wind+R.输入:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe (window 7 64位 操作系统安装目录) 同样可以打开ildasm。
我们也可以把ildasm工具增加到我们常用的VS中。
1.工具(Tools)-->外部工具(External Tools..)
2.添加内容填写对应信息。命令:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe
(window 7 64位 操作系统安装目录) 。
已上信息填写完成后,在“工具”选择卡中能找到我们刚增加的外部工具名称(IL_DASM)。增加完成后可以小试一把。
国际惯例来段"Hello World"。代码编写完后直接F6生成exe文件,然后工具-->IL_DASM-->确认(无需修改任何参数,默认目标文件路径)。系统会弹出IL工具,我们双击Main方法。
这时可以看到Main方法在IL中编译的代码。感觉有点陌生不易看懂。 还有IL编译出现的三角型,正方型都是啥!
IL DASM 基础
1.图标含义
使用IL反编译出项目代码
MANIFEST:是一个附加信息列表,主要包含程序集的一些属性,如程序集名称、版本号、哈希算法等;
Democode:项目名称
Democodeing.Common:命名空间
Democodeing.ICar:接口
Democodeing.Program:类,主要查看存类下面的内容。
.class 类信息项代码:
.class private auto ansi beforefieldinit DemoCoding.Programextends [mscorlib]System.Object { } // end of class DemoCoding.Program
1).class,表示Program是一个类。并且它继承自程序集—mscorlib的System.Object类;
2)private,表示访问权限;
3)auto,表示程序的内存加载全部由CLR来控制;
4)ansi,是为了在没有托管代码与托管代码之间实现无缝转换。这里主要指C、C++代码等;
5)beforefieldinit,是用来标记运行库(CLR)可以在静态字段方法生成后的任意时刻,来加载构造器(构造函数);
.ctor 方法代码:
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {// 代码大小 7 (0x7).maxstack 8IL_0000: ldarg.0IL_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(string[] args) cil managed {.entrypoint// 代码大小 19 (0x13).maxstack 8IL_0000: nopIL_0001: ldstr "Hello World"IL_0006: call void [mscorlib]System.Console::WriteLine(string)IL_000b: nopIL_000c: call string [mscorlib]System.Console::ReadLine()IL_0011: popIL_0012: ret } // end of method Program::Main
1) hidebysig:表示当把此类作为基类,存在派生类时,此方法不被继承,同上构造函数;
2).entrypoint:指令表示CLR加载程序时,是首先从.entrypoint开始的,即从Main方法作为程序的入口函数;
3)nop:为空该指令,主要给外部设备或者指令间隙准备时间;
4)ldstr:创建String对象变量"Hello World." ;
5)pop:取出栈顶的值。当我们不需要把值存入变量时使用;
使用IL DASM 修改EXE程序代码
1.打开IL工具,选择所要修改的EXE程序。
2.文件-->转储。确定后选择另存路径,会生成二个文件:*.il 和 *.res
3.用记事本打开*.il修改里面的内容:
.method private hidebysig static void Main(string[] args) cil managed{.entrypoint// 代码大小 19 (0x13).maxstack 8IL_0000: nopIL_0001: ldstr "Hello World-[已使用il工具修改过...]"IL_0006: call void [mscorlib]System.Console::WriteLine(string)IL_000b: nopIL_000c: call string [mscorlib]System.Console::ReadLine()IL_0011: popIL_0012: ret} // end of method Program::Main
4.把修改后的代码编译成EXE程序。
ilasm /exe /output=C:\CK.exe /Resource=C:\Users\Ck\Desktop\coding.res C:\Users\Ck\Desktop\coding.il
修改就这么简单。运行修改后的EXE程序,值已修改。
转载于:https://www.cnblogs.com/caokai520/p/4921706.html
C# IL DASM 使用相关推荐
- CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...
- C#强化系列文章四:匿名方法的使用
匿名方法相信很多人都听过,它是C#2.0的一个新特性,顾名思义,匿名方法就是没有名称的方法.那么在C#中的匿名方法有哪些好处,在C#中如何使用呢? 匿名方法最明显的好处就是可以降低另写一个方法的工作量 ...
- 把委托说透(2):深入理解委托
在上一篇随笔中我们通过示例逐步引入了委托,并比较了委托和接口.本文将重点剖析委托的实质. 委托在本质上仍然是一个类,我们用delegate关键字声明的所有委托都继承自System.MulticastD ...
- .Net 中的反射(反射特性) - Part.3
.Net 中的反射(反射特性) - Part.3 反射特性(Attribute) 可能很多人还不了解特性,所以我们先了解一下什么是特性.想想看如果有一个消息系统,它存在这样一个方法,用来将一则短消息发 ...
- 转:.Net 中的反射(反射特性) - Part.3
.Net 中的反射(反射特性) - Part.3 反射特性(Attribute) 可能很多人还不了解特性,所以我们先了解一下什么是特性.想想看如果有一个消息系统,它存在这样一个方法,用来将一则短消息发 ...
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...
- C#编译器优化那点事
使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的. 优化代码开关即optimize开 ...
- DotnetCharting控件的破解方法
在.net使用DotNetCharting控件生成报表统计图总结 文章中,不少博友提出"1.生成的图片带超链接导向官网,如何处理呀?2.我使用这个控件后,图形可以显示出来.但是发现一个小问题 ...
- C#代码中背后进行的值拷贝
一种经常发生的装箱 Int32 i = 100; Console.WriteLine("The number is: " + i); 通过VS SDK Tools里的IL DASM ...
最新文章
- 特斯拉车主「作死」成真:炫耀「主驾无人」,自动驾驶导致车毁人亡
- [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones
- java.lang.IllegalStateException: getOutputStream() has already been called for this response
- 在Amazon FreeRTOS V10中使用运行时统计信息
- Spring Boot + Mybatis 快速整合
- 输入身份证号,输出出生日期
- Linux下的Notepad++编辑器——Notepadqq
- 【C/C++】变量的内存分配
- android 电池续航时间,《Android优化专题》——优化电池续航能力
- CMD attrib命令详解
- 【原】oracle external table
- 「兼容M1」iZotope RX 9 Advanced for Mac - 音频修复工具
- 手机中如何处理Excel格式转换PDF格式
- [转]java中的io笔记
- paip.提升性能----jvm参数调整.txt
- 一年披露落地应用27项 IBM区块链只为反哺云业务?
- 彻底解决金山毒霸锁定chrome主页
- CSDN 社区内容创作规范
- 如何避免数据湖变成数据沼泽
- Docker快速安装部署
热门文章
- SpringBoot微信公众号授权访问认证文件部署
- @Autowired和@Resouce的区别
- Mybatis (ParameterType) 如何传递多个不同类型的参数
- Java对二叉树的操作
- Kotlin进行异步操作
- ROS知识【11-1】:建立用户自己的工作空间、功能包
- c++ dump某个变量_linux内核调试之 crash分析dump文件
- android view setx,Android的setX()和setY()表现不可思议
- 加载pdf_Java 插入附件到PDF文档
- solaris与linux区别,solaris与linux命令的区别