反编译防范,基础之运行环境
分类:高并发

MSIL

这是我的第一篇博文,目前这一阶段我的目标是先把C#掌握好,C#是一门语言,是基于C风格语言(C、C++和Java)的特性而设计的。所以在我的博客里,我会记录下我的学习笔记,这不仅仅是笔记,还是所学过的知识汇总,希望对C#有一个较为全面的总结,以便日后的查阅更加方便。

C# 反编译防范,

C# 编写的代码通过VS编译器生成 dll 或 exe ,很容易被一些反编译工具查看到源码或对源码进行修改。
为防止代码被反编译或被篡改,我们可以进行一定的防范措施。但不能杜绝,因为DotNet编写代码运行必须编译成IL 中间语言,IL是很规则,同时也很好反编译。

反编译防范措施:

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

将 .NET 的程序编译后,生成的代码实际上与 VC++ 之类的目标程序是不一样的,.NET 编译后生成 MSIL(Microsoft Intermediate Language),属于中间语言,就像 Java 一样,之所以这样设计,大概是为了跨平台的考虑(当然还有其它一些原因)。

 

方法一:防止 Ildasm.exe(MSIL 反汇编程序) 反汇编程序集

方法很简单在项目文件AssemblyInfo.cs中增加SuppressIldasm属性。

图片 1

当项目中增加SuppressIldasm属性后在使用ildasm.exe反编译代码,会提示:"受保护的模块 -- 无法进行反汇编"

图片 2

ildasm.exe 读取项目中包含 SuppressIldasm 属性就不对此程序集进行反编译。但ILSyp,Reflector等反编译工具针对程序集设置SuppressIldasm属性置之不理,一样可以反编译源码。

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

反汇编

本文主要介绍C#的运行环境,包括C#的执行过程、CLI、“运行时”等内容。

方法二:混淆

混淆原理:将VS编译出的文件(exe 或 dll)通过ildasm对文件进行重命名,字符串加密,移动等方式将原始代码打乱。这种方式比较常见。

VS2013 自带混淆工具:工具-->PreEmptive Dotfuscator and Analytics

图片 3

但VS2013自带Dotfuscator 5.5 需购买激活才能使用全部功能。目前百度提供 DotfuscatorPro 4.9 破解版版本下载。

打开 DotfuscatorPro 4.9 主界面

图片 4

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

图片 5

选择需混淆C#编译代码(dll 或 exe)
其中Library不要勾选,否则有些类、变量等等不会混淆;

图片 6

Rename 重命名配置
常用功能配置: 勾选 = use enhanced overload induction 使用增强模式
重命名方案 Renaming Scheme = Unprintable (不可打印字符,即乱码),也可以选择其他如小写字母、大写字符、数字的方式。

图片 7

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

图片 8

可根据各自需求可进行其他相关配置。(如:control flow,Output,Setting ->Build Settings,Settings --> Project Properties等)
最后生成混淆文件 Build Project。

图片 9

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:WindowsMicrosoft.NETFrameworkv4.0.30319ilasm.exe
ILDASM_v4.0.30319 = C:Program Files (x86)Microsoft SDKsWindowsv8.1AbinNETFX 4.5.1 Toolsildasm.exe [安装VS版本不同对应目录会有所变化]

图片 10

.NET Framework SDK 提供的名为 ILDASM 的反汇编实用工具,允许您将 .NET Framework 程序集反编译为 IL 程序集语言语句。为了启动 ILDASM,您必须确保已安装了 .NET Framework SDK。


混淆代码对比

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

图片 11

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

图片 12

效果很明显,很难看出反编译代码所写的真正逻辑。

缺点:
C#代码通过混淆工具生成后,增加了很多转换过程。这使得反编译工具无法很直观看到源码真正逻辑。但源码代码过多转换会使软件本身运行效率降低,甚至会出现报错情况。

反编译防范, C# 编写的代码通过VS编译器生成 dll 或 exe ,很容易被一些反编译工具查看到源码或对源码进行修改。 为防止代码被反编译...

反编译

 

MSIL 是可以被反编译的,也就是说可以把它变成源代码。当然这种源代码与编译之前的源代码还是不完全一样的,但是你仍然可以阅读它,更改它。类似的工具有:Anakrino 和 Reflector for .NET。

 

对抗反编译

一、C#的执行过程

1、第一步,得到C#源代码文件

一般是.cs作为后缀(其实C#编译器允许为C#源代码文件使用任何文件扩展名)。

2、第二步,由C#编译器进行编译,得到程序集(assembly);

程序集有两种形式:一种是可执行文件.exe;另一种是类库文件.dll(Dynamic Link Library,DLL,动态链接库)。

程序集采用的是另一种语言,即公共中间语言(Common Intermediate Language,CIL),或简称为中间语言(IL),第三种说法是Microsoft IL(MSIL)。

3、第三步,再进行一次编译,CIL被转换为处理器能够理解的机器码(machine code);

由“运行时”内部的一个组件来执行从CIL到机器码的编译,这个组件称为即时编译器(just-in-time compiler,即JIT),这个过程称为即时编译或JIT编译(just-in-time compilation) 。

通常在执行时发生,也有可能在程序安装时发生。

4、第四步,代码要想执行,仅仅转换为机器码是不够的,C#程序还需要在一个代理的上下文中执行,负责管理C#程序执行的代理就是VES(Virtual Execution System,虚拟执行系统);

VES也被叫做“运行时”(runtime)(“程序执行的时候”用执行时来表示)。

CLR(公共语言运行时)正在逐渐称为运行时的一个常用代名词,这个术语更像是微软专门针对.NET平台实现的“运行时”。

“运行时”负责管理C#程序的执行,负责加载和运行程序,并在程序执行时提供额外的服务(这些服务不需要开发人员显示地编码)。

假如代码在像“运行时”这样的一个“代理”的上下文中执行,就将这些代码称为托管代码(managed code),执行过程中不需要“运行时”的代码称为本机代码(native code)或者非托管代码(unmanaged code)。

C#的底层平台是“运行时”(VES)。

 

5、反汇编

给定一个程序集(DLL文件或可执行文件),可以使用CIL反汇编程序将其析构成对应的CIL表示,从而查看其CIL代码。通常使用微软特有的文件名ILDASM来称呼这种CIL反汇编程序(ILDASM是IL Disassembler的简称),它能对程序或者它的类库执行反汇编,显示由C#编译器生成的CIL代码。

事实上,一些免费工具可以将CIL自动反编译成C#,比如Red Gate Reflector、ILSpy、JustDecompile、docPeek、CodeReflect等。

无论是否基于CLI,任何程序防止反编译唯一安全的方法就是禁止访问编译好的程序(例如,只在网站上存放程序,而不把它分发到用户机器上)。但假如目的只是减小别人获得源代码的可能性,可以考虑使用一些混淆器(obfuscator)产品。这些混淆器会打开IL代码,将代码加密成一种功能不变但更难于理解的形式。这可以防止普通开发者访问代码,使程序集难以被反编译成容易理解的代码。除非程序需要对算法进行高级安全防护,否则混淆器足矣。

 

最常用的对抗反编译的方法是模糊处理,即使用混淆器,使反编译之后的程序人很难理解,比如变量名尽是:a1、a2、a3……人看到头都大,要看懂程序,得花点功夫。很著名的混淆器有:Dotfuscator。

二、CLI(Common Language Infrastructure,公共语言基础结构)

还有一种是使用本地编译。它使编译输出与正常的 .NET 编译输出不同,有不同的工具,在运行时可能也需要这些工具辅助才能运行。

1、简介

CLI是在运行时管理C#程序的执行引擎。

CLI没有规定标注具体如何实现,但它描述了一个CLI平台在符合标准的前提下应该具有什么行为。

CLI标准包括以下更详细的规范:

①虚拟执行系统(VES,即常说的“运行时”);

②公共中间语言(Common Intermediate Language,CIL);支持多种语言;

③公共类型系统(Common Type System,CTS);为语言互操作性提供支持的类型系统;

④公共语言规范(Common Language Specification,CLS),包含如何编写能通过CLI兼容语言访问的库的指导原则;

⑤元数据(Metadata);

⑥公共编程框架(Framework);

⑦基类库(Base Class Library,BCL);

 

2、CLI实现

目前有7种主流的CLI实现(4种来自微软),各自都实现了一个C#编译器。

①Microsoft Visual C# .NET Compiler:业内最主要的编译器,但只能在Windows操作系统上运行,它作为Microsoft .NET Framework SDK的一部分免费提供给用户下载和使用;

②Microsoft Silverlight:这是CLI的一个跨平台实现,能同时在Windows和Macintosh操作系统上运行;

③Microsoft Compact Framework:.NET Framework的一个精简,设计成在PAD和手机上运行;

④Microsoft XNA:游戏开发人员使用的CLI实现,面向的是XBOX和Windows Vista;

⑤Mono Project:开源的CLI实现,提供了CLI规范及C#编译器的Windows、Linux、UNIX兼容版本;

⑥DotGNU:侧重于创建平台可移植应用程序,使其能够同时在CLI的.NET和DotGNU.Portable.NET实现下运行;

⑦Rotor:也称为Shared Source CLI,是微软开发出来在Windows、Mac OS、FreeBSD上运行的一个CLI实现;

注意每个CLI和C#编译器实现和规范相符的程度是不一的。

 

3、“运行时”提供的服务

如果是一个CLI实现的上下文中运行,程序员不需是要直接写代码,“运行时”和托管执行提供了大量服务和功能

①垃圾回收:根据程序的需要自动分配和回收内存的过程。

对于没有自动系统来做这件事的语言来说,这是一个严重的编程问题。如果不亲自回收已经分配出去的内存,就会造成内存泄漏。

.NET平台实现的垃圾回收机制使用一个分代的(generational)、支持压缩的(compacting)以及基于mark-and-sweep(标记并清除)的算法。

②类型安全:检查类型之间的转换,;

通过类型检查,“运行时”防止了程序员不慎引入可能造成缓冲区溢出安全漏洞的非法类型转换。此类安全漏洞是最常见的计算机入侵方式之一。

③代码访问安全性(Code Access Security,CAS):根据权限来允许或禁止特定类型的操作。;

④平台可移植性:理论上允许C#代码和最终的程序具有平台可移植性;

⑤语言互操作性;

⑥BCL;

本文由10bet手机官网发布于高并发,转载请注明出处:反编译防范,基础之运行环境

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文