软件方法,反编写翻译防备

(201伍年九月2二二十七日革新:微软曾经修复了Roslyn的这几个bug,详见

IL DASM反编写翻译工具

  使用C#的古人或多或少都会对微软的IL反编写翻译工具(ildasm.exe)有所认识。笔者最早接触到那工具是商户同事使用他反编写翻译exe程序,实行研读和修改。感觉她依然很有力。
  IL是微软平台上的壹门中间语言,大家常写的C#代码在编写翻译器中都会自行转换来IL,然后在由即时编写翻译器(JIT
Compiler)转化学工业机械器码,最终被CPU执行。ildasm.exe反编写翻译工具将IL汇编成可跨平台可进行的(pe)文件。可供我们精通别人代码和改动。有了他大家看待难题能够不要停留在编辑器层面,可深远中间层。

IL DASM反编写翻译工具

  使用C#的古人或多或少都会对微软的IL反编写翻译工具(ildasm.exe)有所认识。小编最早接触到那工具是集团同事使用她反编译exe程序,举行研读和改动。感觉他依旧很强劲。
  IL是微软平台上的1门中间语言,我们常写的C#代码在编译器中都会活动转换来IL,然后在由即时编写翻译器(JIT
Compiler)转化学工业机械器码,最终被CPU执行。ildasm.exe反编写翻译工具将IL汇编成可跨平台可举办的(pe)文件。可供大家驾驭旁人代码和修改。有了她大家看待难点得以毫不停留在编辑器层面,可深切中间层。

C# 反编写翻译防备,

C# 编写的代码通过VS编写翻译器生成 dll 或 exe
,很不难被部分反编写翻译工具查看到源码或对源码实行改动。
为防范代码被反编写翻译或被曲解,我们可以展开自然的防备措施。但不能够杜绝,因为DotNet编写代码运转必须编写翻译成IL
中间语言,IL是很平整,同时也很好反编写翻译。

反编译防患措施:

  • 设置项目代码反汇编属性
  • 混淆

昨日,我们用VS二〇一四编写翻译了博客程序中的3个程序集并颁发上线。

VS中增加IL DASM工具

大家在装置VS同时都会自行安装ildasm工具,无需再度安装。ildasm工具打开艺术如下图:

美高梅开户网址 1

小编们也得以间接wind+R.输入:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe (window 七 6二人 操作系统安装目录)
同样能够打开ildasm。
大家也得以把ildasm工具扩充到大家常用的VS中。
壹.工具(Tools)–>外部工具(External Tools..)

美高梅开户网址 2

2.添加内容填写对应消息。命令:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe
(window 7 陆13个人 操作系统安装目录) 。

美高梅开户网址 3

已上音信填写实现后,在“工具”采取卡中能找到大家刚扩张的外表工具名称(IL_DASM)。扩展完毕后得以小规模试制一把。
国际惯例来段”Hello
World”。代码编写完后直接F陆生成exe文件,然后工具–>IL_DASM–>确认(无需修改任何参数,暗许指标文件路径)。系统会弹出IL工具,我们双击Main方法。

美高梅开户网址 4

那会儿能够看出Main方法在IL中编写翻译的代码。感觉微微面生不易看懂。
还有IL编写翻译现身的三角型,正方型都以吗!

VS中增加IL DASM工具

我们在设置VS同时都会自行安装ildasm工具,无需再一次安装。ildasm工具打开艺术如下图:

美高梅开户网址 5

大家也得以间接wind+奥迪Q5.输入:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe (window 七 61位 操作系统安装目录)
同样可以打开ildasm。
大家也足以把ildasm工具增添到大家常用的VS中。
壹.工具(Tools)–>外部工具(External Tools..)

美高梅开户网址 6

贰.添加剧情填写对应信息。命令:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe
(window 柒 6四位 操作系统安装目录) 。

美高梅开户网址 7

已上音信填写达成后,在“工具”接纳卡中能找到大家刚扩展的外表工具名称(IL_DASM)。增添达成后方可小规模试制1把。
国际惯例来段”Hello
World”。代码编写完后一向F6生成exe文件,然后工具–>IL_DASM–>确认(无需修改任何参数,默许指标文件路径)。系统会弹出IL工具,大家双击Main方法。

美高梅开户网址 8

那时能够看出Main方法在IL中编写翻译的代码。感觉有点面生不易看懂。
还有IL编写翻译出现的三角型,正方型都以甚!

情势一:幸免 Ildasm.exe(MSIL 反汇编制程序序) 反汇编制程序序集

主意很简单在项目文件AssemblyInfo.cs中扩大SuppressIldasm属性。

美高梅开户网址 9

当项目中增添SuppressIldasm属性后在应用ildasm.exe反编写翻译代码,会唤起:”受有限支持的模块
— 无法开始展览反汇编”

美高梅开户网址 10

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

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

今日有园友反馈向大家汇报,个人博客分页呈现小说列表的页面中,“上壹页”“下壹页”展现乱码:

IL DASM 基础

软件方法,反编写翻译防备。1.图标含义

美高梅开户网址 11

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

美高梅开户网址 12

MANIFEST:是二个外加音信列表,首要涵盖程序集的壹部分本性,如程序集名称、版本号、哈希算法等;
德姆ocode:项目名称
德姆ocodeing.Common:命名空间
Democodeing.ICar:接口
Democodeing.Program:类,首要查看存类上边包车型客车剧情。

.class 类音讯项代码:

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

1).class,表示Program是1个类。并且它再三再四自程序集—mscorlib的System.Object类;
2)private,表示访问权限;
3)auto,表示程序的内部存款和储蓄器加载全体由CL福睿斯来控制;
四)ansi,是为着在尚未托管代码与托管代码之间完成无缝转换。那里首要指C、C++代码等;
伍)before田野init,是用来标记运维库(CLENVISION)能够在静态字段方法生成后的自由时刻,来加载构造器(构造函数);

.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)cil managed:表示当中为IL代码,提示编写翻译器编译为托管代码;
二).maxstack:表示调用构造函数.otor时期的评估堆栈(伊娃luation Stack) ;
3)  IL_0000:标记代码行起初;
四)ldarg.0:表示转发第1个分子参数,在实例方法中指的是当下实例的引用;
伍)call:call壹般用来调用静态方法,因为静态方法是在编写翻译期就规定的。而那里的布局函数.otor()也是在编写翻译期就制定的。而另一指令callvirt则表示调用实例方法,
它是在运营时规定的,因为如前述,当调用方法的存在延续关系时,就要比较基类与派生类的同名函数的落到实处格局(virtual和new),以明显调用的函数所属的Method
Table;
⑥)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

壹)
hidebysig:表示当把该类作为基类,存在派生类时,此格局不被一连,同上构造函数;
二).entrypoint:指令表示CL奔驰M级加载程序时,是率先从.entrypoint开始的,即从Main方法作为程序的入口函数;
三)nop:为空该指令,重要给外部设备可能指令间隙准备时间;
4)ldstr:成立String对象变量”Hello World.” ;
伍)pop:取出栈顶的值。当我们不须要把值存入变量时行使;

IL DASM 基础

1.图标含义

美高梅开户网址 13

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

美高梅开户网址 14

MANIFEST:是二个附加音信列表,首要涵盖程序集的壹对属性,如程序集名称、版本号、哈希算法等;
德姆ocode:项目名称
德姆ocodeing.Common:命名空间
Democodeing.ICar:接口
德姆ocodeing.Program:类,主要查看存类上面包车型大巴始末。

.class 类消息项代码:

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

一).class,表示Program是1个类。并且它继续自程序集—mscorlib的System.Object类;
二)private,表示访问权限;
三)auto,表示程序的内部存款和储蓄器加载全部由CLR来决定;
四)ansi,是为了在未有托管代码与托管代码之间完结无缝转换。那里关键指C、C++代码等;
五)before田野同志init,是用来标记运营库(CL奥迪Q5)能够在静态字段方法生成后的人身自由时刻,来加载构造器(构造函数);

.ctor 方法代码:

美高梅开户网址 15

.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

美高梅开户网址 16

一)cil managed:表示个中为IL代码,提醒编写翻译器编写翻译为托管代码;
2).maxstack:表示调用构造函数.otor时期的评估堆栈(伊娃luation Stack) ;
3)  IL_0000:标记代码行早先;
四)ldarg.0:表示转发第三个成员参数,在实例方法中指的是当前实例的引用;
5)call:call1般用来调用静态方法,因为静态方法是在编写翻译期就规定的。而那里的构造函数.otor()也是在编写翻译期就制订的。而另一指令callvirt则表示调用实例方法,
它是在运作时规定的,因为如前述,当调用方法的存续关系时,就要比较基类与派生类的同名函数的兑现方式(virtual和new),以鲜明调用的函数所属的Method
Table;
六)ret:表示执行完成,再次回到;

Main() 静态方法代码:

美高梅开户网址 17

.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

美高梅开户网址 18

1)
hidebysig:表示当把该类作为基类,存在派生类时,此措施不被持续,同上构造函数;
2).entrypoint:指令表示CLLX570加载程序时,是第3从.entrypoint早先的,即从Main方法作为程序的入口函数;
3)nop:为空该指令,重要给外部设备或许指令间隙准备时间;
四)ldstr:创设String对象变量”Hello World.” ;
5)pop:取出栈顶的值。当大家不须要把值存入变量时使用;

方法二:混淆

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

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

美高梅开户网址 19

但VS2013自带Dotfuscator 五.伍 需购买激活才能使用壹切职能。方今百度提供
DotfuscatorPro 四.9 破解版版本下载。

打开 DotfuscatorPro 4.9 主界面

美高梅开户网址 20

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

美高梅开户网址 21

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

美高梅开户网址 22

Rename 重命名配置
常用功用布局: 勾选 = use enhanced overload induction 使用增强方式
重命名方案 Renaming Scheme = Unprintable
(不可打字与印刷字符,即乱码),也足以选拔任何如小写字母、大写字符、数字的法子。

美高梅开户网址 23

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

美高梅开户网址 24

可依照各自供给可开始展览任何连锁布署。(如:control flow,Output,Setting
->Build Settings,Settings –> Project Properties等)
说起底生成混淆文件 Build Project。

美高梅开户网址 25

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版本区别对应目录会有所变更]

美高梅开户网址 26

美高梅开户网址 27

行使IL DASM 修改EXE程序代码

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

美高梅开户网址 28

二.文书–>转储。明确后采用另存路径,会生成一个文件:*.il 和 *.res

美高梅开户网址 29

三.用记事本打开*.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

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

ilasm /exe /output=C:\CK.exe /Resource=C:\Users\Ck\Desktop\coding.res C:\Users\Ck\Desktop\coding.il

美高梅开户网址 30

修改就那样不难。运营修改后的EXE程序,值已修改。

美高梅开户网址 31

 

选取IL DASM 修改EXE程序代码

一.开拓IL工具,选拔所要修改的EXE程序。

美高梅开户网址 32

贰.文本–>转储。分明后采取另存路径,会转变三个文件:*.il 和 *.res

美高梅开户网址 33

三.用记事本打开*.il修改里面包车型地铁剧情:

美高梅开户网址 34

 .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

美高梅开户网址 35

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

ilasm /exe /output=C:\CK.exe /Resource=C:\Users\Ck\Desktop\coding.res C:\Users\Ck\Desktop\coding.il

美高梅开户网址 36

修改就那样简单。运转修改后的EXE程序,值已修改。

美高梅开户网址 37

混淆代码比较

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

美高梅开户网址 38

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

美高梅开户网址 39

意义很举世瞩目,极丑出反编写翻译代码所写的确实逻辑。

缺点:
C#代码通过混淆工具生成后,扩充了众多转换进度。那使得反编写翻译工具不恐怕很直观察到源码真正逻辑。但源码代码过多变换会使软件本人运行作效果用下跌,甚至会并发报错境况。

反编写翻译防患, C# 编写的代码通过VS编写翻译器生成
dll 或 exe ,很简单被部分反编译工具查看到源码或对源码实行改动。
为严防代码被反编写翻译…

而以此地方的“上一页”“下一页”字符串恰恰是在大家今天公布的次序集中定义的:

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

    //...
}

美高梅开户网址,而是前些天大家并不曾变动那部分代码,肯定不是大家前些天代码修改引起的。

于是,大家改用VS20一三再一次编写翻译了弹指间这几个程序集,更新之后,乱码立马消失。

继之,用ILSpy反编写翻译了VS20一⑤所编写翻译出的程序集的IL代码之后,真相大白:

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

原来是VS二零一五所用的编写翻译器惹的祸,而这些编译器正是资深的 Roslyn

大家利用 Visual Studio 20壹伍 时需求小心一下那些标题。

【补充】

用ildasm查看VS2015编写翻译出来的次第集的IL代码(乱码):

.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查看VS201三编写翻译出来的主次集的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编码另存该公文,然后用VS20一五重复编写翻译,难点化解。

VS20一伍 KoleosC中没那一个题材。

【GitHub上的相关链接】

*
VS20一伍打开非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

发表评论

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

网站地图xml地图