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;

  其详细情况看《处理器虚拟化技术》即可,其结构如下图

  

原文地址:https://www.cnblogs.com/onetrainee/p/13590000.html