赞
踩
前几篇介绍了vt强大的无察觉劫持页表hook的能力,kvm的大致原理,但vt的能力远远不止于此。因为实现vt托管的操作系统,将可以做到指令级的管控。甚至直接基于vt形成调试器,如果用来调试内核,将会大大提高稳定性。整个vt核心全部位于vmcs的 状态域。根据intel 开发手册第三卷,控制域的核心部分分为1.guest field ,.2 host field , 3.vm-excution control field, 4.vm-Exit control field, 5.vm Entry control field, 6.vm-exit information fields, 7.VMCS types
这几部分我做简要介绍,有兴趣的自行查看intel 开发手册的详细介绍。
基于开源ksm介绍。
启动部分,主要是vmcs的设置,位于ksm_init。必须每个cpu分别设置VMCS,以实现每个cpu的虚拟执行。这里在用户态注册了/dev/ksm用来操作vt. 代码实现了epage hook 页表劫持的hook, 用户态沙箱, 内视引擎,idt劫持等功能。
我介绍先前三个。有个很复杂的结构体ksm vcpu,发个缩略图吧。
首先普及下EPT, 为了更高效的实现GPA到HPA的转换,intel 设计了EPT机制,当然我自己理解这个转换其实不是必须的,因为单纯的GPA足够找到物理地址,这样设计的目的还是虚拟机管控的完整性,因为经我测试,取消ept的虚拟机照样可以运行。
总之这个过程其实和普通的页表查询很类似,但是实现从guest 物理地址到host物理地址的转换。
EPT页表的建立流程
有了ept的概念,我们知道,GPA到HPA有ept的一重映射,那么如果我们需要无察觉的hook内存,只需要GPA 映射到新的HPA,那么页表就可实现替换,并做一定的内存检查绕过。
ksm的实现架构如下:
ept_alloc_page就是对ept映射的改变,也是hook的核心。作者定义了一些列eptp的指针,通过以下宏进行切换。
#define EPTP_EXHOOK 0 /* hook eptp index, executable hooks only */
#define EPTP_RWHOOK 1 /* hook eptp index, readwrite hooks, no exec */
#define EPTP_NORMAL 2 /* sane eptp index, no hooks */
#define EPTP_DEFAULT EPTP_EXHOOK
原函数调用方式:
通过vmfunc实现根模式下的映射切换,便捷的实现页表切换。
这个引擎还是和ept相关,效果就是监控地址的访问。一旦发生特定地址的访问或执行,将会触发vm_exit,受到VMM的监控。
核心原理在于kms_instropct_add_watch, 通过addr->access设置访问属性,和addr->gpa访问地址。触发VMM
epte = ept_alloc_page(EPT4(ept, EPTP_DEFAULT), addr->access ^ EPT_ACCESS_ALL, mt, addr->gpa, addr->gpa);
那么ept的映射效果将是一旦在此地址发生访问或执行,VMM就可以接受到信息。从而监控特定地址的访问。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。