导图社区 vol3-26-VM入口
Intel Software Development Mannel 第26章-VMEntry.从头到尾跟踪完这个样本,就理解 VMProtect的入口出口,虚拟寄存器、虚拟栈。
编辑于2022-09-16 17:09:14 上海Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
系统软件可以通过CPUID指令来判断处理器是否支持VMX,如果CPUID.1.ECX.VMX[bit5] = 1,那么当前处理器支持VMX,否则,当前处理器不支持VMX功能。
社区模板帮助中心,点此进入>>
Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
系统软件可以通过CPUID指令来判断处理器是否支持VMX,如果CPUID.1.ECX.VMX[bit5] = 1,那么当前处理器支持VMX,否则,当前处理器不支持VMX功能。
VM 入口
1. VM入口步骤
基础check,确保VM entry能开始
检查VMCS的control和host-state域确保这些设置能够支持VMX非根操作 检查VMCS是否为最近一次的VM exit做了正确配置
检查VMCS的guest-state域,确保VM entry结束后,逻辑核的状态域IA-32和Intel 64 架构一致
基于VMCS中的controls,从guest-state域载入处理器状态
地址范围监视被清除
顺序不确定
从VM-entry MSR-load域载入MSRs
如果正在执行VMLAUNCH,VMCS的launch状态被设置为'launched'
如果“Intel PT uses guest physical addresses” VM-execution control is 1,追踪地址预翻译(TAPT)可能会发生
可能会向guest上下文中注入一个事件
9. VM Entry的特点
可中断性状态
interruptibility-state field 在guest状态域,包含了由STI,MOV SS和NMI的阻塞控制. 该域影响VM entry之后的事件阻塞. 主要区别为VM entry是否vectoring
活动状态
控制在VM entry之后,逻辑核是否在active或在某一种inactive状态,主要区别为VM entry是否vectoring
VM entry之后的挂起的Debug exception的交付
guest状态域的pending debug exceptions field指明是否存在尚未交付的debug exceptions
VMX抢占Timer
如果“activate VMX-preemption timer”VM-execution control为1,VM entry会以在VMX-preemption timer-value域中的无符号数启动VM抢占Timer
中断窗口退出和虚拟中断交付
发生中断窗口退出的时间和条件
与其它事件的优先级比较
NMI窗口退出
发生NMI窗口退出的条件和时间
根据逻辑核的不同状态,决定能否wake逻辑核
由TPR阈值引起的VM exits
产生条件为部分control为1
产生时间:VM entry之后如果TPR control的bits3:0大于VTPR的7:4,VM exit就会发生
挂起的MTF VM exits
VM entry可能会导致在VM entry之后马上挂起一个MTF VM exit
VM Entry和高级debugging features
VM entres不由last-branch records记录,不要创建branch-trace消息, 不要更新branch-trace存储
10. 在载入guest state之中或之后的VM entry失败
当VM entry的失败发生在检查guest-state区域或 载入MSR时,失败的处理方式与更早阶段发生的VM entry失败有所不同
处理方式
失败信息记录在VM-exit information filed
Exit Reason
Exit qualification(基于Exit Reason设置)
其他VM-exit区域不做修改
与VM Exit一样,处理器状态被加载,特殊情况下,PDPTE会被检查并加载
被NMI阻塞的状态与VM entry之前相同
MSR以VM-Exit MSR-load area指定的形式加载
尽管这些步骤和VM exit的对应步骤相似,但是对于某 些VM entry失败情况,许多VM exit中的操作不会发生
11. VM Entry期间的machine check事件
如果在VM Entry期间发生了machine-check事件, 以下情况之一会发生
将machine-check事件当做在VM entry之前发生的来处理
在VM entry完成之后处理machine-check事件
产生一个VM-entry
如果machine-check事件发生在任何一个guest事件载入之后,第一种情况不会发生. 第二种情况只发生在VM entry有权载入所有guest state的情况
8. 事件注入
如果VM-entry interruption-information field 的valid位为1,在guest state的所有组件载入、VM-execution control filed建立之后,VM entry导致了一个即将交付事件
如果VM-entry interruption-information field 的中断类型为0,2,3,4,5,6,则该事件以向量事件注入的形式交付.
如果VM-entry interruption-information field 的中断类型为7,并且vector域为0,则在 VM entry之后会有一个MTF VM exit挂起
向量事件注入
在由VM entry建立的guest上下文中,VM entry交付一个已交付向量事件,这意味着交付发生在guest state的所有组件载入、VM-execution control filed建立之后
该事件(向量事件)使用已建立的VM-execution control filed中的向量选择一个IDT中的描述符
由于事件注入发生在从guest-state区域载入IDTR之后,因此该IDT为guest IDT
如果该事件的交付遇到了一个叠加异常,该异常的vector将会询问异常bitmap
如果bitmap中对应的该异常bit为0,该异常正常交付
如果该异常为良性的,则通过IDT交付
如果该异常为有贡献的,或者是一个page fault,那么就可能产生一个#DF,是否产生取决于遇到叠加异常的事件本身(如何产生#DF,查看SDM异常章节)
如果bitmap中对应的该异常bit为1,就会发生一个VM exit.
事件交付处理可能会导致VM exit
实模式下的VM entries事件注入
在CR0.PE=0的情况下,任何已注入向量事件都会被正常交付
VM entry会使用VM-entry interruption-information field提供的vector从IDT.base指向的IVT中选择一个4字节的entry
VM entry之后,如果CR0.PE为0,那么VM-entry interruption-information field中的deliver error code必须为0,因此实模式下向量化事件注入不产生任何错误码
如果在事件交付过程中发生了一个fault,该fault的处理看起来就像是在事件交付过程之中发生在VM non-root操作中的
挂起的MTF VM Exit注入
7. 追踪地址预翻译(TAPT)
当特定VM-execution control为1时,Intel PT使用的地址被视为guest物理地址,这些地址被EPT翻译为物理地址
VM entry使用TAPT防止发生EPT违规时缓存的追踪数据丢失
只有当VM entry进入后,使能IPT,并且特定control位为1时,VM entry才会使用TAPT
由于EPT违规、EPT误配置、页编辑日志满事件、APIC访问都可能使TAPT导致VM exit,如果在VM entry期间,发生了此类TAPT导致的VM exit,VM exit看起来就像是在VM entry完成之后发生在VM non-root操作中的
如果在VM entry期间TAPT导致了VM exit,VM entry就不会进行事件注入,即使VM-entry interruption-information field 的valid位为1. 这样的VM exit保存了VM-entry中断信息和VM-entry异常错误码域的信息到IDT-vectoring信息和IDT-vectoring错误码域.
6. 载入MSRs
VM entry会从VM entry的MSR-load区域载入MSRs
MSR-load区域的每个entry以bit31:0和bit127:64指定的顺序处理
部分情况发生时,对任何一个entry的处理都会失败(26.4)
如果任何一个entry处理失败,VM entry就会失败
如果失败,处理器会从host-state 区域载入状态
5. 载入Guest State
处理器状态在VM entries时以3种方式更新
部分状态从Guest-State Area载入
部分状态由VM Entry controls决定
页目录指针基于特定控制寄存器载入
载入顺序不确定,且与VMCS内容的同时进行
载入Guest控制寄存器、Debug寄存器、MSRs
载入Guest 段寄存器和描述符表寄存器
载入Guest RIP、RSP和RFLAGS
载入PDPTE
更新非寄存器域(non-register state)
清除地址范围监视
4. 检查Guest State
如果上面的检查都通过了, 以下操作会同时执行
检查VMCS的guest-state域,确保VM entry结束后, 逻辑核的状态域IA-32和Intel 64 架构一致
从guest-state area载入处理器状态或直接由VM-entry control指定
地址范围监视被清除
检查控制寄存器,debug寄存器,MSRs
对特定域或特定位的设置检查
检查Guest段寄存器
涉及段guest的段寄存器和模式等
检查Guest描述符表寄存器
对IDTR和GDTR的检查
检查Guest RIP和RFLAGS
检查Guest Non-Register 状态
检查对应于non-Register状态的guest状态域
检查Guest PDPTE(page-directory-pointer-table entries) 页目录指针表条目
3. VMX controls和host-state区域检查
VMX Controls的检查
VM-Execution Controls Fileds
VM-Exit Control Fields
VM-Entry Control Fields
Host Control Registers和MSRs
Host Segment和描述符表Registers
地址空间尺寸的相关检查
2. 基础检查
如果逻辑核在virtual-8086或者兼容模式,就会产生一个invalid-opcode异常
如果CPL !=0,会产生一个#GP异常
如果没有Current VMCS,RFlags.CF会置1,并且control传递到下一条指令上
如果存在Current VMCS,但是是一个shadow VMCS,RFlags.CF会置1 ,并且control传递到下一条指令上
如果存在Current VMCS且该VMCS不是shadow VMCS, 以下情况会按顺序评估,每个都会导致VM entry失败
1. 如果存在MOV-SS阻塞
2. 如果VM entry是通过VMLAUNCH唤醒 但VMCS的launch state不是clear
3. 如果VM entry是通过VMRESUME唤醒,但 VMCS的launch state不是launched
如果这些任何一项检查失败,RFLAGS.ZF就会被置1,并且control传递到下一个指令上; 错误码存储在VM-instruction error field中