NET程序的代码混淆、加壳与脱壳讲述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通常我们通过代码混淆、加密的形式达到软件保护的目的。

在Web开发里我们接触过的可能就是JS代码加密了,可以通过对JS代码进行混淆、加密从而实现对核心JS代码的保护。

如果没有接触过的可以在这里简单了解一下,这次我们就不去细说了。

在以前Win32的软件中,加壳脱壳的技术已经发展的非常成熟,国内有大名鼎鼎的看雪、吾爱破解等论坛,三四年前还在上学时,论坛里的大牛一直都是自己的偶像。

而.NET程序因为编译结果不是机器代码语言,而是IL语言,所以加壳脱壳相关的软件还不是很多,我搜索到了一些,如VS自带的DotFuscator、.NET Reactor、xeoncode等,这次我们就简单介绍下手边有的.NET Reactor 。

1.代码混淆
代码混淆主要通过一些名称替换、移位、流程混淆的方式来实现。

先来看一个测试的DEMO程序,很简单的一个Winform程序,实例化窗体时实例化一个User 类,点击按钮显示用户名,这样也可以测试加密、加壳后程序是否能够继续运行。

1using System;
2using System.Windows.Forms;
3
4namespace CodeObfuscator
5 {
6public partial class Form1 : Form
7 {
8private readonly User _currentUser;
9public Form1()
10 {
11 InitializeComponent();
12 _currentUser = new User
13 {
14 UserID = 1,
15 UserName = "Parry@cnblogs"
16 };
17 }
18
19private void ButtonAlertClick(object sender, EventArgs e)
20 {
21 MessageBox.Show(_erName);
22 }
23 }
24
25public class User
26 {
27public int UserID { get; set; }
28public string UserName { get; set; }
29 }
30 }
我们使用最常用的反编译工具Reflector对生成的exe反编译查看源码。

下面我们打开.NET Reactor进行代码混淆,载入exe后,在一般设置里可以设置压缩选项,不过设置后程序初始化速度会变慢,是因为需要将代码解压缩后再加载到内存中。

在混淆选项里将Enable设置为启用,混淆公共类型,字符串加密等常用的也设置成启用。

其他的选项Tips里都有详细的解释,就不一一讲解。

当我们再使用Reflector反编译查看时,发现没有看到混淆后的代码,而是看到了这个结果。

猜想应该是.NET Reactor程序对exe进行处理后打了个包,我们使用查壳工具查看后发现果然是这样,外面套了一层Delphi的东西,这个还不是壳,只是一些额外数据。

关于Overlay相关内容可以查看这里。

2.加壳与脱壳
加壳实际上就是一种加密方式,被加壳的程序在运行前要先运行一段附加指令,这段附加的指令完成相关操作后会启动主程序,程序就像被包在一个壳里一样,加壳的技术在病毒编写的时候也被大量使用。

我们使用北斗加壳程序对上面的exe加壳后,再来反编译看一看。

反编译后我们已经找不到之前程序任何相关名称、代码,完全被一个“壳子”包裹了起来,在程序运行时,程序将先运行我们反编译看到的main函数进行一系列的解压、解密动作后将代码加载到内存中运行原始的程序,这样就实现了对程序的保护功能。

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

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

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

觉得文章还行的话就推荐下吧,哈哈。

作者:Parry
出处:/parry/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

分类: 03.Sugars,
标签: .NET, 安全
绿色通道:好文要顶关注我收藏该文与我联系
Parry
关注- 16
粉丝- 171
荣誉:推荐博客
+加关注
18
(请您对文章做出评价)
«上一篇: Web API(二):安全验证之使用HTTP基本认证
»下一篇:小心DataContractJ sonSerializer和JavaScriptSerializer的内部实现差异
posted @ 2012-11-14 17:18 Parry阅读(8765) 评论(25) 编辑收藏评论
#1楼 2012-11-14 17:31 | Quella
如果混淆,那就没办法看到原来的代码。

支持(0)反对(0)
#2楼[楼主] 2012-11-14 17:42 | Parry
@Quella
引用如果混淆,那就没办法看到原来的代码。

是,只是进行了混淆而已,一些逻辑还是能看出来的。

支持(0)反对(0)
#3楼 2012-11-14 17:44 | sunriseyuen
@Parry
引用@Quella
引用引用如果混淆,那就没办法看到原来的代码。

是,只是进行了混淆而已,一些逻辑还是能看出来的。

代码多了,看到你不想看了.
支持(0)反对(0)
#4楼[楼主] 2012-11-14 17:50 | Parry
@sunriseyuen
引用@Parry
引用引用@Quella
引用引用如果混淆,那就没办法看到原来的代码。

是,只是进行了混淆而已,一些逻辑还是能看出来的。

代码多了,看到你不想看了.
但是如果价值很高的话,哈哈!
支持(0)反对(0)
#5楼 2012-11-14 19:34 | James-yu
DLL 混淆后啥效果?
支持(0)反对(0)
#6楼 2012-11-14 20:17 | 幻元素
使用了.NET Reactor之后,序列化等用到元数据的功能就用不了了,不知有没有什么解决方法.
支持(0)反对(0)
#7楼[楼主] 2012-11-14 20:41 | Parry
@James-yu
引用DLL 混淆后啥效果?
效果是一样的
支持(0)反对(0)
#8楼[楼主] 2012-11-14 20:44 | Parry
@幻元素
引用使用了.NET Reactor之后,序列化等用到元数据的功能就用不了了,不知有没有什么解决方法.
还真没试过,我去看看:-)
支持(0)反对(0)
#9楼 2012-11-14 20:48 | rsync
这些混淆没太大作用。

人家直接到处IL,然后修改IL。

之后重新build一份就解决问题了。

支持(0)反对(0)
#10楼[楼主] 2012-11-14 21:41 | Parry
@imfunny
引用这些混淆没太大作用。

人家直接到处IL,然后修改IL。

之后重新build一份就解决问题了。

你用这种方法试试看能不能看到IL哦
支持(0)反对(0)
#11楼 2012-11-14 21:44 | rsync
@Parry
混淆的是可以看到的。

我确定。

加壳的不能够。

但是加壳的不一定能够运行,也不能够被引用撒的。

用vs带的ildasm看下就知道了。

至于代码呢,谁爱看就谁谁拿去的,混淆没什么意义。

支持(0)反对(0)
#12楼 2012-11-14 22:17 | daconglee
至于代码呢,谁爱看就谁谁拿去的,混淆没什么意义
支持(1)反对(0)
#13楼 2012-11-14 22:33 | LineZero
文章不错,支持一下
支持(0)反对(0)
#14楼 2012-11-15 00:27 | gongji
aspack
支持(0)反对(0)
#15楼 2012-11-15 07:25 | liuyilin888
皮毛而已
支持(0)反对(0)
#16楼[楼主] 2012-11-15 09:45 | Parry
@liuyilin888
引用皮毛而已
恩水平一般脱壳的部分还等大牛们来写
我再学习学习哈哈
支持(0)反对(0)
#17楼[楼主] 2012-11-15 12:09 | Parry
@imfunny
一般的混淆是可以的
但是使用上面的.NET Reactor混淆后是看不到的,需要脱壳后才能看到。

至于混淆的意义主要看不同的需求了,就想js混淆一样。

支持(0)反对(0)
#18楼 2012-11-15 14:07 | eflay
再保护也比c++的保护好破的多,所以一般最多加个变量名混淆,否则反倒破坏很多东西,降低执行效率。

支持(0)反对(0)
#19楼 2012-11-15 16:30 | 6572789
混淆后,代码慢不慢,并且会不会爆病毒错误
支持(0)反对(0)
#20楼 2012-11-15 18:56 | 为乐而来
这个一定要学习。

只有winform能这样做吗。

webform行不行啊
支持(0)反对(0)
#21楼 2012-11-15 22:29 | 鹏程一键财务分析软件Clojure+Logic+R+C#
使用scala,clojure,等罕用的平台语言,编译后相当于进行了一次流程混淆,再用混淆软件混淆一下,效果应还可以的。

支持(0)反对(0)
#22楼[楼主] 2012-12-05 09:53 | Parry
@为乐而来
webform如果发布的话也是dll啊,所以也是可以的。

支持(0)反对(0)
#23楼 2013-01-09 15:07 | danch744
不错,支持一下
支持(0)反对(0)
#24楼 2013-03-06 10:18 | 编程记录
来学习的
谢谢分享
支持(0)反对(0)
#25楼 2013-04-16 11:16 | panda456
VS自带的DotFuscator是个社区版,功能方面相对弱了点,不过我们公司一直用的是Dotfascator专业版,虽然是收费的,但是公司出钱,不心痛其实,自己算算账,花点钱,但是可以保护辛苦写的代码,还是值得滴!
书中横卧着整个过去的灵魂——卡莱尔
人的影响短暂而微弱,书的影响则广泛而深远——普希金
人离开了书,如同离开空气一样不能生活——科洛廖夫
书不仅是生活,而且是现在、过去和未来文化生活的源泉——库法耶夫
书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者———史美尔斯
书籍便是这种改造灵魂的工具。

人类所需要的,是富有启发性的养料。

而阅读,则正是这种养料———雨果。

相关文档
最新文档