.NET程序的代码混淆、加壳与脱壳
通常我们通过代码混淆、加密的形式达到软件保护的⽬的。在Web开发⾥我们接触过的可能就是JS代码加密了,可以通过对JS代码进⾏混淆、加密从⽽实现对核⼼JS代码的保护。如果没有接触过的可以在简单了解⼀下,这次我们就不去细说了。
在以前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
js代码加密软件
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函数进⾏⼀系列的解压、解密动作后将代码加载到内存中运⾏原始的程序,这样就实现了对程序的保护功能。
脱壳就是对程序进⾏解压缩、解密,将外⾯的⼀层壳脱去后,继续进⾏逆向⼯程进⾏破解。⽽关于脱
壳,本⼈也是略知⽪⽑,不敢胡乱卖弄,感兴趣的可以去论坛⾥学习相关知识。这⾥介绍的混淆、加壳的⽅法也只是为了在需要对⾃⼰的程序进⾏保护时的⼀种⽅法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。