频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

1.6 CIL和ILDASM

作者: (美)米凯利斯(Michaelis, M.)著/周靖译 出处:人民邮电出版社  2008-07-18 16:30    砖    好    评论   进入论坛
阅读提示:《C#本质论》第1章C# 概述,这一章使用传统的HelloWorld程序来介绍C#,将重点放在C#语法基础上,其中包括在C#程序的可执行文件中定义一个入口,通过本章的学习,您将熟悉C#的语法风格和结构,并能够开始写最简单的C#程序,本节为大家介绍CIL和ILDASM。

1.6 CIL和ILDASM

前面说过,C#编译器将C#代码转换成CIL代码,而不是处理器能够理解的机器码。给定一个程序集(DLL文件或可执行文件),则可以使用一个CIL反汇编实用程序将程序集析构成对应的CIL表示,从而查看它的CIL代码(通常使用Microsoft特有的文件名ILDASM来称呼CIL反汇编程序,ILDASM是IL Disassembler的简称)。该程序能对一个程序或者它的类库执行反汇编处理,显示由C#编译器生成的CIL代码。

在不同的CLI实现中,使用CIL反汇编程序的命令也有所区别。可以像输出1-8展示的那样,在命令行中执行.NET CIL反汇编程序:

输出1-8

>ildasm /text HelloWorld.exe

使用/text选项的目的是让输出在命令控制台上显示,而不是在一个新窗口中显示。类似地,Mono反汇编程序实现默认在命令控制台上显示,如输出1-9所示。

输出1-9

>monodis HelloWorld.exe

执行上述命令得到的输出流是包含在HelloWorld.exe程序中的CIL代码的一个转储(dump)。注意,CIL代码要比机器码容易理解得多。许多开发者会因此而担心,因为这样的程序更容易被反编译,而且无需拿到源码,别人即可理解程序所采用的算法。

任何程序,不管是不是基于CLI的,防止反编译的唯一安全的方法就是禁止用户访问编译好的程序(例如,只在一个网站上存放程序,而不是把它分发到用户机器上)。然而,假如你的目的只是减小别人获得源代码的可能性,那么可以考虑使用一些混淆器(obfuscator)产品。这些混淆器能防止别人随便就访问到代码。它创建的程序集经过了特殊处理,很难被反编译成容易理解的代码。除非一个程序需要对算法进行高级的安全保护,否则混淆器就足够了。

高级主题:HelloWorld.exe的CIL输出

代码清单1-18展示了ILDASM创建的CIL代码。

代码清单1-18 示例CIL输出

 // Metadata version: v2.0.50727
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly HelloWorld
{
.custom instance void
[mscorlib]System.Runtime.CompilerServices.CompilationRelaxations
Attribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void
[mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAt
tribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E
45 78                                   // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module HelloWorld.exe
// MVID: {49C96993-E12B-4DD2-A127-34909F7C9A15}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003         // WINDOWS_CUI
.corflags 0x00000001      //  ILONLY
// Image base: 0x02EA0000
  .class private auto ansi beforefieldinit HelloWorld
extends [mscorlib]System.Object
{
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size      13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr    "Hello. My name is Inigo Montoya."
IL_0006: call     void
[mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method HelloWorld::Main
    .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 HelloWorld::.ctor
 } // end of class HelloWorld

程序最开头是清单(manifest)信息。其中不仅包括被反编译的模块的全名(HelloWorld.exe),还包括它依赖的所有模块和程序集及其版本信息。

基于这样的一个CIL代码清单,最有趣的事可能就是我们能相对比较轻松地理解程序所做的事情,这可比阅读并理解机器码(程序集)容易多了。在上述代码中,出现了对System.Console. WriteLine()的一个显式引用。

在CIL代码清单中,包含许多暂时没有什么用处的外围信息。但是,如果开发者想要理解C#模块(或者任何基于CLI的程序)的内部工作原理,但又无法拿到作者的源码,那么除非作者使用了一个混淆器,否则像这样的CIL代码清单理解起来是相对比较容易的。事实上,有一些免费工具(比如Lutz Roeder的.NET Reflector),可以将CIL自动反编译成C#。

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
专题
程序员如何成长?
C#实用基础教程
C#技术开发指南
C#本质论
Windows Vista之兵法
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
CCNA认证考试Pass必备
CCNA认证考试Pass必备
求职必杀技 决战面试官
求职必杀技 决战面试官
龙芯要做中国的“奔腾”
龙芯要做中国的“奔腾”
· 龙芯要做中国的“奔腾”
· 2008年上半年IT技术图..
· 虚拟化的“赤壁之战”
· 服务器节能与绿色IT
· 微软出价446亿美元收购..
· 脉冲无线电uwb专题
· 802.11n:下一代的无线..
· 云计算时代来临
· IT工程师该不该考CCIE..
· 浏览器的战国时代
· 2008年上半年全国软考..
· 无线网络环境
· 无线网状网(MESH)
· 无线重中之重:安全问题
· 网络故障排除宝典
· Windows Server 2008专..
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SOA 面向服务架构
SOA 面向服务架构
· SOA 面向服务架构
· SQL Server 2008/2005..
· Apache技术专题
· 三层交换技术专题
· SQL Server入门到精通
· 无线网状网(MESH)
· Windows远程桌面应用
· C#技术开发指南
· Apache技术专题
· Windows集群服务应用
· C#技术开发指南
· 文档格式标准开战 OOXM..
· 路由器设置与口令恢复
· Linux 集群技术专题
· PHP开发应用手册
· SOA 面向服务架构
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SQL Server入门到精通
SQL Server入门到精通
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· C#技术开发指南
· 三层交换技术专题
· Apache技术专题
· C#技术开发指南
· Windows远程桌面应用
· 企业数据恢复指南
· Windows集群服务应用
· 路由器设置与口令恢复
· Linux 集群技术专题
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· 解析35岁技术人的价值..