来自 澳门新葡亰 2019-11-20 12:39 的文章
当前位置: 澳门新葡亰app > 澳门新葡亰 > 正文

个人博客分页显示随笔列表的页面中,我们在安

(2016年4月5日更新:微软现已修复了Roslyn的这些bug,详见 )

IL DASM反编写翻译工具

  使用C#的古人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认知。作者最先接触到那工具是集团同事使用她反编译exe程序,举行研读和改造。认为他依旧很强盛。
  IL是微软平台上的一门中间语言,我们常写的C#代码在编译器中都会活动转变到IL,然后在由即时编写翻译器(JIT Compiler)转变学工业机械器码,最后被CPU施行。ildasm.exe反编译工具将IL汇编成可跨平台可进行的(pe卡塔尔文件。可供大家精通外人代码和退换。有了她大家对待难题可以毫不停留在编辑器层面,可深切中间层。

几天前,大家用VS二〇一六编写翻译了博客程序中的三个程序集并公布上线。

VS中增加IL DASM工具

大家在装置VS同期都会活动安装ildasm工具,无需重复安装。ildasm工具展开艺术如下图:

图片 1

我们也足以直接wind+Evoque.输入:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe (window 7 陆十四人 操作系统安装目录) 相似能够张开ildasm。
咱俩也可以把ildasm工具增到大家常用的VS中。
1.工具(Tools)-->外界工具(External Tools..)

图片 2

2.增加剧情填写对应消息。命令:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe
(window 7 六17个人 操作系统安装目录) 。

图片 3

已上音信填写实现后,在“工具”选取卡中能找到大家刚扩展的外界工具名称(IL_DASM)。扩充完毕后能够小规模试制生龙活虎把。
国际惯例来段"Hello World"。代码编写完后直接F6生成exe文件,然后工具-->IL_DASM-->确认(无需改善任何参数,默许目的文件路线)。系统会弹出IL工具,我们双击Main方法。

图片 4

那儿能够看看Main方法在IL中编写翻译的代码。认为有些素不相识不易看懂。 还可能有IL编译现身的三角型,正方型都以什么!

后天有园友反馈向我们反馈,个人博客分页显示小说列表的页面中,“上生机勃勃页”“下风流倜傥页”展现乱码:

IL DASM 基础

1.Logo含义

图片 5

选用IL反编写翻译出项目代码

图片 6

MANIFEST:是一个叠合消息列表,首要包蕴程序集的一些品质,如程序集名称、版本号、哈希算法等;
Democode:项目名称
德姆ocodeing.Common:命名空间
Democodeing.ICar:接口
德姆ocodeing.Program:类,主要查看存类上边包车型大巴从头到尾的经过。

.class 类新闻项代码:

.class private auto ansi beforefieldinit DemoCoding.Program
       extends [mscorlib]System.Object
{
} // end of class DemoCoding.Program

1卡塔尔.class,表示Program是八个类。並且它继续自程序集—mscorlib的System.Object类;
2卡塔 尔(英语:State of Qatar)private,表示访谈权限;
3卡塔 尔(英语:State of Qatar)auto,表示程序的内部存款和储蓄器加载全部由CLENCORE来决定;
4卡塔 尔(英语:State of Qatar)ansi,是为了在还未有托管代码与托管代码之间达成无缝调换。这里最主要指C、C++代码等;
5卡塔 尔(英语:State of Qatar)before田野init,是用来标识运转库(CLKoleos卡塔 尔(阿拉伯语:قطر‎能够在静态字段方法生成后的即兴时刻,来加载构造器(构造函数卡塔 尔(英语:State of Qatar);

.ctor 方法代码:

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // 代码大小       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  ret
} // end of method Program::.ctor

1卡塔 尔(英语:State of Qatar)cil managed:表示当中为IL代码,提醒编写翻译器编写翻译为托管代码;
2卡塔 尔(阿拉伯语:قطر‎.maxstack:表示调用构造函数.otor时期的评估旅馆(Evaluation Stack) ;
3)  IL_0000:标识代码行开端;
4卡塔 尔(阿拉伯语:قطر‎ldarg.0:表示转发第三个分子参数,在实例方法中指的是当下实例的援引;
5卡塔尔call:call日常用于调用静态方法,因为静态方法是在编写翻译期就鲜明的。而这里的结构函数.otor()也是在编写翻译期就制定的。而另一指令callvirt则意味着调用实例方法, 它是在运转时规定的,因为如前述,当调用方法的存在延续关系时,将在相比基类与派生类的同名函数的达成形式(virtual和new卡塔尔,以鲜明调用的函数所属的Method Table;
6卡塔 尔(英语:State of Qatar)ret:表示实行完毕,重回;

Main() 静态方法代码:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       19 (0x13)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello World"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  call       string [mscorlib]System.Console::ReadLine()
  IL_0011:  pop
  IL_0012:  ret
} // end of method Program::Main

1卡塔 尔(阿拉伯语:قطر‎hidebysig:表示当把该类作为基类,存在派生类时,此方法不被三番四回,同上构造函数;
2卡塔尔国.entrypoint:指令表示CLLAND加载程序时,是率先从.entrypoint开始的,即从Main方法作为程序的入口函数;
3卡塔尔国nop:为空该指令,首要给外界设备也许指令间隙筹划时间;
4卡塔尔ldstr:创造String对象变量"Hello World." ;
5卡塔 尔(阿拉伯语:قطر‎pop:抽取栈顶的值。当大家没有需求把值存入变量时使用;

图片 7

动用IL DASM 更改EXE程序代码

1.开荒IL工具,选用所要修改的EXE程序。

图片 8

2.文件-->转储。分明后选用另存路线,会变动贰个文本:*.il 和 *.res

图片 9

3.用记事本展开*.il改进里面包车型大巴始末:

 .method private hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // 代码大小       19 (0x13)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "Hello World-[已使用il工具修改过...]"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  call       string [mscorlib]System.Console::ReadLine()
    IL_0011:  pop
    IL_0012:  ret
  } // end of method Program::Main

4.把修正后的代码编写翻译成EXE程序。

ilasm /exe /output=C:CK.exe /Resource=C:UsersCkDesktopcoding.res C:UsersCkDesktopcoding.il

图片 10

改良就好像此轻便。运转修正后的EXE程序,值已纠正。

图片 11

 

而以此地点的“上豆蔻梢头页”“下一页”字符串适逢其会是在大家明日宣布的主次聚集定义的:

public class Pager : Control
{
    protected string PreviousText = "上一页";
    protected string NextText = "下一页";

    //...
}

可是明日大家并未纠正那有个别代码,料定不是大家明日代码修改引起的。

于是乎,咱们改用VS2011双重编写翻译了眨眼间间这几个程序集,更新之后,乱码立马消失。

随着,用ILSpy反编写翻译了VS二〇一四所编译出的次第集的IL代码之后,水落石出:

public class Pager : Control
{
    protected string PreviousText = "ÉÏÒ»Ò³";
    protected string NextText = "ÏÂÒ»Ò³";
    //...
}

原来是VS二零一六所用的编写翻译器惹的祸,而以此编写翻译器正是大名鼎鼎的 Roslyn 。

世家使用 Visual Studio 二零一六 时索要静心一下以此主题素材。

【补充】

用ildasm查看VS2015编译出来的次第集的IL代码(乱码卡塔 尔(英语:State of Qatar):

.maxstack  2
IL_0000:  ldarg.0
IL_0001:  ldstr      bytearray (C9 00 CF 00 D2 00 BB 00 D2 00 B3 00 ) 
IL_0006:  stfld      string BlogServer.Web.Controls.Pager::PreviousText
IL_000b:  ldarg.0
IL_000c:  ldstr      bytearray (CF 00 C2 00 D2 00 BB 00 D2 00 B3 00 ) 
IL_0011:  stfld      string BlogServer.Web.Controls.Pager::NextText

用ildasm查看VS二〇一三编写翻译出来的前后相继集的IL代码(未乱码卡塔尔:

.maxstack  2
IL_0000:  ldarg.0
IL_0001:  ldstr      bytearray (0A 4E 00 4E 75 98 )                               // .N.Nu.
IL_0006:  stfld      string BlogServer.Web.Controls.Pager::PreviousText
IL_000b:  ldarg.0
IL_000c:  ldstr      bytearray (0B 4E 00 4E 75 98 )                               // .N.Nu.
IL_0011:  stfld      string BlogServer.Web.Controls.Pager::NextText

【难点由来与一时解决措施】

在GitHub上付出Issue之后,从光复中搜查缴获那一个主题素材与Roslyn检查测量检验文件编码的管理格局有关。

翻开现身乱码难点的.cs文件编码,开选用的是ANSI编码。于是以UTF-8编码另存该公文,然后用VS二零一五重复编写翻译,难点解决。

VS二〇一四 RC中没那么些主题素材。

【GitHub上的连锁链接】

* VS二零一六打开非unicode编码的代码,在那之中变量名有汉语就不能编写翻译的bug

* .NET compiler produces incorrect string constants in MSIL when C# source files encoded with non-UTF-8 encoding

* VS2015 (MSBuild/14) compiler can't detect file ecoding correctly

* Chinese string is compiled to garbage characters

* Roslyn can't detect 932 encoding

本文由澳门新葡亰app发布于澳门新葡亰,转载请注明出处:个人博客分页显示随笔列表的页面中,我们在安

关键词: