深入Jit,实现dotNet代码的加解密
这段时间在测试.Net Jit的容错性,为了方便,就直接将代码插入到Jit中进行测试了。
这个种方式就是我前面介绍DNGuard时提到的第一种增加内核强度防反射脱壳的方法。
这种技术即可用在dotnet代码的保护上,也可以用在dotnet加密壳的解密上。
目前的加密壳都是将内核插入到ee中提供解密服务。而dotNet的反射功能也是在ee层实现的,
所以才暴露了加密壳之前的反射漏洞。
如果加密壳将内核插入到jit,和jit融合提供解密服务,那么反射就基本上失效了。在 ee 层就无法获取到解密的代码了。
在这种情况下修复反射基本上是不现实的了,jit只是为ee提供编译服务。当然如果实现了jit层的脱壳,然后反过来再从jit增加一个服务提供ee层调用也是可以修复反射的,但如果实现了jit层的脱壳,再修复反射就有点多此一举了。
如果直接从Jit层脱目前ee层的加密壳是比较轻松的,根本不用考虑修复反射的问题,对.Net 2.0 , 1.1都管用。
这种方法对目前加密壳以及它们的各个版本都有效。只是jit层脱壳有一个问题要解决,因为只有方法被编译时才会进入jit,所以要完全脱壳需要让方法都被编译。
不过这个问题不大,从ee层或者反射着手都可以解决。之前对付某壳老版本时用过,当时该壳没有躲过Profile,可以从profile里面dump到代码,同样只有方法在编译时才能通过profile得到代码。
用反射比较简单,不用了解ee都可以,invoke一个方法时这个方法肯定会被编译的。
Jit层脱壳可以通吃目前的ee层加密壳,加密壳如果还在ee层混就没什么前途了。
Jit层脱Jit层的加密壳,就如同目前用反射脱ee层的壳差不多(甚至可能还稍差一筹),没法做到通吃,只能针对不同的加密壳内核做不同的脱壳核心才行。
Jit加密壳和Jit融合得越复杂,要脱壳难度就越大。不过这样要保证加密壳的稳定性和兼容性,就要做更多的工作了。
就是这个原因,我才做Jit的容错性测试,DNGuard 2.0的内核使用的就是Jit层,容错性测试差不多了。
DNGuard目前的内核基调就不会再调整了。
接下来就要着手DNGuard H-VM的试验和测试了。这个也是纯Jit层的。(H = half)
DNGRuntime在运行时动态还原程序集,进行程序集方法的拆分(即一个方法被拆分为两个或多个),
拆分后的方法差不多是一半走jit,一半走DNG H-VM。
遵循如下约定:
如果方法A走Jit,则被方法A所调用的方法都走 DNG H-VM。
posted on 2006-12-09 00:49 紫雨轩 .Net 阅读(5511) 评论(14) 编辑 收藏 举报