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

通常我们通过代码混淆、加密的形式达到软件保护的目的。在Web开发里我们接触过的可能就是JS代码加密了,可以通过对JS代码进行混淆、加密从而实现对核心JS代码的保护。如果没有接触过的可以在这里简单了解一下,这次我们就不去细说了。

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

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

1.代码混淆

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

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

using System;
 using System.Windows.Forms;
     
 namespace CodeObfuscator
 {
     public partial class Form1 : Form
     {
         private readonly User _currentUser;
         public Form1()
         {
             InitializeComponent();
             _currentUser = new User
             {
                 UserID = 1,
                 UserName = "Parry@cnblogs"
             };
         }
     
         private void ButtonAlertClick(object sender, EventArgs e)
         {
             MessageBox.Show(_currentUser.UserName);
         }
     }
     
     public class User
     {
         public int UserID { get; set; }
         public string UserName { get; set; }
     }
 }

我们使用最常用的反编译工具Reflector对生成的exe反编译查看源码。

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

在混淆选项里将Enable设置为启用,混淆公共类型,字符串加密等常用的也设置成启用。其他的选项Tips里都有详细的解释,就不一一讲解。

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

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

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

2.加壳与脱壳

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

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

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

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

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

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

作者:Parry
出处:http://www.cnblogs.com/parry/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为一种保护.NET程序代码的方式,代码混淆在实际开发中得到了广泛应用。代码混淆可以使代码变得晦涩难懂,增加反编译的难度,使得黑客无法轻易地获取源代码,从而增强代码的安全性,但是也会增加代码的复杂度和维护难度。 以下是.NET代码混淆实践的一些技巧: 1. 使用命名混淆器:命名混淆器可以将代码中的变量、方法、类等名称进行混淆,使得代码难以阅读和理解。常用的命名混淆器有Dotfuscator、Eazfuscator、SmartAssembly等。 2. 使用控制流混淆器:控制流混淆器可以通过改变代码的控制流程,使得代码难以被理解和分析。常用的控制流混淆器有Crypto Obfuscator、Dotfuscator、SmartAssembly等。 3. 使用加密算法:加密算法可以对代码进行加密,使得黑客无法轻易地获取源代码。常用的加密算法有AES、DES、RSA等。 4. 使用反调试技术:反调试技术可以防止黑客使用调试器来分析代码。常用的反调试技术有检测调试器、阻止调试器附加等。 5. 使用反反编译技术:反反编译技术可以防止黑客使用反编译工具来获取代码。常用的反反编译技术有加壳、加密等。 总之,代码混淆虽然可以增强代码的安全性,但也会增加代码的复杂度和维护难度。在使用代码混淆时,需要在安全性和可维护性之间做出权衡,选择合适的混淆技术和工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值