NET程序的代码混淆、加壳与脱壳
通常我们通过代码混淆、加密的形式达到软件保护的目的。在Web开发里我们接触过的可能就是JS代码加密了,可以通过对JS代码进行混淆、加密从而实现对核心JS代码的保护。如果没有接触过的可以在这里简单了解一下,这次我们就不去细说了。
在以前Win32的软件中,加壳脱壳的技术已经发展的非常成熟,国内有大名鼎鼎的看雪、吾爱破解等论坛,三四年前还在上学时,论坛里的大牛一直都是自己的偶像。
而.NET程序因为编译结果不是机器代码语言,而是IL语言,所以加壳脱壳相关的软件还不是很多,我搜索到了一些,如VS自带的DotFuscator、.NET Reactor、xeoncode等,这次我们就简单介绍下手边有的.NET Reactor 。
1.代码混淆
代码混淆主要通过一些名称替换、移位、流程混淆的方式来实现。
先来看一个测试的DEMO程序,很简单的一个Winform程序,实例化窗体时实例化一个User类,点击按钮显示用户名,这样也可以测试加密、加壳后程序是否能够继续运行。
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程序的代码混淆、加壳与脱壳的更多相关文章
- Android程序增加代码混淆器
增加代码混淆器.主要是增加proguard-project.txt文件的规则进行混淆,之前新建Android程序是proguard.cfg文件 能够看一下我採用的通用规则(proguard-proje ...
- Themida和Winlicense加壳软件脱壳教程
(一)Themida和不用license的Winlicense加壳软件就不说了,直接上脚本脱壳. (二)先看看不同版本OEP的一些小特征: Temida2.1.X.X版本之后的OEP特征(2.0.8. ...
- 【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57e3a3bc42eb88da6d4be143 作者:王赛 1. 前言 Andr ...
- .net破解一(反编译,反混淆-剥壳)
大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以第一件事就是用Reflector编译,但是没有想 ...
- net破解一(反编译,反混淆-剥壳,工具推荐)
net破解一(反编译,反混淆-剥壳,工具推荐) 大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以 ...
- iOS 代码混淆
一般做了防调试的话,被调试进程会退出的,是防动态分析措施. 代码混淆加花这些是防静态分析措施. 反调试是防动态分析措施. 混淆的方法方法名混淆其实就是字符串替换,有2个方法可以,一个是#define, ...
- UPX源码分析——加壳篇
0x00 前言 UPX作为一个跨平台的著名开源压缩壳,随着Android的兴起,许多开发者和公司将其和其变种应用在.so库的加密防护中.虽然针对UPX及其变种的使用和脱壳都有教程可查,但是至少在中文网 ...
- Android Linker 与 SO 加壳技术
1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...
- AndroidLinker与SO加壳技术之上篇
1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...
随机推荐
- Solution -「AGC 010C」「AT 2304」Cleaning
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的无根树,点有点权,每次选择两个不同的叶子,使它们间的简单路径的所有点权 \(-1\),问能否将所有点 ...
- Solution -「UR #2」「UOJ #32」跳蚤公路
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的带权有向图,每条边还有属性 \(s\in\{-1,0,1\}\).对于每个 \(u ...
- kali linux 静态地址和动态地址的设置
在文件系统里找到/etc/network下的interfaces文件,打开后可以看到eth0为dhcp,将其修改为# This file describes the network interface ...
- 把SQLAlchemy查询对象转换成字典
1-假设查出来的为单个对象 1-1 在model.py中为模型对象添加字典转换函数: from exts import db class User(db.Model): __tablename__ = ...
- 带你玩转CompletableFuture异步编程
前言 最近在忙生活的第一个OKR,这个等等后面具体聊聊,今天开始恢复每周一篇原创,感谢小伙伴的不离不弃.这篇文章也是最近在Code Review的时候,看到的大家代码,想整体推下大家异步编程的思想,由 ...
- 【C#】AssemblyLoadContext 加载程序集
使用 .NET Core 3.0 的 AssemblyLoadContext 实现插件热加载 一般情况下,一个 .NET 程序集加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.N ...
- 《Java编程思想》学习笔记(详细)
目录 01 对象导论 02 一切都是对象 03 操作符 04 控制执行流程 05 初始化与清理 06 访问权限控制 07 复用类(继承) 08 多态 09 接口 10 内部类 11 持有对象 12 通 ...
- 导出QQ聊天记录并用python处理
今天和天天弟弟聊天,很有感慨,想把聊天记录保存下来(QQ),教程如下. STEP1 从QQ里导出聊天记录 有两个方法导出:(1)打开聊天窗口中的"聊天记录",右下角是消息管理器, ...
- VUE3 之 使用标签实现动画与过渡效果 - 这个系列的教程通俗易懂,适合新手
1. 概述 巴纳姆效应告诉我们: 人们更容易相信笼统的.常见的人格描述,并觉得特别适合自己,认为该描述真实地反映了自己的人格面貌. 这也是所有算命先生的小把戏,算命先生通常把话说的很笼统,很通用,基本 ...
- k8s-静态PV和动态PV
1.pv 简单介绍 PersistenVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理 PV分为静态和动态,动态能够自动创建PV • PersistentVolumeCl ...