菜单

皇家国际娱乐平台:详解.NET IL代码(一)

2019年5月4日 - 皇家赌场系统

一、背景

近年来项目组新上连串,交付的年华比较殷切,原本好的分段管理习于旧贯未有服从好,于是出现下边处境:

  1. 两个小伙伴在不一样的分段上付出。
  2. 本来QA境遇也设有3个阻碍性的bug A
  3. 一人同事在QA景况发表了新的代码,引进了新bug B
  4. 回滚QA能修改bug B,不过对于bugA却不知所可
  5. 再者,混乱的代码管理已经产生力不从心明确原始公布包对应的代码版本。

末尾深陷了两难的程度,既无法发表新包,回滚也不知所可消除难题。
幸好事先领悟到何等使用微软官方工具ILAsm与ILDasm对dll文件举行改造,于是从头入手达成。上面将会用示例代码讲明如何修改已经的.exe文件。

  本文重要介绍IL代码,内容半数以上来自网上,举行规整合并的。

  1. 程序集和CIL:

C# 反编写翻译防备,

C# 编写的代码通过VS编写翻译器生成 dll 或 exe
,很轻易被部分反编写翻译工具查看到源码或对源码举办改造。
为幸免代码被反编写翻译或被曲解,大家得以开始展览一定的堤防措施。但不能够杜绝,因为DotNet编写代码运维必须编写翻译成IL
中间语言,IL是很平整,同时也很好反编写翻译。

反编写翻译防守措施:

二、ILAsm与ILDasm

大家精通,.net是三个跨平台的的成本平台,其跨平台则是由其编写翻译的中等语言(Intermediate
Language,
简称IL或MSIL)落成,无论大家应用的是C#、VB.Net、还是F#依然C++,
最后都会被编译成IL,由JIT(Just In Time)编写翻译成目的机器语言,在CLR(Commen
Language Runtime, 公用语言运转时)上运转。

所以,理论上,大家能够跳过过经常选取的C#代码,间接修改IL,然后生成对应的dll大概exe文件。

那么哪些查看与修改IL呢,那就是ILAsm与ILDasm的干活了。ILAsm (MSIL
Assembler),用来从IL语言生成PE(Portable
Executable),也正是.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翼虎的功底;大批量的实例分析是以IL为底蕴的,所以领会IL,是读懂别人代码的供给基础,同时和睦也能够赢得影响的滋长;

艺术一:防止 Ildasm.exe(MSIL 反汇编制程序序) 反汇编制程序序集

办法很简短在类型文件AssemblyInfo.cs中加进SuppressIldasm属性。

皇家国际娱乐平台 1

当项目中加进SuppressIldasm属性后在采纳ildasm.exe反编写翻译代码,会唤醒:”受保障的模块
— 无法进展反汇编”

皇家国际娱乐平台 2

ildasm.exe 读取项目中包罗 SuppressIldasm
属性就不对此程序集实行反编写翻译。但ILSyp,Reflector等反编写翻译工具针对程序集设置SuppressIldasm属性置之脑后,同样能够反编写翻译源码。

缺点:
可知SuppressIldasm
属性只针对ildasm.exe工具起效果,同时也能去除ildasm.exe工具的此项限制。参考:《去掉ILDasm的SuppressIldasmAttribute限制》

三、使用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所示:
皇家国际娱乐平台 3

最后会扭转对应的.il与.res文件。
皇家国际娱乐平台 4

 什么是IL?

  IL是.NET框架中中间语言(Intermediate
Language)
的缩写。使用.NET框架提供的编写翻译器能够一贯将源程序编写翻译为.exe或.dll文件,但此时编写翻译出来的程序代码并不是CPU能一向试行的机械代码,而是一种中间语言IL(Intermediate
Language)的代码(来源百度)。

   IL指令大全  点这里

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

  1. 程序集带有:

方法二:混淆

模糊原理:将VS编写翻译出的文件(exe 或
dll)通过ildasm对文本进行重命名,字符串加密,移动等办法将原始代码打乱。那种办法比较常见。

VS201三 自带混淆工具:工具–>PreEmptive Dotfuscator and Analytics

皇家国际娱乐平台 5

但VS20一三自带Dotfuscator 伍.5 需购置激活技能动用成套意义。近来百度提供
DotfuscatorPro 4.九 破解版版本下载。

打开 DotfuscatorPro 4.9 主界面

皇家国际娱乐平台 6

Settings->Global Options 全局配置
常用作用配置:Disable String Encryption=NO 启用字符串加密

皇家国际娱乐平台 7

分选需混淆C#编写翻译代码(dll 或 exe)
其间Library不要勾选,不然有个别类、变量等等不会搅乱;

皇家国际娱乐平台 8

Rename 重命名配置
常用功效布局: 勾选 = use enhanced overload induction 使用加强格局
重命名方案 Renaming Scheme = Unprintable
(不可打字与印刷字符,即乱码),也得以选拔其它如小写字母、大写字符、数字的不2秘籍。

皇家国际娱乐平台 9

String Encryption 字符串加密
勾选须求加密字符串文件(exe 或 dll)

皇家国际娱乐平台 10

可根据各自须求可进展别的有关配置。(如:control flow,Output,Setting
->Build Settings,Settings –> Project Properties等)
最终生成混淆文件 Build Project。

皇家国际娱乐平台 11

Build Project 生成混淆项目错误:
Could not find a compatible version of ildasm to run on assembly
C:\Users\***bin\Debug\WindowsFormsApplication1.exe.??This
assembly was originally built with .NET Framework v4.0.30319.
Build Error.

管理格局:
ILASM_v4.0.30319 =
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe
ILDASM_v4.0.30319 = C:\Program Files (x86)\Microsoft
SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe
[设置VS版本区别对应目录会有所扭转]

皇家国际娱乐平台 12

四、修改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代码转为机器度和胆识其余机械代码。如下图

皇家国际娱乐平台 13

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

  MSIL的功能:MSIL包罗部分元数据和中间语言指令

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

  为何ASP.NET网址第二遍运营时会很慢,而背后的实施过程则会相对快多数?

  当您首先次运转.NET开辟的站点时,CLHaval会将MSIL通过JIT实行编写翻译,最后调换为施行进程尤其快的Native
Code。那足以表明。

  关于那1有些,作者也比比较小熟练,今后再上学。

混淆代码相比

未使用混淆工具,反编写翻译出的源码:

皇家国际娱乐平台 14

利用混淆工具,反编写翻译出的源码:

皇家国际娱乐平台 15

效果很鲜明,极丑出反编写翻译代码所写的的确逻辑。

缺点:
C#代码通过混淆工具生成后,扩张了无数调换进度。那使得反编写翻译工具不能很直观望到源码真正逻辑。但源码代码过多调换会使软件本人运行效能降低,乃至会产出报错情状。

反编写翻译堤防, C# 编写的代码通过VS编写翻译器生成
dll 或 exe ,很轻便被部分反编写翻译工具查看到源码或对源码实行改变。
为防卫代码被反编写翻译…

五、使用ILAsm生成exe

修改保存完.il文件之后,接下去的干活正是接纳 ILAsm
让.il文件生成重新生成.exe可实施文件了,在Console中实践如下命令

ilasm ILAsmAndILDasmDemo.il /output:ILAsmAndILDasmDemo_1.exe
// 如果修改的是dll文件,需要加上参数 /dll

皇家国际娱乐平台 16

中标现在会转移1个ILAsmAndILDasm德姆o_一.exe文书,试行那几个文件,大家能够看来,将来曾经显示“登入成功”了。
皇家国际娱乐平台 17
皇家国际娱乐平台 18

动用反编写翻译工具
dotPeekI查看新生成的ILAsmAndILDasmDemo_1.exe文本,大家可以见到,Login(string userName, string password)1度直接return true了。如下图,
皇家国际娱乐平台 19

贰、怎么查看IL代码

先后被编译成程序集之后,双击运维,程序集会被加载入CLQashqai(Common
Language Runtime),实施上面包车型大巴步骤:
  1.检查程序集的安全特点。
  2.拓展内部存款和储蓄器分配。
  三.把程序聚集的可实行代码发送给JIT(Just-in-Time)编写翻译器,把在那之中的一片段代码编写翻译成为本机代码。
里头,JIT只会编写翻译被调用的一部分CIL代码,并把编写翻译的结果缓存起来,以备在末端的次第中的多次调用,
那保障了编写翻译与运转的频率。

六、总结

其余,上边所做的业务莫过于也是《CL凯雷德 via C#》中提到强名能够
严防代码被不怀好意的人歪曲
的2个反面教材了。通过那个事例,大家应该对代码被歪曲的高风险也有一定的认识了,所以借使我们要求将和睦的.dll(.exe)文件露给外人,最佳如故打上强名,幸免别人恶意篡改你的代码,导致不要求的损失。

通过此番风云,也作证了多精晓下底层照旧很有供给的,说不定哪天就用上了。日常再忙,也不可能只限于只职业和编制程序语言层面,还亟需对底层有必然的刺探,那样手艺知其然与知其所以然。

就算如此这次在不修改c#代码的动静下完善化解QA的情形难题,但是那种形式也只限于小范围的改动,只试用于救急。所以给自身的训诫是分段管理规范才是王道,要能做到时时可揭橥,随时可回滚才行,那样本事完全防止再现这样难堪的景况了。

  (壹)工欲善其事,必先利其器

   未来能够查阅IL的工具其实过多。

   (1)ILDasm

    伸开vs,在工具 – > 外部工具
,把ILDasm导入到VS工具中,具体如下:

    皇家国际娱乐平台 20

    位置:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe,

    Microsoft
SDKs\Windows下的文本夹下有几个ildasm,包括的版本有.NET 四.0
,4.伍.1,四.陆,四.6.一,四.6.二等

    在VS的工具下那时就能够看看,张开ILDasm,然后展开想看的dll或exe就能够了,IL代码通过ILDasm反编写翻译后,如下:

    皇家国际娱乐平台 21

    符号解释:

皇家国际娱乐平台 22

借使想查看IL,通过文件-转储保存下来就足以查看

    (2)ILSpy

     使用简便,注意:默许选项的是c#,改为IL就可以,下载地址:

     (3)Reflector 

      这是也是很有名的,不介绍了,使用教材:

     (4)LINQPad

      它实质上是个对linq方面包车型客车工具,但也足以看IL

      皇家国际娱乐平台 23

 

    (5)Resharper

      张开艺术:vs的Resharper菜单栏-window-IL
Viewer,随时都足以查阅

      有规则的,提议使用,十分方便

由此JIT编写翻译之后的代码就是本机代码,本机代码最终被CPU执行。

  (二)实例分析

       待续

 

 

 

参考:

 

大家通过一段轻松的代码来深化明白:

  1. 打开VS,用C#编写壹段如下程序:

    using System;namespace ILTest{ public class Program { public static void Main(string[] args) { Console.WriteLine(“Hello Fred”); Console.Read(); } }}

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图