|
|
51CTO旗下网站
|
|
移动端

1.3.7 CIL和ILDASM

《C# 6.0本质论(第5版)》第1章C#概述,本章使用传统HelloWorld程序介绍C#,重点是C#语法基础,包括在C#程序中定义入口。通过本章的学习,将熟悉C#的语法风格和结构,并能写最简单的C#程序。本节为大家介绍CIL和ILDASM。

作者:周靖/庞燕 译来源:人民邮电出版社|2017-07-21 14:57

1.3.7 CIL和ILDASM

前面说过,C#编译器将C#代码转换成CIL代码而不是机器码。处理器只能理解机器码,因此CIL代码必须先转换成机器码才能由处理器执行。给定一个程序集(DLL文件或可执行文件),可以使用CIL反汇编程序将其析构成对应的CIL表示,从而查看其CIL代码。通常使用微软特有的文件名 ILDASM来称呼这种CIL反汇编程序( ILDASM是IL Disassembler的简称),它能对程序或者它的类库执行反汇编,显示由C#编译器生成的CIL代码。在不同的CLI实现中,使用CIL反汇编程序的命令也有所区别。可以像输出1-8展示的那样,在命令行中执行.NET CIL反汇编程序。

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

输出1-8

  1. >ildasm /text HelloWorld.exe 

使用/ text选项的目的是让输出在命令控制台上显示,而不是在新窗口中显示。执行上述命令得到的输出流是 HelloWorld.exe程序所含CIL代码的一个“转储”(dump)。CIL代码比机器码更容易理解。许多开发人员害怕即使别人没有拿到源代码,程序也容易被反汇编并曝光其算法。

无论是否基于CLI,任何程序防止反编译唯一安全的方法就是禁止访问编译好的程序(例如,只在网站上存放程序,而不把它分发到用户机器上)。但假如目的只是减小别人获得源代码的可能性,可以考虑使用一些混淆器(obfuscator)产品。这些混淆器会打开IL代码,将代码加密成一种功能不变但更难于理解的形式。这可以防止普通开发者访问代码,使程序集难以被反编译成容易理解的代码。除非程序需要对算法进行高级安全防护,否则混淆器足矣。

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

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

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

  1. // Microsoft (R) .NET Framework IL Disassembler. Version 4.6.81.0  
  2. // Copyright (c) Microsoft Corporation. All rights reserved.  
  3. // Metadata version: v4.0.30319  
  4. .assembly extern mscorlib  
  5. {  
  6. .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) //  
  7. .z\V.4..  
  8. .ver 4:0:0:0  
  9. }  
  10. .assembly HelloWorld  
  11. {  
  12. .custom instance void [mscorlib]System.Runtime.CompilerServices.  
  13. CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )  
  14. .custom instance void [mscorlib]System.Runtime.CompilerServices.  
  15. RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70  
  16. 4E 6F 6E 45 78 // ....T..WrapNonEx  
  17. 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.  
  18. // --- The following custom attribute is added automatically, do not  
  19. uncomment -------  
  20. // .custom instance void [mscorlib]System.Diagnostics.  
  21. DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.  
  22. DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 )  
  23. .hash algorithm 0x00008004  
  24. .ver 0:0:0:0  
  25. }  
  26. .module HelloWorld.exe  
  27. // MVID: {1FB5153C-639E-401D-8C94-22A66C18DC7A}  
  28. .imagebase 0x00400000  
  29. .file alignment 0x00000200  
  30. .stackreserve 0x00100000  
  31. .subsystem 0x0003 // WINDOWS_CUI  
  32. .corflags 0x00000001 // ILONLY  
  33. // Image base: 0x01190000  
  34. // =============== CLASS MEMBERS DECLARATION ===================  
  35. .class public auto ansi beforefieldinit AddisonWesley.Michaelis.  
  36. EssentialCSharp.Chapter01.Listing01_01.HelloWorld  
  37. extends [mscorlib]System.Object  
  38. {  
  39. .method public hidebysig static void Main() cil managed  
  40. {  
  41. .entrypoint  
  42. // Code size 13 (0xd)  
  43. .maxstack 8  
  44. IL_0000: nop  
  45. IL_0001: ldstr "Hello. My name is Inigo Montoya."  
  46. IL_0006: call void [mscorlib]System.Console::WriteLine(string)  
  47. IL_000b: nop  
  48. IL_000c: ret  
  49. } // end of method HelloWorld::Main  
  50. .method public hidebysig specialname rtspecialname  
  51. instance void .ctor() cil managed  
  52. {  
  53. // Code size 8 (0x8)  
  54. .maxstack 8  
  55. IL_0000: ldarg.0  
  56. IL_0001: call instance void [mscorlib]System.Object::.ctor()  
  57. IL_0006: nop  
  58. IL_0007: ret  
  59. } // end of method HelloWorld::.ctor  
  60. } // end of class AddisonWesley.Michaelis.EssentialCSharp.Chapter01.  
  61. Listing01_01.HelloWorld  
  62. // =============================================================  
  63. // *********** DISASSEMBLY COMPLETE *********************** 

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

基于这样的一个CIL代码清单,最有趣的可能就是能相对比较容易地理解程序所做的事情,这可比阅读并理解机器码(汇编程序)容易多了。上述代码中出现了对System.Console.WriteLine()的显式引用。CIL代码清单包含许多暂时没有什么用处的外围信息,但如果开发者想要理解C#模块(或者任何基于CLI的程序)的内部工作原理,但又拿不到源代码,那么只要作者没有使用混淆器,理解这样的CIL代码清单还是比较容易的。事实上,一些免费工具(如Red Gate Reflector、ILSpy、JustDecompile、dotPeek和CodeReflect)可以将CIL自动反编译成C#。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

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

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管员必读—网络基础

本书共分两篇,15章。其中前6章为网络理论基础篇,介绍的是基本的网络技术,包括计算机网络分类、网络通信协议、IP地址和网线制作等。在第...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊