最近在看Enpert .NET 2.0 IL Assembler这本书,可能会花去我很多时间,不过只是看了第一张就被它折服了,原作者简直是庖丁解牛,层层深入。翻译又是那么牛B,此书建议有想深入了解NET的朋友一看。

下面用vs自带的IL汇编和反汇编器做个小demo,算是对工具的简单使用吧。

vs建个控制台程序,fm 4.0的。来个hello world。然后编译下生成下,去它的bin目录找到exe

打开ILDASM工具。它在这里:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe

打开它,然后将刚刚生成的exe拖进去,然后【文件-->转存】为IL文件。这里关于ildasm工具的各种图标意义可以看它的帮助文档(chm),这里贴上

可以用文本编辑器打开这个il文件,结构如下:

//  Microsoft (R) .NET Framework IL Disassembler.  Version 4.0.30319.33440// Metadata version: v4.0.30319
.assembly extern mscorlib
{.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4...ver 4:0:0:0
}
.assembly helloworld
{.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 1A 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B   // ....NETFramework2C 56 65 72 73 69 6F 6E 3D 76 34 2E 30 01 00 54   // ,Version=v4.0..T0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C   // ..FrameworkDispl61 79 4E 61 6D 65 10 2E 4E 45 54 20 46 72 61 6D   // ayName..NET Fram65 77 6F 72 6B 20 34 )                            // ework 4.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 0A 68 65 6C 6C 6F 77 6F 72 6C 64 00 00 )    // ...helloworld...custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 0A 68 65 6C 6C 6F 77 6F 72 6C 64 00 00 )    // ...helloworld...custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 12 43 6F 70 79 72 69 67 68 74 20 C2 A9 20   // ...Copyright .. 20 32 30 31 35 00 00 )                            //  2015...custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 36 36 31 66 62 31 61 66 2D 62 30 36 36   // ..$661fb1af-b0662D 34 32 63 38 2D 38 33 61 37 2D 61 38 35 34 31   // -42c8-83a7-a854134 32 62 36 39 36 34 00 00 )                      // 42b6964...custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 )             // ...1.0.0.0..// --- 下列自定义特性会自动添加,不要取消注释 -------//  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows..hash algorithm 0x00008004.ver 1:0:0:0
}
.module helloworld.exe
// MVID: {35A069E0-CDD1-4B8A-B64F-AFE8AD9880B1}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x008A0000// =============== CLASS MEMBERS DECLARATION ===================.class private auto ansi beforefieldinit helloworld.Programextends [mscorlib]System.Object
{.method private hidebysig static void  Main(string[] args) cil managed{.entrypoint// 代码大小       19 (0x13).maxstack  8IL_0000:  nopIL_0001:  ldstr      "Helo World!"IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)IL_000b:  nopIL_000c:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()IL_0011:  popIL_0012:  ret} // end of method Program::Main.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} // end of class helloworld.Program// =============================================================// *********** 反汇编完成 ***********************
// 警告: 创建了 Win32 资源文件 C:\Users\Jon\Desktop\test.res

然后我们用ILASM来编译它,注意我们刚刚创建的控制台版本 fm是4.0的,所以你要找到对应版本下的ilasm.exe才行。

它的位置是:C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe

2.0对应的是 C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe

然后用ilasm命令编译il并输出到目录下:

cmd控制台打开,定位到ilasm目录下,运行命令(注:我用ildasm反编译exe之后的il文件名改成了test.il,所以下面的名字中是test.il)

C:\Windows\Microsoft.NET\Framework\v4.0.30319>ilasm.exe c:\test.il /output=f:\test.exe /exe

意思是讲c盘根目录下的test.il文件编译输出到f盘下的test.exe文件。

如果控制台出现Operation completed successfully表示编译操作成功。


打开f盘,

运行它看看

这只是对工具的简单使用,重点是读懂msil,以及对msil的随心所欲的修改。路漫漫其修远兮,吾将上下而求索。

IL反汇编器(ILDASM)和IL汇编器(ILASM)Hello World小demo相关推荐

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

    Ildasm.exe 概要: 一.前言: 微软的IL反编译实用程序--Ildasm.exe,可以对可执行文件(ex,经典的控制台Hello World 的 exe 可执行文件)抽取出 IL 代码,并且 ...

  2. 通过学习反编译和修改IL,阅读高人的代码,提高自身的水平。 【转】

    本文取了一个很"高雅"的名字,实际上可以用一个英文单词概括:crack. 当然,我不鼓吹随意的crack别人劳动成果以便自身谋取利益.我更推崇的是通过阅读掌握他人优雅的代码,提高自 ...

  3. 老赵谈IL(3):IL可以看到的东西,其实大都也可以用C#来发现

    在上一篇文章中,我们通过一些示例谈论了IL与CLR中的一些特性.IL与C#等高级语言的作用类似,主要用于表示程序的逻辑.由于它同样了解太多CLR中的高级特性,因此它在大部分情况下依旧无法展现出比那些高 ...

  4. 艾伟:老赵谈IL(3):IL可以看到的东西,其实大都也可以用C#来发现

    在上一篇文章中,我们通过一些示例谈论了IL与CLR中的一些特性.IL与C#等高级语言的作用类似,主要用于表示程序的逻辑.由于它同样了解太多CLR中的高级特性,因此它在大部分情况下依旧无法展现出比那些高 ...

  5. 老赵谈IL(4):什么时候应该学IL,该怎么学IL

    又是一个拖了半年的系列,可能是前几篇主要以事实为准,举例子的文章总是比较容易写的,因此十分顺畅.而最后一篇打算做一个总结,以讲道理为主--却发现该将的似乎都已经讲完了.不过做事要有始有终,该完成的也必 ...

  6. 开放源码的.NET 反编译工具 .NET IL调试工具 学习微软中间语言(MSIL)的绝佳工具 Dotnet IL Editor 推荐...

    Dotnet IL Editor是一款.NET平台反编译工具,可以反编译.NET程序集文件为IL代码,并且可以执行,调试反编译后生成的IL代码.它的设计出发点比较直观,新建一个项目,添加程序集文件,设 ...

  7. 微信小程序如何反编译,如何获取线上任何微信小程序源码

    原文地址:https://www.yii666.com/learning/developers/19.html 准备工作 下载并安装 nodejs,本次版本为 v6.10.0 下载 反编译脚本 下载地 ...

  8. 微信小程序反编译wxss文件缺失_如何找回微信小程序源码?2020年微信小程序反编译最新教程 小宇子李...

    前言:在网上看了找回微信小程序源码很多教程,都没法正常使用.微信版本升级后,会遇到各种报错, 以及无法获取到wxss的问题.查阅各种资料,最终解决,于是贴上完整的微信小程序反编译方案与教程. 本文章仅 ...

  9. 微信小程序反编译wxss文件缺失_如何找回微信小程序源码?2019年微信小程序反编译最新教程...

    前言:在网上看了找回微信小程序源码很多教程,都没法正常使用.微信版本升级后,会遇到各种报错, 以及无法获取到wxss的问题.查阅各种资料,最终解决,于是贴上完整的微信小程序反编译方案与教程. 本文章仅 ...

  10. Vue、ElementUI配合Node、multiparty模块实现图片上传并反显_小demo

    我们先看一下效果图 首先,我利用了Element的一个upload组件,我们可以直接使用它. html: <!-- 上传图片 --><el-upload<!-- 文件状态改变时 ...

最新文章

  1. 常用的监听事件(android)
  2. CSV XLS文件区别
  3. BeautfuiSoup4解析器
  4. 【Python-ML】SKlearn库性能指标-混淆矩阵和F1
  5. python 利用pyinstaller 编译.exe文件过程中编写完的.exe文件执行过程中闪退
  6. Modify text in webclient ui - persistent mode
  7. source insight 函数不能跳到definition_小技能: Windows10突然不能复制粘贴谁搞鬼
  8. IT公司老板落水,各部门员工怎么救
  9. 【抽奖】若川诚邀你加前端群,长期交流学习~
  10. python学习:re模块
  11. 案例精解企业级网络构建
  12. ipython的使用
  13. http 性能测试 wrk使用教程
  14. 1705. 吃苹果的最大数目
  15. linux学习笔记-7.文件属性
  16. Vue框架实例成员及项目搭建
  17. 中标麒麟安装mysql教程_中标麒麟上安装配置达梦数据库7
  18. 【EXLIBRIS】#小词旮旯# 003 Comrade
  19. centos查询mysql端口被占用_centos查看端口占用情况
  20. 企业员工全面激励训练整体解决方案 (节选)

热门文章

  1. 牛顿插值法C语言实现
  2. 小程序-云开发-实现微信云支付功能
  3. 第三方短信验证码服务
  4. Freemarker word导出教程
  5. SystemV 共享内存
  6. RecycleView使用reverse,MIUI截长屏无法截全屏的问题
  7. st8s003 c语言编译器,stm8s003f3p6
  8. 如何重置华为交换机初始密码?
  9. 推荐系统实战--movieslens数据集实现UserCF算法
  10. 如何自动化入侵海康设备