机场无聊,将这段时间逆向的Windows HyperV打算写一个系列文章出来(当然,过了这个兴趣点,就没兴趣写了),包括三块:
1.有的是网上东拼西凑的资料,有的是根据逆向,自己总结出来的原理,这个是没有官方资料的,各位仅当参考资料。
2.根据whpx机制,无需在开启VT的情况下,接管CR3的切换。
3.Window HyperV的内存穿透读写。
一种类型 1(原生)的虚拟机监控器,它运行在主机的硬件上,并管理运行在 Hyper-V 控制下的“根” Windows 操作系统。这是 Hyper-V 的核心组件,它负责创建和管理分区、虚拟 CPU、虚拟设备等,并与底层的虚拟化硬件接口(如 Intel VT-x 或 AMD SVM)进行交互。
定义了“分区”,作为主要的隔离单元,用于执行操作系统。这是 Hyper-V 中的一个基本概念,它表示一个运行在 Hyper-V 上的操作系统实例,可以是父分区(运行在主机上的 Windows Server)或子分区(运行在虚拟机上的客户机操作系统)。
一个“分区”由一些物理内存、一个或多个虚拟 CPU 和一些虚拟化的外设组成。这是 Hyper-V 中用于描述分区的属性和资源的方式,其中物理内存是分配给分区的一段连续的内存空间,虚拟 CPU 是分配给分区的一组逻辑处理器,虚拟化的外设是分配给分区的一些模拟或合成的设备,如网卡、磁盘、键盘、鼠标等。
“分区”按照一个层次结构进行组织,其中主要的父分区是“根”。这是 Hyper-V 中用于管理分区之间的关系和权限的方式,其中根分区是运行在主机上的 Windows Server,它负责创建和监控其他子分区,并与 Hyper-V 通信;子分区是运行在虚拟机上的客户机操作系统,它们只能访问自己所属的资源,并通过父分区来与 Hyper-V 通信。
一个父分区可以接收来自子分区的一些事件。这是 Hyper-V 中用于实现父子分区之间交互和协作的机制,其中子分区可以向父分区发送一些请求或通知,如创建或销毁分区、配置虚拟设备、设置内存映射等;父分区可以根据子分区发出的事件来执行相应的操作或返回相应的结果。
大部分的物理硬件访问都是在“根”分区中直通的,而大部分的硬件都是在子分区中虚拟化的。这是 Hyper-V 中用于实现硬件访问的方式,其中根分区可以直接访问主机上的物理硬件,如 CPU、内存、磁盘等,以提高性能和兼容性;子分区则只能访问由 Hyper-V 或根分区提供的虚拟化的硬件,如虚拟 CPU、虚拟内存、虚拟磁盘等,以实现隔离和保护。
从 Windows Server 2016 开始,Hyper-V 支持嵌套虚拟化。这是 Hyper-V 中的一个新特性,它允许在一个子分区中运行另一个 Hyper-V 实例,并在该 Hyper-V 实例中创建和管理更多的子分区,从而实现多层次的虚拟化。
HyperCall – 客户机操作系统用于与虚拟机监控器(Hypervisor)通信的接口。通过 VMCALL 硬件指令实现(参见 Intel 手册)。这是 Hyper-V 中用于实现父子分区之间通信的一种机制,它类似于系统调用,允许子分区向父分区发出请求,如创建或销毁分区、配置虚拟设备、设置内存映射等。VMCALL 是一种专门用于虚拟化的硬件指令,它可以将控制权从子分区转移到父分区,从而触发 HyperCall 的处理。
VMBus – 用于分区间通信的通信机制。通过“vmbus.sys”驱动中的逻辑“合成中断控制器”(SynIC)实现。这是 Hyper-V 中用于实现分区间高效数据传输的一种机制,它基于内存共享和事件通知的原理,通过一个虚拟总线来连接不同的分区,并提供一些标准化和定制化的虚拟设备协议。SynIC 是一种软件虚拟控制器,它负责接收来自硬件(在虚拟机监控器中)的中断,并正确地分发到目标分区。
SynIC – 合成中断控制器是一种软件虚拟控制器,它负责接收来自硬件(在虚拟机监控器中)的中断,并正确地分发到目标分区。这是 Hyper-V 中用于实现分区间事件通知和消息传递的一种组件,它由两部分组成:合成中断源(SINT)和合成消息传递(SMSG)。SINT 负责为每个分区提供 16 个可配置的中断源,用于接收来自其他分区或虚拟机监控器的事件通知;SMSG 负责为每个分区提供一个消息队列,用于接收来自其他分区或虚拟机监控器的消息数据。
VMMS – 虚拟机管理服务是负责管理每个虚拟机的状态的服务。它与 Hyper-V 管理控制台(使用 COM)连接,并负责为每个虚拟机生成一个 VMWP 实例。这是 Hyper-V 中用于实现虚拟机的创建、配置、启动、停止、暂停、恢复等操作的一个服务,它运行在根分区中,通过 WMI 接口与 Hyper-V 管理控制台进行交互,并通过 WinHv 驱动与虚拟机监控器进行通信。
VMWP – 虚拟机工作进程:协调虚拟机的生命周期,并负责与 VID 驱动进行通信。这是 Hyper-V 中用于实现虚拟机的运行和监控的一个进程,它运行在根分区中,由 VMMS 服务为每个虚拟机生成一个实例,并与 VID 驱动进行交互,以处理一些内存相关的事件和请求
VID - 虚拟化基础设施驱动 - 为分区提供分区管理服务、虚拟处理器管理服务和内存管理服务。这是 Hyper-V 中用于实现分区的创建、配置、销毁、运行和监控的一个驱动程序,它运行在根分区中,通过 WinHv 驱动与虚拟机监控器进行通信。
WinHv – 为根分区和子分区实现每个 HyperCall(两个不同的版本)。这是 Hyper-V 中用于实现 HyperCall 的处理的一个驱动程序,它运行在根分区中,通过虚拟化硬件接口(如 Intel VT-x 或 AMD SVM)与虚拟机监控器进行交互
WinHv 有两个不同的版本,一个是为根分区使用的,另一个是为子分区使用的。
>为根分区使用的 WinHv 驱动可以直接访问虚拟化硬件接口,而不需要经过虚拟机监控器。
>为子分区使用的 WinHv 驱动需要经过虚拟机监控器来访问虚拟化硬件接口.
Enlightenments启发式(这个就有点复杂了)
Hyper-V Enlightenments 是一些用于提高虚拟机性能和兼容性的特性,它们让 Windows 和 Hyper-V 的客户机运行在 Hyper-V 虚拟化平台上,并使用 Hyper-V 特定的功能。Hyper-V 是一种虚拟化技术,它可以在一个物理机器上运行多个虚拟机,每个虚拟机都有自己的操作系统和应用程序。
以下是 Hyper-V Enlightenments 的一些主要特性:
1、启发式内存管理(Enlightened Memory Management):Hyper-V 在虚拟机中使用一种称为“动态内存”的技术,它允许虚拟机根据需要动态分配和释放内存。这种内存管理方式能够提供更好的性能和资源利用率。Hyper-V 使用了一种称为“气球驱动程序”(Balloon Driver)的技术,它可以在虚拟机之间动态地调整内存分配,以达到最优的内存利用率。
2、启发式网络(Enlightened Networking):Hyper-V 虚拟机可以直接访问物理网络,而无需通过虚拟交换机。这种直接访问网络的方式可以提供更低的延迟和更高的网络吞吐量。Hyper-V 使用了一种称为“SR-IOV”(Single Root I/O Virtualization)的技术,它可以让虚拟机直接访问物理网络设备,而无需通过虚拟交换机。这样可以提高网络性能和安全性。
3、启发式存储(Enlightened Storage):Hyper-V 支持虚拟机中的虚拟磁盘(VHD)和虚拟固态硬盘(VHDX)。通过使用启发式存储功能,虚拟机可以利用物理存储设备的高级功能,例如 Trim 命令和数据去重。Hyper-V 支持了一种称为“直通磁盘”(Pass-through Disk)的技术,它可以让虚拟机直接访问物理磁盘或者 SAN 设备,而无需使用 VHD 或 VHDX 文件。这样可以提高存储性能和灵活性。
4、启发式计时器(Enlightened Timer):Hyper-V 虚拟机中的计时器可以通过与物理主机的时钟同步来提供更准确的时间保持。这对于需要高精度计时的应用程序和服务非常重要。
5、快速一致性(Fast Consistency):Hyper-V Enlightenments 提供了一种快速的一致性机制,用于在虚拟机和宿主机之间进行数据和状态的同步。这可以减少虚拟机和宿主机之间的通信延迟,并提高虚拟机的性能。
通过启用 Hyper-V Enlightenments,虚拟机可以更好地利用物理主机的硬件资源,并获得更高的性能和效率。虚拟机操作系统和 Hyper-V 之间的协作改进了虚拟化的性能,并提供了更接近于物理机的体验。
1、检查启动选项:如果系统不是在安全模式下,并且如果虚拟机监控器启动类型设置为自动,那么就启动虚拟机监控器设置的第 0 阶段。这是 Hyper-V 启动过程的第一步,它由 Windows 启动加载程序(Winload)执行,用于检测系统是否需要启动虚拟机监控器,并进行一些准备工作,如分配内存、设置页表、加载虚拟机监控器镜像等。
2、HvLoader 是负责检测合适的硬件,验证其能力,并将合适的 Hyper-V 镜像加载到内存中的模块。这是 Hyper-V 启动过程的第二步,它由虚拟机监控器设置的第 0 阶段执行,用于检测系统是否支持虚拟化硬件接口(如 Intel VT-x 或 AMD SVM),并根据系统的架构(如 x86 或 x64)选择合适的 Hyper-V 镜像文件(如 hvax64.exe 或 hvix64.exe),并将其加载到内存中。
3、执行控制权返回给 Winload。这是 Hyper-V 启动过程的第三步,它由 HvLoader 执行,用于将执行控制权交还给 Winload,以便 Winload 继续执行其标准的初始化工作。
4、Winload 继续其标准的初始化工作(Mm, ASLR, CI, Boot modules 等),调用 ExitBootServices UEFI API,并最终启动虚拟机监控器(OslArchHypervisorSetup 最终阶段 1)。这是 Hyper-V 启动过程的第四步,它由 Winload 执行,用于完成 Windows 内核和其他启动模块的加载和验证工作,并在退出 UEFI 启动服务后,调用 OslArchHypervisorSetup 的最终阶段 1 来正式启动虚拟机监控器。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-9-9 08:01
被学技术打豆豆编辑
,原因: