威尼斯人线上娱乐

反编写翻译防患,中文字符串编写翻译后成乱码

6 4月 , 2019  

(2015年十一月七日更新:微软现已修复了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是很平整,同时也很好反编写翻译。

反编写翻译防患措施:

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

前天,大家用VS20壹5编写翻译了博客程序中的多少个主次集并发布上线。

VS中增加IL DASM工具

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

威尼斯人线上娱乐 1

作者们也能够直接wind+奇骏.输入:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe (window 7 陆十四人 操作系统安装目录)
同样能够打开ildasm。
大家也能够把ildasm工具增添到大家常用的VS中。
一.工具(Tools)–>外部工具(External Tools..)

威尼斯人线上娱乐 2

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

威尼斯人线上娱乐 3

已上新闻填写完毕后,在“工具”选拔卡中能找到大家刚扩展的外表工具名称(IL_DASM)。扩展完结后得以小规模试制1把。
国际惯例来段”Hello
World”。代码编写完后直接F六生成exe文件,然后工具–>IL_DASM–>确认(无需修改任何参数,私下认可目的文件路径)。系统会弹出IL工具,大家双击Main方法。

威尼斯人线上娱乐 4

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

VS中增加IL DASM工具

笔者们在装置VS同时都会自行安装ildasm工具,无需重复安装。ildasm工具打开艺术如下图:

威尼斯人线上娱乐 5

作者们也足以直接wind+Odyssey.输入:C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\bin\ildasm.exe (window 7 63位 操作系统安装目录)
同样可以打开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)。扩展完结后得以小规模试制1把。
国际惯例来段”Hello
World”。代码编写完后直接F六生成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属性置之脑后,一样能够反编写翻译源码。

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

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

IL DASM 基础

1.图标含义

威尼斯人线上娱乐 11

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

威尼斯人线上娱乐 12

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

一).class,表示Program是多个类。并且它继续自程序集—mscorlib的System.Object类;
二)private,表示访问权限;
叁)auto,表示程序的内部存款和储蓄器加载全部由CL锐界来支配;
4)ansi,是为了在未曾托管代码与托管代码之间完成无缝转换。那里根本指C、C++代码等;
5)before田野(field)init,是用来标记运转库(CL汉兰达)能够在静态字段方法生成后的即兴时刻,来加载构造器(构造函数);

.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

一)cil managed:表示个中为IL代码,提示编写翻译器编写翻译为托管代码;
二).maxstack:表示调用构造函数.otor时期的评估堆栈(伊娃luation Stack) ;
3)  IL_0000:标记代码行起首;
4)ldarg.0:表示转载第一个分子参数,在实例方法中指的是日前实例的引用;
伍)call:call1般用来调用静态方法,因为静态方法是在编译期就鲜明的。而那里的组织函数.otor()也是在编写翻译期就制定的。而另一指令callvirt则代表调用实例方法,
它是在运维时规定的,因为如前述,当调用方法的再三再四关系时,就要相比较基类与派生类的同名函数的落实格局(virtual和new),以明确调用的函数所属的Method
Table;
6)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:指令表示CLCR-V加载程序时,是率先从.entrypoint伊始的,即从Main方法作为程序的入口函数;
三)nop:为空该指令,重要给外部设备大概指令间隙准备时间;
四)ldstr:创设String对象变量”Hello World.” ;
五)pop:取出栈顶的值。当大家不须求把值存入变量时使用;

IL DASM 基础

1.图标含义

威尼斯人线上娱乐 13

采纳IL反编译出项目代码

威尼斯人线上娱乐 14

MANIFEST:是2个增大消息列表,首要含有程序集的部分性质,如程序集名称、版本号、哈希算法等;
德姆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是3个类。并且它三番五次自程序集—mscorlib的System.Object类;
二)private,表示访问权限;
三)auto,表示程序的内部存款和储蓄器加载全部由CLXC60来决定;
四)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代码,提醒编写翻译器编写翻译为托管代码;
二).maxstack:表示调用构造函数.otor时期的评估堆栈(伊娃luation Stack) ;
3)  IL_0000:标记代码行开首;
四)ldarg.0:表示转发第2个分子参数,在实例方法中指的是当前实例的引用;
五)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

一)
hidebysig:表示当把该类作为基类,存在派生类时,此方法不被再三再四,同上构造函数;
二).entrypoint:指令表示CL奇骏加载程序时,是首先从.entrypoint起头的,即从Main方法作为程序的入口函数;
叁)nop:为空该指令,首要给外部设备大概指令间隙准备时间;
四)ldstr:创立String对象变量”Hello World.” ;
五)pop:取出栈顶的值。当大家不须求把值存入变量时选择;

方法二:混淆

混淆原理:将VS编写翻译出的公文(exe 或
dll)通过ildasm对文件举办重命名,字符串加密,移动等格局将原始代码打乱。那种格局比较普遍。

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

威尼斯人线上娱乐 19

但VS20一三自带Dotfuscator 伍.5 需购买激活才能采纳一切功用。近年来百度提供
DotfuscatorPro 4.九 破解版版本下载。

打开 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

二.文件–>转储。明确后选拔另存路径,会生成三个公文:*.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

二.文书–>转储。鲜明后选用另存路径,会生成一个文件:*.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 ,很不难被壹些反编写翻译工具查看到源码或对源码实行修改。
为预防代码被反编写翻译…

而这一个地方的“上1页”“下1页”字符串恰恰是在我们前几日揭橥的次序集中定义的:

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

    //...
}

可是明日我们并不曾改观那部分代码,肯定不是我们前日代码修改引起的。

威尼斯人线上娱乐 ,于是乎,大家改用VS2011重复编写翻译了弹指间那一个程序集,更新之后,乱码立马消失。

进而,用ILSpy反编写翻译了VS二〇一四所编写翻译出的程序集的IL代码之后,真相大白:

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

原来是VS20一伍所用的编写翻译器惹的祸,而那几个编写翻译器正是红得发紫的 Roslyn

我们利用 Visual Studio 201伍 时须要小心一下这些难点。

【补充】

用ildasm查看VS20一5编写翻译出来的程序集的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-八编码另存该公文,然后用VS二〇一四再一次编写翻译,难题消除。

VS20壹5 LANDC中没这几个题材。

【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地图