.NET程序的代码混淆、加壳与脱壳
2013-05-30 16:20
344 查看
通常我们通过代码混淆、加密的形式达到软件保护的目的。在Web开发里我们接触过的可能就是JS代码加密了,可以通过对JS代码进行混淆、加密从而实现对核心JS代码的保护。如果没有接触过的可以在这里简单了解一下,这次我们就不去细说了。
在以前Win32的软件中,加壳脱壳的技术已经发展的非常成熟,国内有大名鼎鼎的看雪、吾爱破解等论坛,三四年前还在上学时,论坛里的大牛一直都是自己的偶像。
而.NET程序因为编译结果不是机器代码语言,而是IL语言,所以加壳脱壳相关的软件还不是很多,我搜索到了一些,如VS自带的DotFuscator、.NET Reactor、xeoncode等,这次我们就简单介绍下手边有的.NET Reactor。
先来看一个测试的DEMO程序,很简单的一个Winform程序,实例化窗体时实例化一个User类,点击按钮显示用户名,这样也可以测试加密、加壳后程序是否能够继续运行。
1 using System;
2 using System.Windows.Forms;
3
4 namespace CodeObfuscator
5 {
6 public
partial class Form1 : Form
7 {
8 private
readonly User _currentUser;
9 public Form1()
10 {
11 InitializeComponent();
12 _currentUser =
new User
13 {
14 UserID =
1,
15 UserName =
"Parry@cnblogs"
16 };
17 }
18
19 private
void ButtonAlertClick(object sender, EventArgs e)
20 {
21 MessageBox.Show(_currentUser.UserName);
22 }
23 }
24
25 public
class User
26 {
27 public
int UserID { get;
set; }
28 public
string UserName { get;
set; }
29 }
30 }
我们使用最常用的反编译工具Reflector对生成的exe反编译查看源码。
下面我们打开.NET Reactor进行代码混淆,载入exe后,在一般设置里可以设置压缩选项,不过设置后程序初始化速度会变慢,是因为需要将代码解压缩后再加载到内存中。
在混淆选项里将Enable设置为启用,混淆公共类型,字符串加密等常用的也设置成启用。其他的选项Tips里都有详细的解释,就不一一讲解。
当我们再使用Reflector反编译查看时,发现没有看到混淆后的代码,而是看到了这个结果。
猜想应该是.NET Reactor程序对exe进行处理后打了个包,我们使用查壳工具查看后发现果然是这样,外面套了一层Delphi的东西,这个还不是壳,只是一些额外数据。
关于Overlay相关内容可以查看这里。
我们使用北斗加壳程序对上面的exe加壳后,再来反编译看一看。
反编译后我们已经找不到之前程序任何相关名称、代码,完全被一个“壳子”包裹了起来,在程序运行时,程序将先运行我们反编译看到的main函数进行一系列的解压、解密动作后将代码加载到内存中运行原始的程序,这样就实现了对程序的保护功能。
脱壳就是对程序进行解压缩、解密,将外面的一层壳脱去后,继续进行逆向工程进行破解。
而关于脱壳,本人也是略知皮毛,不敢胡乱卖弄,感兴趣的可以去论坛里学习相关知识。
这里介绍的混淆、加壳的方法也只是为了在需要对自己的程序进行保护时的一种方法。
在以前Win32的软件中,加壳脱壳的技术已经发展的非常成熟,国内有大名鼎鼎的看雪、吾爱破解等论坛,三四年前还在上学时,论坛里的大牛一直都是自己的偶像。
而.NET程序因为编译结果不是机器代码语言,而是IL语言,所以加壳脱壳相关的软件还不是很多,我搜索到了一些,如VS自带的DotFuscator、.NET Reactor、xeoncode等,这次我们就简单介绍下手边有的.NET Reactor。
1.代码混淆
代码混淆主要通过一些名称替换、移位、流程混淆的方式来实现。先来看一个测试的DEMO程序,很简单的一个Winform程序,实例化窗体时实例化一个User类,点击按钮显示用户名,这样也可以测试加密、加壳后程序是否能够继续运行。
1 using System;
2 using System.Windows.Forms;
3
4 namespace CodeObfuscator
5 {
6 public
partial class Form1 : Form
7 {
8 private
readonly User _currentUser;
9 public Form1()
10 {
11 InitializeComponent();
12 _currentUser =
new User
13 {
14 UserID =
1,
15 UserName =
"Parry@cnblogs"
16 };
17 }
18
19 private
void ButtonAlertClick(object sender, EventArgs e)
20 {
21 MessageBox.Show(_currentUser.UserName);
22 }
23 }
24
25 public
class User
26 {
27 public
int UserID { get;
set; }
28 public
string UserName { get;
set; }
29 }
30 }
我们使用最常用的反编译工具Reflector对生成的exe反编译查看源码。
下面我们打开.NET Reactor进行代码混淆,载入exe后,在一般设置里可以设置压缩选项,不过设置后程序初始化速度会变慢,是因为需要将代码解压缩后再加载到内存中。
在混淆选项里将Enable设置为启用,混淆公共类型,字符串加密等常用的也设置成启用。其他的选项Tips里都有详细的解释,就不一一讲解。
当我们再使用Reflector反编译查看时,发现没有看到混淆后的代码,而是看到了这个结果。
猜想应该是.NET Reactor程序对exe进行处理后打了个包,我们使用查壳工具查看后发现果然是这样,外面套了一层Delphi的东西,这个还不是壳,只是一些额外数据。
关于Overlay相关内容可以查看这里。
2.加壳与脱壳
加壳实际上就是一种加密方式,被加壳的程序在运行前要先运行一段附加指令,这段附加的指令完成相关操作后会启动主程序,程序就像被包在一个壳里一样,加壳的技术在病毒编写的时候也被大量使用。我们使用北斗加壳程序对上面的exe加壳后,再来反编译看一看。
反编译后我们已经找不到之前程序任何相关名称、代码,完全被一个“壳子”包裹了起来,在程序运行时,程序将先运行我们反编译看到的main函数进行一系列的解压、解密动作后将代码加载到内存中运行原始的程序,这样就实现了对程序的保护功能。
脱壳就是对程序进行解压缩、解密,将外面的一层壳脱去后,继续进行逆向工程进行破解。
而关于脱壳,本人也是略知皮毛,不敢胡乱卖弄,感兴趣的可以去论坛里学习相关知识。
这里介绍的混淆、加壳的方法也只是为了在需要对自己的程序进行保护时的一种方法。
相关文章推荐
- .NET程序的代码混淆、加壳与脱壳
- .NET程序的代码混淆、加壳与脱壳
- .NET程序的代码混淆、加壳与脱壳
- .NET程序的代码混淆、加壳与脱壳
- NET程序的代码混淆、加壳与脱壳
- 为使用Sixxpack加壳的.net程序脱壳
- .net反混淆脱壳工具de4dot的使用
- .NET核心代码保护策略-隐藏核心程序集
- .Net强名称验证带本机代码混编译程序调试一例--强名去见鬼
- 在.NET下编写中文代码程序
- .NET DLL 保护措施详解(非混淆加密加壳)
- 使用.NET JustDecompile来反编译你的程序代码
- 使用Dotfuscator加密混淆程序以及如何脱壳反编译
- 字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串
- .NET程序加壳 — 之动态加载程序集
- 老歌新唱--使用VB6开发的ActiveX实现.NET程序的混淆加密
- [对android程序作代码混淆]
- .net重启iis线程池和iis站点程序代码【转】
- 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串
- 代码混淆/程序保护(对抗反汇编)原理与实践