加壳工具评估
加壳工具评估
ZEROKO14加壳加密工具盘点与评估
概述
发布出去的DLL所面临的风险:
- 直接引用
- 反编译
- 反射
如果DLL一点措施都不做的话,上面任意一种都可以达到破解目的的。
保护方式盘点
- 混淆类的工具(如Dotfuscator,但是可以通过ILSpy、Reflector等反编译哦,直接COPY代码也能运行)
- 加密类的工具(如MaxToCode,网上有相应的破解教程)
- 加壳类的工具(如Sixxpack,网上有相应的破解教程)
- 强签名(签名只是防止项目中的某一个DLL被篡改了,不能防止反编译或反射的哦)
上面那些工具的目的归结出来大约完成两个目的,一是不能看,二是不能调,当然,我们也是实现这两个目的,只是手段不同。
一、不能看:.NET DLL可以包含托管堆代码(可以被反编译的)与非托管堆代码(不能被反编译,要反编译也是更高层次的了,不在讨范围内),我们将核心逻辑代码置于非托堆代码中,由托管堆代码提供接口供外部调用,调用时将非托管代码通过.NET动态编译特性编译后返回执行结果。这样就保证了不能看。
二、不能调:我们在非托管代码中加入验证调用者来源功能,判断调用者的HASH值是不是与在非托管代码中约定的HASH值(发布时需要提前生成相关引用者的HASH值存于非托管代码,最后生成非托管代码的DLL放于安装包中)一致,如一致则通过执行返回结果,不一致则返回空。这样就解决了非合法来源不能调的问题。
壳主要可以分为以下几种
- 加密壳:通过加密和解密算法来保护软件代码,使其难以被破解。
- 虚拟机壳:将软件代码转换为虚拟机指令集,使得破解者难以理解和分析。
- 虚拟化壳:将软件运行在虚拟环境中,增加破解难度。
- 压缩壳:通过压缩和解压缩算法来保护软件代码,减小软件体积并增加破解难度。
加壳原理
因为C#程序是通过.NET Framework或.NET Core运行时(CLR)来执行的,而不是直接在操作系统级别执行的。因此,PE文件中的入口点地址可能不同于C#程序的实际入口点。
在.NET程序中,CLR会负责加载和执行程序集,并在内部处理Main方法的调用。因此,即使PE文件的入口点地址为0,CLR仍会正确找到并执行C#程序的Main方法作为程序的入口点。这是.NET程序执行模型的特性,与传统的原生代码程序略有不同。
VMProtect
记录vmprotect对c# dll的影响
运行上完全无影响
VS调试中,需要将exe程序的生成配置的AnyCPU修改为具体的x32/x64版本,否则会引发异常
成效:
- 使用dnspy无法查看反编译代码
vmprotect原理
VMP最主要的是对指定关键代码进行虚拟化,同时再加一些乱序跳转和大量的废指令,反调试,内存保护,导入表保护,使逆向分析人员无法分析执行的代码,经过VMP虚拟机的代码被膨胀好多倍
虚拟化前:
虚拟化后:
代码被虚拟化之后,假如在调试器中单步执行会跳来跳去,一条汇编会变成成百上千条指令,无法判断他在干什么。
虚拟化部分
本质来讲VMP是一个基于堆栈机的intel指令模拟器,对过编译把原来的intel指令编译成精心设计的一组虚拟指令,然后用自己的一套引擎来解释执行。VMP加壳后,他会将原来的代码进行删除,导致基本完全无法进行还原。
VMP是防止别人逆向分析自己的代码,逆向分析的目的是分析代码,了解代码逻辑和代码的目的,然后加以利用。看样子,目前只能通过对虚拟机引擎的分析,来搞懂虚拟机引擎,然后理清代码流程,达到逆向分析的目的。
实现一个简单的虚拟机
ConfuserEx
免费,符合MIT开源协议
ConfuserEx是一个功能强大且广泛使用的.NET代码混淆工具。它支持多种混淆技术,包括控制流混淆、字符串加密、资源加密等。它具有灵活的配置选项,可以根据不同的需求进行定制(不足的是目前只支持.NET Framework 2.0/3.0/3.5/4.0/4.5/4.6/4.7/4.8,不支持.NET Core代码混淆)。
针对需要二次在主程序开发的dll,进行如下保护:
- AntiTamper
- Anti Il Dasm Protection
- Constaints Protection
- Anti Dump Protection
- Control Flow Protection
- Reference Proxy Protection
- Name Protection
针对exe可以额外进行:
- Anti Debug
- Resources Protection
- Invalid Metadata Protection
- Protection Hardening