.Net虚拟机(CLR/JIT)加密原理(版权保护)
创始人
2025-07-05 05:41:02
0

1.前言

这里的虚拟机加密实际上是修改JIT即时编译器入口函数,让其跳转到加密软件库内部,修正被加密之后更改了的托管DLL的ILCode,以让其恢复正常编译。从而屏蔽修改MSIL带来的软件程序修改。.Net7里面JIT,GC等等都已经实现了分离和解耦。也就是可以把CLR和JIT以及GC(关于GC分离)分隔开来,对它们进行定制和更改。

2.JIT

.Net7里面JIT的路径如下:

C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.10\clrjit.dll

这里的这个cltjit.dll就是模块化的JIT库。

那么它具体是如何运作的呢?这里先看下它在CLR里面调用它方式,然后用C++描述下

//CoreClrFolderHolder.GetUnicode()就是clrjit.dll的路径,这里是获取clrjit.dll的模块句柄
*phJit = CLRLoadLibrary(CoreClrFolderHolder.GetUnicode())
//通过上面获取的句柄,获取到clrjit里面的getJIT函数地址
pGetJitFn getJitFn = (pGetJitFn) GetProcAddress(*phJit, "getJit");
//运行getJIT函数的结果,赋给pICorJitCompiler
ICorJitCompiler* pICorJitCompiler = (*getJitFn)();
//这里的ICorJitCompiler是一个C++类
m_jit=  pICorJitCompiler




上面的代码用C++描述下就是:
HMODULE h=LoadLibraryExA("clrjit.dll");
void* getJitFn=(void*)GetProcAddress(h,"getJit");
ICorJitCompiler* pICorJitCompiler = (*getJitFn)();
m_jit=  pICorJitCompiler

以DHVM(DNGuard HMVM)为例,这里的这个m_jit里面的第一个成员变量就是JIT即时编译器的起点,CLR在加载托管DLL的时候,加载了DHVM模块,更改了这个JIT即时编译的起点。跳转到DHVM内部。对ILCode进行修改,然后再跳转回来,进行即时编译。这个过程如下图所示:

图片图片

3.保护的秘密

首先看下这个DHVM修正JIT入口。当进行了DHVM加密之后,CLR启动,加载被加密后的托管DLL开始。
1.每个被加密的托管DLL都会被注入以下代码:

图片图片


你可以通过ILdasm来查看上图。这里面的Startup和RunHVM这些注入到托管DLL之后,会被CLR先于托管Main加载。后于JIT加载。原有托管DLL的ILCode被保存到DHVM里面,原有的托管DLL的MSIL被修改为各种其它异常错误。
2.托管Main加载之前,通过DHVM函数修改JIT入口。如下代码:

//rbx即是m_jit的第一个成员变量,也就是JIT入口被修改被r11.
//也即是0000000180042100
0000000180472847 4C 89 1B mov qword ptr [rbx],r11

3.当CLR正常加载运行JIT的时候,因为JIT入口已经被替换。所以会跳转到DHVM里面去。

//当运行的时候会跳转到0000000180042100地址处执行。
0000000180042100 40 53  push rbx

4.DHVM里面修正当前需要编译的函数的ILCode为DHVM里面保存的正常MSIL.然后进行正常编译。

//rdi+10h即是需要编译的ILCode,被赋值为r11,也即是保存在DHVM里面的正常MSIL
000000018047408C 4C 89 5F 10  mov qword ptr [rdi+10h],r11

4.结尾

虚拟机加密,这种保护度基本上也可以了。如果需要Hook它,则需要了解虚拟机的原理,或者是二进制层面机器码的含义。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...