.Net 加密原理,纯Jit层加密壳核心的实现(七)

前面我们介绍了目前主流的双层加密壳核心实现原理,
以及应对兼容性,同时考虑安全性的前提下对加密壳核心进行简化。
并就加密壳核心的兼容性以及安全性进行了讨论 ,提到了加密壳核心兼容性和安全性共赢的实现模式,纯Jit层核心。

今回我们将介绍这种加密壳核心的实现。

前面我们已经将加密壳核心简化为只Hook框架内核的两个函数,mscorwks.dll中一个,mscorjit.dll中一个。
同时在兼容性方面我们了解到mscorwks.dll是一个瓶颈问题,所以我们将要抛弃核心对mscorwks.dll的Hook。只保留对mscorjit.dll的一个Hook。

不少朋友可能已经了解到了DNGuard HVM试用版的内核模式,它就是纯Jit层实现,今回就以此为例介绍。

首先取消对EE层的依赖
即加密壳不在EE层安装任何服务。这样在兼容性方面就完全抛开了mscorwks.dll这个瓶颈问题。
在安全方面也有改善,避免了可能被EE层拦截泄漏方法体局部变量签名和异常处理表的弱点。
参考:http://www.cnblogs.com/rick/archive/2007/08/13/852999.html

在加密壳运行库中实现方法体的预处理
因为加密壳没有在EE层Hook完成方法体的预处理,所以我们需要在Jit层完成对当前编译方法的预处理。
程序运行到加密壳运行库中时的相关结构体包含的内容并不是当前方法体的正确内容,我们需要在此对结构内容进行重建。
至于怎么实现方法体的预处理,我们可以通过逆向mscorwks.dll,分析其虚拟机预处理层的相关实现代码,自己模拟实现。
必须要把实现代码全部移植到加密壳运行库中,不然将仍然无法摆脱对mscorwks.dll的依赖。

方法体的预处理可以处理哪些东西
1、可以把方法体的局部变量签名以及异常处理表直接转化为Jit层中的相应对象实体。
2、对IL字节码进行还原。
注:IL字节码是直接在Jit层中传递的,有被Jit层拦截的风险。

Jit层Hook位置的选取
DNGuard HVM试用版 使用了直接Hook编译的入口函数的方式。加密壳核心只直接拦截了Jit中一个位置。
这种模式是DNGuard HVM 标准版以及专业版的基础模式。

在加密壳提供的新编译入口函数里面,我们首先要做的就是方法体的判断,如果是加密的方法体,则进行方法体的编译预处理操作(DNGuard 标准在预处理完成后对中间数据进行销毁)。
然后将控制权传递给Jit。

“方法体加密对应信息” 的改善,应对静态脱壳者
在前面 .Net 加密原理,方法体加密信息对应关系的实现 介绍了 “方法体加密对应信息”的实现。
我们前面一直采用的直接存储在元数据中的方式,主要是为了方便EE层中的操作。
现在采用纯Jit层核心,可以顺便对这个进行改进。

这个改进后采用自定义的结构表来保存这些信息,同时可以对结构表进行加密。这种方式可以增加抗静态脱壳的强度。当然对动态拦截者没有多少影响。

针对Jit层框架的局部检测,应对Jit层动态拦截
目前的加密壳核心,还无法保证IL字节码在Jit层中的安全,即可能被拦截导致IL字节码泄漏。
所以对于纯Jit层加密壳,我们至少要保证它在这方面不比双层壳差。在双层核心中因同时拦截了3个函数,所以破解者需要拦截这三个函数下级的函数才可能实现拦截。
而在这里,因为核心只拦截了入口函数,破解者可以直接拦截这些函数来截获IL字节码。
解决方法也简单,就是在加密壳运行库中对这三个函数进行检测即可。
当然,你可以扩大检测范围。

另外如果注重兼容性可以完全不检测任何函数,如DNGuard HVM的试用版就是这样的。
DNGuard HVM标准版对部分框架函数进行了检测。

这种核心仍然无法保证IL字节码,其保护意义何在?
这种核心在目前的加密壳核心模式来说已经是一种进步。当前市面上的加密壳核心模式都存在可通过直接拦截框架函数获取完整方法体的弱点,而这种模式已经能够保障方法体局部变量签名以及异常处理表不能从加密壳运行库以外的区域拦截获取了。也即破解者如果直接从框架入手,将无法获取这两部分。

无法保障IL字节码,其它的保护还有什么意义?
首先,IL字节码只是方法体的其中一部分。保护了其它部分,就能有效阻止破解者完成完全脱壳。
这样破解者将无法获取到一个完整的脱壳后的程序集,就跟不能对程序集进行整体的分析、优化、反混淆等相关处理。
破解者就只能得到单个方法体独立的IL'字节码。这样已经可以基本保护代码版权了,也大大增加了破解分析的难度,配合代码流程混淆,效果更佳。
局部变量签名对程序流程没有影响,应该对IL代码的分析影响较少。异常处理表会影响代码流程(如final块fault块)。 再有一点就是没有 异常处理表,进行流程反混淆将会更加困难。

不过,总归是不完美,所以在DNGuard 专业版中增加了HVM功能,以实现保护Jit层中的IL字节码,让破解者不能截获正确完整的IL字节码。

下一回我们将介绍一下HVM核心的工作原理。

时间: 2024-07-28 23:30:13

.Net 加密原理,纯Jit层加密壳核心的实现(七)的相关文章

.Net 加密原理, 纯EE层加密壳内核的实现(二)

在上一回 .Net 加密原理,方法体加密信息对应关系的实现  中介绍了实现加密壳首要解决的基础问题, 今回以第一种实现模式介绍如何实现一个纯EE层(mscorwks.dll)的加密壳内核. 首先确定 "方法体加密对应信息" 直接通过元数据来保存. 这里我们使用最简单的记录方式--记录一个四字节的指针信息. 另外再加上一个标识数据,这个我们采用一个 magic DWORD表示. 这样记录信息一共是8字节.所以方法体小于8字节的Method将不能被加密处理. 接下来就是加密壳运行库核心的实

.Net 加密原理,方法体加密信息对应关系的实现(一)

在 per method 的dotNet加密中,首要解决的方法体对应关系,即在运行时加密壳如何确定当前要解密的方法体所对应的加密信息. 目前大部分加密壳都直接利用了dotNet的元数据来保存这种对应关系,我们知道在元数据中每个方法都会对应一个RVA值,加密壳可以直接把这个关系记录在RVA的地址处.在框架运行中RVA处的数据会被作为"方法体"在处理流程中直接传递,加密壳通过拦截框架处理流程中的函数,来对"方法体"进行分流处理.即先判断RVA处的数据是否"方法

.Net 加密原理,加密壳核心的兼容性以及安全性讨论(六)

前面我们介绍了目前主流的双层加密壳核心实现原理, 同时提到了应对兼容性,同时考虑安全性的前提下对加密壳核心进行简化. 今回主要讨论一下安全性.兼容性需要注意哪些因素. 关于安全性,主要应对两类破解者. 1.静态分析脱壳 对于这一类,行之有效的方法就是增加加密算法的数量和复杂度. 加密壳核心的实现方式对其影响可忽略. 2.动态框架核心层拦截 对于这一类有两种防范,一是针对框架核心层进行检测,对Hook进行反制. 二是构造合理的加密壳核心模式,将核心数据局限在加密壳运行库范围内, 使破解者在加密壳运

.Net 加密原理,加密壳运行库的加载方式(九)

.Net加密壳的运行库加载方式目前主要分两种.用得比较多的一种是 向程序集中注入Loader代码,然后给程序集中的每个类型添加静态构造函数.在静态构造函数中调用Loader代码. 目前的加密壳大部分都是这种模式.这种模式,利用了静态构造函数的特性. 应该注意到静态构造函数和Loader代码执行时 运行库是还没有加载的,所以这部分代码是却对不能加密的. 程序集执行起来后,运行库才会被载入. 另外一种,是直接利用windows pe加载器来自动加载加密壳的运行库. 这个熟悉win32的,应该知道修改

.Net 加密原理,HVM核心的实现原理(八)

目前加密壳将核心转移到Jit层后,内核模式的强度增加空间已经很小了.目前市面上的加密壳至少有一个共同的缺陷,无法防止Jit底层截获IL字节码. 有些壳采用从周边增加强度(如 Anti Hook),由于hook的多样性再加上壳又需要考虑自己的兼容性,所以这个效果不是十分理想. 从防止脱壳入手,通过保护局部变量签名和异常处理表,来阻止方法体的脱壳还原.这样虽然不能阻止截获IL字节码,如果配合流程混淆还是能起到相对有效的保护. 这样仍然有些遗憾,能实现阻止Jit层截获完整的IL字节码就完美了. htt

.Net Jit层脱壳机的实现原理

本文将在 .Net 反射脱壳机核心源代码 的基础上介绍,如何实现 Jit层脱壳 机. 首先我们选择使用 C++/CLI 来完成这个工作.反射部分需要用到 .Net的相关类库,jit 层 hook 需要使用native c++ 方面的功能.本文假设您已经完成了 hook jit的工作,并截获到了相关结构体. 首先介绍一下代码主要流程: 入口函数 void DumpAssembly(Assembly ass,string path) 枚举所有type,调用 void DumpType(Type tp

PGP加密原理

PGP是一个基于RSA公匙加密体系的邮件加密软件.可以用它对你的邮件保密以防止非授权者阅读,它还能对你的邮件加上数字签名从而使收信人可以确信邮件是你发来的.它让你可以安全地和你从未见过的人们通讯,事先并不需要任何保密的渠道用来传递密匙.它采用了:审慎的密匙管理,一种RSA和传统加密的杂合算法,用于数字签名的邮件文摘算法,加密前压缩等,还有一个良好的人机工程设计.它的功能强大有很快的速度.而且它的源代码是免费的.实际上PGP的功能还不止上面说的:;PGP可以用来加密文件,还可以用PGP代替UUen

非对称加密(1)非对称加密原理

现在我们已经知道对称加密的一个最大的问题是如何安全地传输密钥,并且在对称加密的体系下找不到好的解决方案.1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是"公开密钥系统".相对于"对称加密算法"这种方法也叫做"非对称加密算法". 与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey

U盘加密原理你了解多少

  U盘中采取的数据保护技术一般分为两种:一种是软件加密,一种是硬件加密,关于两种加密措施,他们之间有什么区别呢?下面我们要来说说U盘加密的原理. 简单的来说,硬件加密技术一般所指的是采用AES 128位或256位硬件数据加密技术对产品硬件进行加密,具备防止暴力破解.密码猜测.数据恢复等功能.而软件加密则是通过产品内置的加密软件实现对存储设备的加密功能.同时实现硬件加密的方式主要有键盘式加密.刷卡式加密,指纹式加密等.而软件加密主要有密码加密.证书加密.光盘加密等. 当然两者加密方式都有各自的优