澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

如何使用ILAsm与ILDasm修改,程序集与CIL

2019-12-01 作者:www.8455.com   |   浏览(164)

一、背景

近几年项目组新上种类,交付的时刻相比热切,原来好的分段管理习贯未有遵从好,于是现身上面情形:

  1. 多少个小同伙在差别的支行上支出。
  2. 原本QA环境也设有一个阻碍性的bug A
  3. 一人同事在QA情况发表了新的代码,引进了新bug B
  4. 回滚QA能更改bug B,不过对于bugA却力所不及
  5. 再者,混乱的代码管理已经变成不能够显明原始宣布包对应的代码版本。

末尾深陷了狼狈的地步,既不可能宣布新包,回滚也回天乏术减轻难点。
幸好头里了然到怎么着利用微软官方工具ILAsm与ILDasm对dll文件进行修正,于是从头初叶完毕。上面将会用示例代码讲明怎样修正已经的.exe文件。

  本文重要介绍IL代码,内容超越49%来源网络,进行重新整建归总的。

  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卡塔尔(英语:State of Qatar)编写翻译成指标机器语言,在CLLX570(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也是越来越好通晓、认识CLOdyssey的底蕴;大量的实例深入分析是以IL为底蕴的,所以通晓IL,是读懂她人代码的须求根基,同期自个儿也足以获得影响的增高;

  • 前后相继集是由.NET语言的编写翻译器采用源代码文件发出的出口文件,日常分为 exe和dll两类,个中exe包含Main入口方法可以双击施行,dll则供给被别的程序集调用实施。
  • CIL(Common Intermediate Language卡塔尔: 公共中间语言①,供给被编写翻译成二进制机器码之后才会被Computer推行。

主意风度翩翩:防止 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)的代码(来源百度卡塔尔(英语:State of Qatar)。

   IL指令大全  点这里

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

  1. 次第集带有:

方法二:混淆

张冠李戴原理:将VS编写翻译出的文件(exe 或 dll卡塔尔通过ildasm对文件实行重命名,字符串加密,移动等方法将原始代码打乱。这种方法比较遍布。

VS二零一一 自带混淆工具:工具-->PreEmptive Dotfuscator and Analytics

澳门新萄京官方网站 5

但VS2011自带Dotfuscator 5.5 需购买激活才干利用成套效应。最近百度提供 DotfuscatorPro 4.9 破解版版本下载。

打开 DotfuscatorPro 4.9 主界面

澳门新萄京官方网站 6

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

澳门新萄京官方网站 7

选料需混淆C#编译代码(dll 或 exe卡塔尔(英语:State of Qatar)
中间Library不要勾选,否则有个别类、变量等等不会搅乱;

澳门新萄京官方网站 8

Rename 重命名配置
常用功用配置: 勾选 = use enhanced overload induction 使用加强方式
重命名方案 Renaming Scheme = Unprintable (不可打字与印刷字符,即乱码),也能够选取其余如小写字母、大写字符、数字的法子。

澳门新萄京官方网站 9

String Encryption 字符串加密
勾选必要加密字符串文件(exe 或 dll卡塔尔(英语:State of Qatar)

澳门新萄京官方网站 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***binDebugWindowsFormsApplication1.exe.??This assembly was originally built with .NET Framework v4.0.30319.
Build Error.

管理方法:
ILASM_v4.0.30319 = C:Windows如何使用ILAsm与ILDasm修改,程序集与CIL。Microsoft.NETFrameworkv4.0.30319ilasm.exe
ILDASM_如何使用ILAsm与ILDasm修改,程序集与CIL。v4.0.30319 = C:Program Files (x86)Microsoft SDKsWindowsv8.1AbinNETFX 4.5.1 Toolsildasm.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开垦的站点时,CLTucson会将MSIL通过JIT实行编写翻译,最终转变为推行进度异常的快的Native Code。那足以表达。

  关于那大器晚成有些,我也相当小谙习,以往再上学。

  • 程序的CIL
  • 前后相继中动用的品类的元数据
  • 次第集清单
  • 局地能源集

混淆代码比较

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

澳门新萄京官方网站 14

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

澳门新萄京官方网站 15

功能很猛烈,非常难看出反编写翻译代码所写的的确逻辑。

缺点:
C#代码通过混淆工具生成后,扩充了非常多转移进度。那使得反编写翻译工具不可能很直阅览到源码真正逻辑。但源码代码过多调换会使软件自己运维效能减弱,以致会现出报错景况。

反编写翻译防卫, C#澳门新萄京官方网站, 编写的代码通过VS编写翻译器生成 dll 或 exe ,相当轻便被一些反编写翻译工具查看见源码或对源码实行改造。 为卫戍代码被反编写翻译...

五、使用ILAsm生成exe

修正保存完.il文件之后,接下去的干活就是使用 ILAsm 让.il文件生成重新生成.exe可试行文件了,在Console中实行如下命令

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

澳门新萄京官方网站 16

成功以后会扭转一个ILAsmAndILDasm德姆o_1.exe文书,实践那几个文件,大家能够观望,以后早就显得"登入成功"了。
澳门新萄京官方网站 17
澳门新萄京官方网站 18

使用反编写翻译工具 dotPeekI查看新生成的ILAsmAndILDasm德姆o_1.exe文书,大家能够看见,Login(string userName, string password)早已直接return true了。如下图,
澳门新萄京官方网站 19

二、怎么查看IL代码

程序被编写翻译成程序集之后,双击运行,程序聚会被加载入CLPAJERO(Common Language Runtime卡塔尔,施行上面的步调:
  1.检查程序集的安全特点。
  2.扩充内存分配。
  3.把程序聚集的可执行代码发送给JIT(Just-in-Time)编译器,把当中的大器晚成有的代码编译成为本机代码。
里面,JIT只会编写翻译被调用的后生可畏对CIL代码,并把编写翻译的结果缓存起来,以备在背后的顺序中的数13遍调用, 这保障了编写翻译与运作的效能。

六、总结

此外,下面所做的业务实在也是《CLOdyssey via C#》中提到强名能够 谨防代码被心怀鬼胎的人歪曲 的二个反面教材了。通过那么些事例,大家应该对代码被窜改的风险也会有早晚的认知了,所以只要我们须要将团结的.dll(.exe卡塔尔(英语:State of Qatar)文件露给外人,最佳照旧打上强名,幸免外人恶意窜改你的代码,招致不需要的损失。

透过此次风浪,也证实了多询问下底层依旧很有必不可缺的,有可能何时就用上了。平常再忙,也不能够只限于只专门的职业和编制程序语言层面,还必要对底层有一定的询问,那样技术知其然与知其所以然。

固然此番在不修改c#代码的动静下完美解决QA的情状难点,但是这种办法也仅限于小范围的更动,只试用于济急。所以给本身的教化是分段管理典型才是王道,要能做届期时可拆穿,任何时候可回滚才行,那样技巧完全防止再度现身那样窘迫的场地了。

  (意气风发)工欲善其事,磨刀不误砍柴工

   今后得以查看IL的工具其实过多。

   (1)ILDasm

    展开vs,在工具 - > 外界工具 ,把ILDasm导入到VS工具中,具体如下:

    澳门新萄京官方网站 20

    位置:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe,

    Microsoft SDKsWindows下的文本夹下有多少个ildasm,包蕴的本子有.NET 4.0 ,4.5.1,4.6,4.6.1,4.6.2等

    在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(); } }}

  1. 行使 ILASM② 工具将次第集反编译为IL(也可生成为ILTest.txt,后缀名不影响文本文件内容卡塔尔国:

    ildasm ILTest.exe /output:ILTest.IL

扭转文书文件如下:

澳门新萄京官方网站 24澳门新萄京官方网站 25

 1 //  Microsoft  .NET Framework IL Disassembler.  Version 4.6.1055.0 2  3 // Metadata version: v4.0.30319 4 .assembly extern mscorlib 5 { 6   .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .zV.4.. 7   .ver 4:0:0:0 8 } 9 .assembly ILTest10 {11   .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor = ( 01 00 08 00 00 00 00 00 ) 12   .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..WrapNonEx13                                                                                                              63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.14 15   // --- 下列自定义特性会自动添加,不要取消注释 -------16   //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 ) 17 18   .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 06 49 4C 54 65 73 74 00 00 )                // ...ILTest..19   .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 ) 20   .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 ) 21   .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 00 00 00 ) 22   .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 06 49 4C 54 65 73 74 00 00 )                // ...ILTest..23   .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 .. 24                                                                                                   20 32 30 31 38 00 00 )                            //  2018..25   .custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 ) 26   .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 ) 27   .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 38 34 66 35 62 34 30 65 2D 39 31 61 65   // ..$84f5b40e-91ae28                                                                                                   2D 34 62 66 63 2D 61 62 38 39 2D 34 61 30 66 66   // -4bfc-ab89-4a0ff29                                                                                                   66 36 64 30 38 31 61 00 00 )                      // f6d081a..30   .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..31   .custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 1C 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B   // ....NETFramework32                                                                                                         2C 56 65 72 73 69 6F 6E 3D 76 34 2E 36 2E 31 01   // ,Version=v4.6.1.33                                                                                                         00 54 0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73   // .T..FrameworkDis34                                                                                                         70 6C 61 79 4E 61 6D 65 14 2E 4E 45 54 20 46 72   // playName..NET Fr35                                                                                                         61 6D 65 77 6F 72 6B 20 34 2E 36 2E 31 )          // amework 4.6.136   .hash algorithm 0x0000800437   .ver 1:0:0:038 }39 .module ILTest.exe40 // MVID: {90543B0E-D1B4-4FFF-9260-57E27FBC4F8B}41 .imagebase 0x0040000042 .file alignment 0x0000020043 .stackreserve 0x0010000044 .subsystem 0x0003       // WINDOWS_CUI45 .corflags 0x00020003    //  ILONLY 32BITPREFERRED46 // Image base: 0x0096000047 48 49 // =============== CLASS MEMBERS DECLARATION ===================50 51 .class public auto ansi beforefieldinit ILTest.Program52        extends [mscorlib]System.Object53 {54   .method public hidebysig static void  Main(string[] args) cil managed55   {56     .entrypoint57     // 代码大小       19 58     .maxstack  859     IL_0000:  nop60     IL_0001:  ldstr      "Hello Fred"61     IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)62     IL_000b:  nop63     IL_000c:  call       int32 [mscorlib]System.Console::Read()64     IL_0011:  pop65     IL_0012:  ret66   } // end of method Program::Main67 68   .method public hidebysig specialname rtspecialname 69           instance void  .ctor() cil managed70   {71     // 代码大小       8 72     .maxstack  873     IL_0000:  ldarg.074     IL_0001:  call       instance void [mscorlib]System.Object::.ctor()75     IL_0006:  nop76     IL_0007:  ret77   } // end of method Program::.ctor78 79 } // end of class ILTest.Program80 81 82 // 

View Code

在那之中富含了前后相继的元数据,程序集项目清单和生龙活虎部分此外财富音讯。

它们描述并组成了这段程序的类型消息,安全音讯,版本新闻以致对其余程序集的引用音信等,使得程序集全体了自笔者描述的特色。个中,元数据是反光得以贯彻的尤为重要标准。

而外还隐含了IL代码,IL是因此编写翻译器编写翻译爆发的中间语言代码。

我们得以经过更正IL代码来支配程序的实行:

开产生成的文件文件,将Main方法中的输出字符串改革为"Hello 汤米":
澳门新萄京官方网站 26

选用ILASM工具将IL文件再一次编写翻译成ILTest2.exe:

澳门新萄京官方网站 27

双击运维exe结果如下:

澳门新萄京官方网站 28

想必你会感觉纳闷,为何要把源代码先翻译成CIL再翻译花费机代码,实际不是一步到位呢??

因为当程序被编译成程序集之后就退出了言语的节制,举个例子C#先后能够调用VB生成的顺序集。

程序集将语言的特殊性转变到了CIL这一通用且职业的定义,好比全国各类地点的人讲着不一致的白话,相互之间难以维系,不过先将方言翻译成CIL那风度翩翩中文,便消灭了言语差距带给的沟通障碍。

除开,假使平素从高端语言编写翻译成机器语言,由于不一样厂家坐蓐的CPU会读取不一致的指令集,假使有x门高档语言,有y种读取分化指令集的CPU,那么必要有x*y种编写翻译器去将区别的言语与CPU指令豆蔻梢头大器晚成相配。

有了CIL之后,大家只需x种编写翻译器将高档语言转形成CIL,再经过y种编写翻译器将CIL调换到二进制指令,风流浪漫共仅必要x y种分裂的编写翻译器。

原创小说,转发请注脚出处。

注:①集体中间语言在一些地方也被叫做MSIL(Microsoft Intermediate Language卡塔尔或IL(Intermediate Language卡塔尔国。本文中的CIL,IL,MSIL指的都以国有中间语言这一概念。

  ②ILASM和ILDASM工具详见:.Net Framework IL汇编与反汇编工具

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:如何使用ILAsm与ILDasm修改,程序集与CIL

关键词: