VT MSR、CR、 Exception、#PF
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
VT MSR、CR、 Exception、#PF
1. MSR寄存器读写拦截
① 开启虚拟机控制字段:VM-execution control[28] 置为1时,则开启 MSR BitMap;
② 开启MSR BitMap时,我们需要申请一块 4KB内存,作为 MSR_BitMap,其构造如下图:
③ 当申请好BitMap并设置好对应拦截的,使用 __vmx_vmwrite,向 MsrBitMapAddress 字段填入 MSR_BitMap的物理地址;
④ VM-Exit Reason 其 RDMSR 与 WRMSR 的错误码分别是 31 与 32,拦截下来即可;
⑤ 对于这部分的处理,如果我们想走正常流畅,其指令解析如下,我们自己调用 rdmsr rcx,读出的结果分别存储到 rax 与 rdx 中。
2. CR3寄存器读写拦截
① VM-execution control 第 15 、16 是关于CR3读写拦截的;
② 除此之外,其还规定了 CR3_TARGE_COUNT 、CR3_TARGE_VALUE0、CR3_TARGE_VALUE1、CR3_TARGE_VALUE2、CR3_TARGE_VALUE3字段;
③ 其拦截规则是当其 CR3 不属于 VALUE 0-3 时,则会产生VM-Exit,否则不会产生;
④ 其Exit-Reason中有相关Exit原因,重点是 EXIT_QUALIFICATION,当退出原因是CR寄存器时,其EXIT_QUALIFICATION的字段如下:
我们根据如下信息,很好判断其各种属性
3. Exception拦截
其存在一个 Exception BitMap位,当产生异常时,其会检查该Bitmap相关位是否值1,如果置1则产生Exit;
比如,我们想要拦截 0xE 事件,则 EXCEPTION_BITMAP |= (1<<0xE),来将有关置位即可;
当我们接管有关异常时,我们大概率无法自己处理,此时我们还要继续交给操作系统来进行处理;
因此我们要使用事件注入,将有关异常事件注入进去,让系统自己执行。
4. #PF异常的处理拦截特点
#PF异常应该是操作系统中最常见的异常,Intel VT 对其进行了拓展,其多出了 PEFC_MASK 与 PEFC_MATCH;
简单来说,就是当产生 #PF异常时,其会存在一个 #PF码 - PEFC,PEFC & PEFC_MSAS == PEFC_MATCH时,会产生Exit;
其详细情况看《处理器虚拟化技术》即可,其结构如下图