华语字符串编写翻译后成乱码,反编写翻译防患

(20一伍年八月30日更新:微软现已修复了Roslyn的这些bug,详见

IL DASM反编写翻译工具

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

IL DASM反编写翻译工具

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

C# 反编译防患,

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

反编写翻译防备措施:

  • 安装项目代码反汇编属性
  • 混淆

明天,我们用VS2015编写翻译了博客程序中的三个顺序集并颁发上线。

华语字符串编写翻译后成乱码,反编写翻译防患。VS中增加IL DASM工具

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

亚洲必赢官网 1

大家也能够从来wind+奥迪Q三.输入:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe (window 7 陆15人 操作系统安装目录)
同样能够打开ildasm。
作者们也得以把ildasm工具扩展到咱们常用的VS中。
一.工具(Tools)–>外部工具(External Tools..)

亚洲必赢官网 2

2.添加剧情填写对应音讯。命令:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe
(window 7 陆16位 操作系统安装目录) 。

亚洲必赢官网 3

已上信息填写实现后,在“工具”选拔卡中能找到大家刚扩充的外部工具名称(IL_DASM)。扩张完结后方可小规模试制一把。
国际惯例来段”Hello
World”。代码编写完后直接F6生成exe文件,然后工具–>IL_DASM–>确认(无需修改任何参数,私下认可指标文件路径)。系统会弹出IL工具,大家双击Main方法。

亚洲必赢官网 4

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

VS中增加IL DASM工具

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

亚洲必赢官网 5

大家也能够一贯wind+普拉多.输入:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe (window 七 陆16个人 操作系统安装目录)
同样可以打开ildasm。
咱俩也得以把ildasm工具扩展到大家常用的VS中。
①.工具(Tools)–>外部工具(External Tools..)

亚洲必赢官网 6

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

亚洲必赢官网 7

已上音信填写完毕后,在“工具”选取卡中能找到大家刚增添的外部工具名称(IL_DASM)。扩大完结后方可小规模试制一把。
国际惯例来段”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限制》

今天有园友反馈向咱们汇报,个人博客分页显示小说列表的页面中,“上一页”“下1页”展现乱码:

IL DASM 基础

1.图标含义

亚洲必赢官网 11

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

亚洲必赢官网 12

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

1).class,表示Program是三个类。并且它一而再自程序集—mscorlib的System.Object类;
二)private,表示访问权限;
3)auto,表示程序的内部存款和储蓄器加载全部由CLRAV4来决定;
4)ansi,是为了在未曾托管代码与托管代码之间完毕无缝转换。那里根本指C、C++代码等;
⑤)before田野先生init,是用来标记运转库(CL奥迪Q5)能够在静态字段方法生成后的轻易时刻,来加载构造器(构造函数);

.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代码,提示编写翻译器编写翻译为托管代码;
2).maxstack:表示调用构造函数.otor时期的评估堆栈(伊娃luation Stack) ;
3)  IL_0000:标记代码行开头;
四)ldarg.0:表示转发第3个分子参数,在实例方法中指的是最近实例的引用;
5)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

1)
hidebysig:表示当把该类作为基类,存在派生类时,此办法不被连续,同上构造函数;
二).entrypoint:指令表示CLBMWX伍加载程序时,是第3从.entrypoint伊始的,即从Main方法作为程序的入口函数;
三)nop:为空该指令,主要给外部设备只怕指令间隙准备时间;
四)ldstr:创制String对象变量”Hello World.” ;
五)pop:取出栈顶的值。当大家不需求把值存入变量时行使;

IL DASM 基础

1.图标含义

亚洲必赢官网 13

接纳IL反编写翻译出项目代码

亚洲必赢官网 14

亚洲必赢官网 ,MANIFEST:是三个叠加消息列表,首要含有程序集的1些质量,如程序集名称、版本号、哈希算法等;
德姆ocode:项目名称
Democodeing.Common:命名空间
Democodeing.ICar:接口
德姆ocodeing.Program:类,首要查看存类上面包车型大巴内容。

.class 类音讯项代码:

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

壹).class,表示Program是一个类。并且它接二连三自程序集—mscorlib的System.Object类;
2)private,表示访问权限;
三)auto,表示程序的内部存款和储蓄器加载全体由CL昂科威来决定;
四)ansi,是为了在未曾托管代码与托管代码之间实现无缝转换。那里根本指C、C++代码等;
5)before田野先生init,是用来标记运转库(CLSportage)能够在静态字段方法生成后的四意时刻,来加载构造器(构造函数);

.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代码,提醒编写翻译器编写翻译为托管代码;
二).maxstack:表示调用构造函数.otor时期的评估堆栈(伊娃luation Stack) ;
3)  IL_0000:标记代码行起首;
肆)ldarg.0:表示转发第1个分子参数,在实例方法中指的是日前实例的引用;
5)call:call壹般用于调用静态方法,因为静态方法是在编写翻译期就分明的。而那边的布局函数.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

一)
hidebysig:表示当把该类作为基类,存在派生类时,此措施不被接续,同上构造函数;
二).entrypoint:指令表示CL哈弗加载程序时,是首先从.entrypoint初始的,即从Main方法作为程序的入口函数;
三)nop:为空该指令,首要给外部设备或然指令间隙准备时间;
四)ldstr:创设String对象变量”Hello World.” ;
伍)pop:取出栈顶的值。当大家不须求把值存入变量时行使;

方法二:混淆

漏洞非凡多原理:将VS编写翻译出的文件(exe 或
dll)通过ildasm对文本进行重命名,字符串加密,移动等艺术将原始代码打乱。这种艺术比较常见。

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

亚洲必赢官网 19

但VS20壹三自带Dotfuscator 伍.伍 需买卖激活才能应用成套效率。近日百度提供
DotfuscatorPro 四.九 破解版版本下载。

打开 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程序代码

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

亚洲必赢官网 28

二.文书–>转储。明确后选拔另存路径,会转变1个文件:*.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程序代码

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

亚洲必赢官网 32

2.文书–>转储。明确后接纳另存路径,会生成3个公文:*.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

4.把修改后的代码编写翻译成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 ,很不难被1些反编写翻译工具查看到源码或对源码进行改动。
为防备代码被反编写翻译…

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

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

    //...
}

不过前些天咱们并未更改那有的代码,肯定不是我们前些天代码修改引起的。

于是,大家改用VS20一3重复编译了一下以此程序集,更新之后,乱码立马消失。

接着,用ILSpy反编写翻译了VS20一伍所编写翻译出的顺序集的IL代码之后,真相大白:

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

原本是VS20一伍所用的编写翻译器惹的祸,而以此编写翻译器就是红得发紫的 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查看VS20壹3编写翻译出来的主次集的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-八编码另存该公文,然后用VS201五双重编写翻译,难题消除。

VS201伍 牧马人C中没这一个难题。

【GitHub上的连锁链接】

*
VS20一5开辟非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地图