通常我们通过代码混淆、加密的形式达到软件保护的目的。在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
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程序的代码混淆、加壳与脱壳的更多相关文章

  1. Android程序增加代码混淆器

    增加代码混淆器.主要是增加proguard-project.txt文件的规则进行混淆,之前新建Android程序是proguard.cfg文件 能够看一下我採用的通用规则(proguard-proje ...

  2. Themida和Winlicense加壳软件脱壳教程

    (一)Themida和不用license的Winlicense加壳软件就不说了,直接上脚本脱壳. (二)先看看不同版本OEP的一些小特征: Temida2.1.X.X版本之后的OEP特征(2.0.8. ...

  3. 【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57e3a3bc42eb88da6d4be143 作者:王赛 1. 前言 Andr ...

  4. .net破解一(反编译,反混淆-剥壳)

    大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以第一件事就是用Reflector编译,但是没有想 ...

  5. net破解一(反编译,反混淆-剥壳,工具推荐)

    net破解一(反编译,反混淆-剥壳,工具推荐) 大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以 ...

  6. iOS 代码混淆

    一般做了防调试的话,被调试进程会退出的,是防动态分析措施. 代码混淆加花这些是防静态分析措施. 反调试是防动态分析措施. 混淆的方法方法名混淆其实就是字符串替换,有2个方法可以,一个是#define, ...

  7. UPX源码分析——加壳篇

    0x00 前言 UPX作为一个跨平台的著名开源压缩壳,随着Android的兴起,许多开发者和公司将其和其变种应用在.so库的加密防护中.虽然针对UPX及其变种的使用和脱壳都有教程可查,但是至少在中文网 ...

  8. Android Linker 与 SO 加壳技术

    1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...

  9. AndroidLinker与SO加壳技术之上篇

    1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...

随机推荐

  1. 框架4--NFS网络共享

    目录 框架4--NFS网络共享 1.练习 2.昨日问题 3.今日内容 4.NFS简介 5.NFS应用 6.NFS实践 6.1.服务端 6.2.客户端 7.NFS配置详解 8.搭建考试系统 8.1.搭建 ...

  2. 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存

    很久没有更新dapr系列了.今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star 目录:一.通过Dapr实现 ...

  3. Redis 源码简洁剖析 16 - 客户端

    整体概述 客户端属性 套接字描述符 标志 输入缓冲区 命名及命令参数 命令的实现函数 输出缓冲区 客户端的创建与关闭 创建普通客户端 关闭普通客户端 参考链接 Redis 源码简洁剖析系列 整体概述 ...

  4. 解决POI多线程导出时数据错乱问题

    项目里有一个导出功能,但随着数据量大量上涨,导出时间长到不可忍受,遂重写此接口,多线程导出的代码并不复杂,每页有一条线程负责写入,利用线程池去调度,用countdownLatch保证在所有数据写完后再 ...

  5. 添加删除系统右键菜单(就是上下文菜单,也就是Context Menu)中的一些选项

    随着电脑安装的东西越来越多,右侧菜单也原来越长,很不方面.所以打算清理一下 我删除的大约以下几个,友好一点的都可以配置.当然也可以通过注册表直接删除. 特:注册表备份,即导入导出,避免一失足成千古恨. ...

  6. 每日一题:codeforces题解

    题目 B. Peculiar Movie Preferences time limit per test 2 seconds memory limit per test 512 megabytes i ...

  7. NSSCTF-[SWPU 2019]伟大的侦探

    下载附件得到一个压缩包,解压需要密码,但是得到一个"密码.txt"的文件,打开查看 根据菜狗的刷题经验,这是个EBCDIC的编码,打开010编辑器,打开"密码.txt&q ...

  8. k8s被删除的pod一直Terminating状态

    微服务项目,部分服务无法delete,一直处于Terminating状态 kubectl get po -n gift 强制删除product:kubectl delete -n gift po/pr ...

  9. 通过shell脚本批量操作mysql数据库

    创建建表语句 ============================================= 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) ------(学 ...

  10. 列表视图ListView

    依然是一个listView的Java文件 1 public class ListViewActivity extends Activity { 2 private ListView lv1; 3 @O ...