澳门在线威尼斯官方 > 澳门在线威尼斯官方 > 【澳门在线威尼斯官方】什么样使用ILAsm与ILDas

原标题:【澳门在线威尼斯官方】什么样使用ILAsm与ILDas

浏览次数:87 时间:2019-12-01

一、背景

近来项目组新上项目,交付的年月相比较急切,原来好的分支管理习于旧贯未有信守好,于是应时而生上面情状:

  1. 多个小同伙在分裂的分支上付出。
  2. 本来QA景况也存在几个阻碍性的bug A
  3. 一个人同事在QA蒙受颁布了新的代码,引入了新bug B
  4. 回滚QA能改进bug B,可是对于bugA却力不从心
  5. 再者,混乱的代码管理已经变成力不能及明确原始公布包对应的代码版本。

末段深陷了难堪的地步,既不可能发表新包,回滚也回天无力解决难题。
万幸事情未发生前精晓到何以行使微软官方工具ILAsm与ILDasm对dll文件进行改进,于是最初入手达成。下边将会用示例代码解说怎么样改革已经的.exe文件。

  本文首要介绍IL代码,内容大多数源于互连网,进行整理合并的。

二、ILAsm与ILDasm

大家知晓,.net是八个跨平台的的开辟平台,其跨平台则是由其编写翻译的中间语言(Intermediate Language, 简单的称呼IL或MSIL卡塔尔达成,无论大家接收的是C#、VB.Net、还是F#要么C++, 最后都会被编写翻译成IL,由JIT(Just In Time卡塔尔(英语:State of Qatar)编写翻译成指标机器语言,在CLCR-V(Commen Language Runtime, 公用言语运维时卡塔尔(英语:State of Qatar)上运营。

据此,理论上,大家能够跳过过常常选拔的C#代码,直接修正IL,然后生成对应的dll大概exe文件。

那么如何查看与校勘IL呢,那正是ILAsm与ILDasm的干活了。ILAsm (MSIL Assembler),用来从IL语言生成PE(Portable Executable卡塔尔(英语:State of Qatar),也便是.net中大家采取的.exe、.dll文件。ILDasm (MSIL Disassembler),则与ILAsm相反,从PE文件,生成.IL文件。那么大家得以猜到,要修正dll,我们需求先用ILDasm反编写翻译.dll生成.il文件,再用ILAsm编译纠正后的.il文件生成.dll,最后替换.dll文件。

一、IL简介

 为啥要领悟IL代码?

  假如想学好.NET,IL是必得的底子,IL代码是.NET运维的根底,当大家对运作结果有争论的时候,可以通过IL代码透过表面看本质;IL也是越来越好精晓、认知CL奔驰G级的底子;大量的实例深入分析是以IL为底蕴的,所以了然IL,是读懂外人代码的必须功底,同一时间协和也足以赢得影响的增高;

三、使用ILDasm生成IL

先看下示例代码:

    class Program
    {
        static void Main(string[] args)
        {
            var loginResult = Login("foo", "111111");
            if (loginResult)
            {
                Console.WriteLine("登录成功");
            }
            else
            {
                Console.WriteLine("登录失败,请重试");
            }
            Console.ReadLine();
        }
        private static bool Login(string userName, string password)
        {
            if (userName.Equals("johnny") && password.Equals("123456"))
            {
                return false;
            }
            return false;
        }
    }

确定,上述代码针对Login(string userName, string password)的调用会重临false,招致最终Console中会输出"登陆败北,请重试", 大家的目标是因而一贯修改.exe文件,让它回到true, Console里面输出"登入成功"
ILDasm与ILAsm已经富含在Visual Studio发行李包裹中中,无需其余下载安装。按如下步骤实行就可以:

  1. Developer Command Prompt for VS 2017,在在那之中输入指令ILDasm
  2. 在开发的IL Dasm窗口中找到需求矫正的.exe文件。
  3. 选料菜单 File > Dump,弹出的新窗口中式糕点击确认,保存生成的.il文件。

全部经过如上面gif所示:
澳门在线威尼斯官方 1

最终会变卦对应的.il与.res文件。
澳门在线威尼斯官方 2

 什么是IL?

  IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编写翻译器能够一向将源程序编写翻译为.exe或.dll文件,但那时候编写翻译出来的程序代码并非CPU能一贯实行的机械代码,而是生龙活虎种中间语言IL(Intermediate Language)的代码(来源百度卡塔尔国。

   IL指令大全  点这里

   IL代码编写翻译器 ILDasm   点这里

四、修改IL

展开.il文件,会看见如下代码(节选卡塔尔

  .method private hidebysig static bool  Login(string userName,
                                               string password) cil managed
  {
    // Code size       43 (0x2b)
    .maxstack  2
    .locals init ([0] bool V_0,
             [1] bool V_1)
    IL_0000:  nop
    IL_0001:  ldarg.0
    IL_0002:  ldstr      "johnny"
    IL_0007:  callvirt   instance bool [mscorlib]System.String::Equals(string)
    IL_000c:  brfalse.s  IL_001b

    IL_000e:  ldarg.1
    IL_000f:  ldstr      "123456"
    IL_0014:  callvirt   instance bool [mscorlib]System.String::Equals(string)
    IL_0019:  br.s       IL_001c

    IL_001b:  ldc.i4.0
    IL_001c:  stloc.0
    IL_001d:  ldloc.0
    IL_001e:  brfalse.s  IL_0025

    IL_0020:  nop
    IL_0021:  ldc.i4.0
    IL_0022:  stloc.1
    IL_0023:  br.s       IL_0029

    IL_0025:  ldc.i4.0
    IL_0026:  stloc.1
    IL_0027:  br.s       IL_0029

    IL_0029:  ldloc.1
    IL_002a:  ret
  } // end of method Program::Login

以此正是Login(string userName, string password)所对应的IL代码了。倘诺您理解IL语言,能够直接对其改过。
若果不想一向改正IL,咱们得以重写一个小的言传身教方法,直接return true,如下:

private static bool Login()
{
    return true;
}

下一场使用ILDasm生成相应的IL代码,替换我们想修正的诀窍。最后的IL如下:

.method private hidebysig static bool  Login(string userName,
                                               string password) cil managed
  {
    .maxstack 8

    IL_0000: ldc.i4.1     
    IL_0001: ret          

  } // end of method Program::Login

 C#代码编写翻译进度?

  C#源代码通过LC转为IL代码,IL重要含有部分元数据和高级中学级语言指令;JIT编写翻译器把IL代码转为机器度和胆识其他机器代码。如下图

澳门在线威尼斯官方 3

  语言编写翻译器:无论是VB code照旧C# code都会被Language Compiler转换为MSIL

  MSIL的效益:MSIL包蕴部分元数据和西路语言指令

  JIT编写翻译器的功能:依据系统遇到将MSIL中间语言指令调换为机器码

  为何ASP.NET网址第三遍运转时会一点也不快,而背后的履行进程则会相对快超级多?

  当你首先次运转.NET开垦的站点时,CLKuga会将MSIL通过JIT举行编译,最终调换为实施进程十分的快的Native Code。那能够表达。

  关于那生机勃勃某些,笔者也非常小熟稔,今后再上学。

本文由澳门在线威尼斯官方发布于澳门在线威尼斯官方,转载请注明出处:【澳门在线威尼斯官方】什么样使用ILAsm与ILDas

关键词:

上一篇:澳门在线威尼斯官方安顿战术

下一篇:没有了