前面介绍了 EE 层加密壳核心的实现,但是那个实现模式存在反射漏洞,
今回介绍针对反射,对核心的增强方法。
方式一、破坏反射
反射是通过调用 MethodInfo 的 GetMethodBody ()来获取 MethodBody 对象。
然后通过 MethodBody 对象获取方法体的相关信息的。
我们可以通过Hook 反射时调用的函数来对其进行破坏。
如:MethodInfo.GetMethodBody () 实际会执行 ee 层的 RuntimeMethodHandler::GetMethodBody()函数。
加密壳运行库可以在 这个函数中间安装挂钩,插入破坏代码。
缺点:恢复框架的原始代码就能修复反射了。
方法二、修改Hook位置
问题的根源就在GetILHeader 这个函数,加密壳运行库替换了这个函数,提供了正确的解密服务,所以导致了反射漏洞。
我们只需要保证方法能被正确编译即可,其它地方可以不提供正确的代码。
如是,我们不需要直接替换 GetILHeader 函数,只需要替换编译预处理时对GetILHeader的调用即可。
这样保证了方法体进行编译时获取的是正确代码,其它地方取到的就是错误代码了。
同时对 “方法体加密对应信息” 的记录也需要修改。
因为没有直接Hook GetIlheader 函数,所以其它地方取到的方法体就是文件中 “方法体加密对应信息” 的数据了。
我们需要保证这个数据包含正确的方法体结构格式。也即主要是方法头的结构格式不能动,有些段的内容是可以修改的。
因为方法体格式不对,框架会抛出 BadImageFormat 的异常。
这样除开方法头,我们的“方法体加密对应信息” 就只能保存在 IL字节码 的段里面了。
因此 方法体 纯代码(ILCode)长度小于 8 字节的将不能被加密。
这个方式已经将 加密壳核心从EE层向 Jit预处理层拉近了。
但还有一个缺陷,就是 加密壳核心 输出了 正确的 GetILHeader 函数。
仍然存在修复反射的弱点。
不过这已经是一个很好的开始了,下一回将在这个基础上介绍虚拟机预处理层加密壳核心的实现。
.Net 加密原理, 纯EE层加密壳内核的实现(二) | .Net Native Image 加强保护的模式在 ORM、 AOP 中的问题 |
.Net 加密原理,EE层加密壳核心的改进(三) | |
[ 发布日期:17年前 (2007-09-03) ] [ 来自:rick@博客园 ] | [分类:原创作品] |
[ 分类:原创作品
| 查看:2027 ]
暂时没有评论,快来发表一个评论吧。
发表评论 |