通常我们通过代码混淆、加密的形式达到软件保护的目的。在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函数进行一系列的解压、解密动作后将代码加载到内存中运行原始的程序,这样就实现了对程序的保护功能。

脱壳就是对程序进行解压缩、解密,将外面的一层壳脱去后,继续进行逆向工程进行破解

而关于脱壳,本人也是略知皮毛,不敢胡乱卖弄,感兴趣的可以去论坛里学习相关知识。

这里介绍的混淆、加壳的方法也只是为了在需要对自己的程序进行保护时的一种方法。

最新文章

  1. SQL Server 2008 R2的发布订阅配置实践
  2. win10 64位安装memcache扩展和开启redis扩展
  3. 初识Polymer框架
  4. DICOM医学图形处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求(续)
  5. [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现
  6. 动态规划——J 括号配对问题
  7. No1_6.字符串的基本操作2_Java学习笔记
  8. 设置QPushButton的平面与突出(遍历控件)
  9. Unity3D常用 API 之实例化与销毁
  10. java.lang.IllegalStateException: attempt to re-open an already-closed object
  11. 物理服务器Linux下软RAID和UUID方式挂载方法--Megacli64
  12. mybatis整合hikariCP(非spring)
  13. SPI Flash(W25Q16DV) 驱动
  14. Ubuntu中针对问题 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)的解决方案
  15. ios中滚动页面
  16. Nexus 7更换NFC控制器,导致不再支持读取Mifare Classic NFC 1k Tags
  17. Python资料收藏(杂乱版)
  18. Node.js静态文件服务器实战[转]
  19. C# webbrowser实现百度知道团队邀请助手!
  20. 【原】使用Maven完成自动化打包并部署到Linux服务器下(Tomcat7)

热门文章

  1. 02 HTML标签
  2. Solution -「CF 1023F」Mobile Phone Network
  3. mysql对属性的增删改
  4. figlet 一个在linux生成字符串图案的玩具
  5. 主机磁盘使用率超过85%导致es索引变为只读模式
  6. 定制Centos7.9镜像
  7. 案例八:shell自动化管理账本脚本
  8. 使用ODBC连接MySQL和EXCEL
  9. 路径修改后cmd命令行窗口仍然没有变化的原因
  10. 矩池云上如何快速安装nvcc