了解.NET 程序加密原理,选择合适的加密工具

2024-10-01 18:09:10

前言

由于众所周知的原因,.NET 程序自然很容易被破解,因为它们是托管中间语言代码,也称为 MSIL。即使现在的AOT技术是由C++启动程序引导的(),所以它的逆转难度仍然很容易。了解其加密原理使得针对性的保护变得更加重要。

这里所说的强加密是指虚拟机(CLR/JIT)加密、加密软件自带的算法加密以及难以逆向的.NET加密工具。没有虚拟机加密的基本功能,基本不推荐。

DHVM(HVM),也是加密虚拟机的 JIT、IL 字节码替代品。

VBP(),是一种用于加密虚拟机的JIT,还有IL等其他混淆、虚拟化等,主要偏向于托管加密。

.NET8 的 AOT 是非托管的。推荐使用VMP。该工具在非托管级别的加密强度是首屈一指的。它使用自己的虚拟机指令来加密程序更改。

在研究VBP和DHVM时,很明显VBP的承载能力更强。它基本上创建一个托管 DLL,挂钩 JIT 编译过程并加密托管 DLL。但DHVM却给人完全相反的感觉。 DHVM在非托管中具有很强的加密方法,因此需要带一个非托管.dll来操作JIT。

精心制作的

参考如下代码:

 static void ABC() {     Console.WriteLine("Call ABC"); } static void DEF() {     Console.WriteLine("Call DEF"); } static void Main(string[] args) {     ABC();     DEF();     Console.WriteLine("Call Main");     Console.ReadLine(); }

在VBP上,它加密MSIL程序集和函数名称,然后加密IL指令。其JIT Hook方法与DHVM基本相同,但代码实现方式不同。就这样。

至于代码上的区别,VBP中内联了ABC和DEF函数,其MSIL二进制如下:

00 72 01 00 00 70 28 11 00 00 0a 00 2a 00 // ABC函数00 72 13 00 00 70 28 11 00 00 0a 00 2a 00 // DEF函数

ABC 和 DEF 函数内联到托管 Main 函数中,类似于 .("Call Main"); 的调用格式。首先传递一个字符串,它是 MSIL 二进制文件:

00 72 01 00 00 70

然后。调用并返回,这是MSIL二进制文件

28 11 00 00 0a 00 2a 00 //2a:ret(返回) 00:nop

在静态托管 DLL 中,此 MSIL 是经过伪装的。需要解密真正的MSIL,然后才能形成上述MSIL并分配给JIT进行正常编译。这里需要的是解密前的静态代码(例如示例中的特征代码:A3 35 57 22),无痕钩子就足够了。

DHVM中虽然没有内联,但是IL代码是以非托管方式存储的,如下:

0000000180474088 4C 8B 5E 10   mov r11,qword ptr [rsi+10h]  000000018047408C 4C 89 5F 10   mov qword ptr [rdi+10h],r11

DHVM 还需要解密以形成最终的 MSIL 结果,但由于它具有非托管静态固有地址,因此可以在不反转解密点的情况下对其进行挂钩。

ABP和DHVM的区别在于,前者只要反转其原理就基本顺利,可以静态追踪解密前的字节码。 DHVM更全面,知识更多,因此可以静态追踪其ASM。

了解加密技术、CLR/JIT原理、逆向技术将有助于更好地保护.NET软件版权信息。

有关虚拟机加密软件的更多信息,请参考知识星球,其中有一系列关于 HVM 和加密 .NET 的逆向工程和解密的教程。扫描加入知识星球:

安卓加密工具_加密工具_HTML加密工具

本文仅供学习和研究之用

过去的亮点

标签: 加密工具
首页
欧意注册
欧意下载
联系