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