SimpleVisor 是一个简单、可移植、专用于 Intel x64/EM64T VT-x 的虚拟机监控程序,其有两个明确目标:使用最少的汇编代码(10 行),并拥有最少的 VMX 相关代码以支持动态 hyperjacking 和 unhyperjacking(即在宿主内部虚拟化宿主状态),同时支持 EPT 和 VPID 等高级功能。它目前可在 Windows 和 UEFI 环境中运行。
你是否一直好奇如何构建一个虚拟机监控程序?Intel 的文档(数百页之多)是否让你感到沮丧?你在线找到的示例是否只是让事情变得更加混乱,或者需要花费数周时间阅读成千上万行代码?如果是这样,SimpleVisor 可能就是适合你的项目。
不计解释每一行代码的详尽注释,以及特定的 Windows 相关或 Intel 相关的特殊之处,SimpleVisor 大约只有 500 行 C 代码和 10 行 x64 汇编代码,同时具备在每一个近期版本的 64 位 Windows 上运行的能力,并支持运行时动态加载/卸载。
此外,SimpleVisor 利用一个轻量级的 OS 库来实现 Windows 特定功能,将虚拟机监控程序部分与 Windows 特定部分分离。借助这种可移植设计,现在还提供了 SimpleVisor 的 UEFI 版本。但请注意,由于 UEFI 的问题,它并不具备对 MP 环境的稳健支持,并且加载操作系统最终会导致崩溃,因为操作系统会因其对处理器资源的重新配置而进入未实现的代码路径。从 UEFI 虚拟化操作系统的整个启动过程超出了本项目范围。
SimpleVisor 可以使用 Visual Studio 2015 Update 3 构建,虽然较旧/较新的编译器尚未测试且不受支持,但它们很可能也能构建该项目。不过,保持你所看到的各种编译器和链接器设置不变非常重要。
SimpleVisor 目前已在以下平台上成功测试:
目前,它尚未在 Bochs 上测试,但没有理由 SimpleVisor 不能在这样的环境中运行。但是,如果你的机器已经运行在 Hyper-V 或 Xen 等虚拟机监控程序之下,SimpleVisor 将无法加载。
请记住,x86 版本的 Windows 明确不受支持,早于 Nehalem 微架构的处理器也不受支持,Windows 7 同样不受支持。后两者的支持很容易添加,并且存在于某些分支中。
现有太多虚拟机监控程序项目要么极其复杂(Xen、KVM、VirtualBox)和/或闭源(VMware、Hyper-V),并且严重偏向基于 Linux 的开发或系统。此外,它们中的大多数(除 Hyper-V 外)明确是为了支持虚拟机执行而构建的,而不是为了虚拟化一个正在运行的实时系统,以便对其执行内省或其他安全相关任务。
不过,有几个项目确实脱颖而出,例如 Joanna 最初的 Blue Pill,或 VirtDbg 和 HyperDbg 等项目。遗憾的是,这些项目中的大多数如今已经相当陈旧,有些只能在 x86 处理器上运行,并且不支持 Windows 10 等较新的操作系统。另一个相当简单的示例,在某些方面与 Blue Pill 类似,但实际上很好地展示了 EPT 用于“Split-TLB”的用法,是来自 Jacob Torrey/AIS 的 MoRE。
实际上最接近提供一个以 Windows 为中心、现代且受支持的虚拟机监控程序的项目是 HyperPlatform,我们强烈推荐将其作为更广泛可用的研究型虚拟机监控程序开发的起点。然而,在尝试创建一个更广泛稳健的通用“平台”时,HyperPlatform 也遭受了一定程度的臃肿,使其更难理解虚拟机监控程序真正的基本需求是什么,以及如何初始化一个虚拟机监控程序。类似地,同样热爱 STL/C++,但还包含 ELF 加载器和 UEFI/Linux 支持,并带有单元测试和更高稳健性的是同样来自 AIS 的 Bareflank。除此之外,你可能就进入了 Xen 级别的复杂性。
如上所述,本项目的明确目标是以任何可能的方式最小化代码,同时不造成负面副作用,并专注于“裸机”需求。这包括:
另一个隐含目标是支持最新的硬件功能,因为即使 Bochs 也并不总是拥有最新的 Intel VMX 指令和/或定义。这些通常出现在诸如 "vmcs.h" 和 "vmx.h" 之类的头文件中,不同项目对这些头文件有不同程度的定义。例如,Xen master 有一些未发布的 VM Exit 原因,但没有某些已发布的原因,而 Bochs 有这些已发布的原因,尽管它没有未发布的原因!其中一个例子是使用 1GB EPT 项,例如 VMWare 无法正确虚拟化这一点。
最后,SimpleVisor 旨在成为一个教育工具——它包含详尽注释,解释每一行代码背后的所有逻辑,以及使其能够实现预期结果的特定 Windows 或 Intel VMX 提示和技巧。各种错误或文档记录不佳的行为都被明确指出。
由于 x64 Windows 要求所有驱动程序都必须签名,因此你必须对 SimpleVisor 二进制文件进行测试签名。可以通过使用“Driver Signing”选项并启用“Test Sign”以及你自己的证书来设置 Visual Studio 项目文件以完成此操作。你也可以从 UI 中生成自己的证书。
其次,你必须在机器上启用测试签名模式。为此,首先启动进入 UEFI 以关闭“Secure Boot”,否则无法启用测试签名模式。或者,如果你拥有有效的 KMCS 证书,也可以对驱动程序进行“Production Sign”以避免此要求。
要设置测试签名模式,可以使用以下命令:
bcdedit /set testsigning on
重启后,你可以使用以下命令在注册表中为 SimpleVisor 设置所需的服务控制管理器项:
sc create simplevisor type= kernel binPath= "<PATH_TO_SIMPLEVISOR.SYS>"
然后你可以使用以下命令启动 SimpleVisor
sc start simplevisor
并使用以下命令停止它
sc stop simplevisor
使用这些命令中的任何一个都必须具有管理员权限。
如果你想进一步了解我的研究或工作,我邀请你访问我的博客 http://www.alex-ionescu.com,以及我的培训与咨询公司 Winsider Seminars & Solutions Inc.,网址为 http://www.windows-internals.com。
https://github.com/upring/virtdbg
http://xenbits.xen.org/gitweb/?p=xen.git;a=summary
https://github.com/svn2github/bochs
https://github.com/rmusser01/hyperdbg
http://invisiblethingslab.com/resources/bh07/nbp-0.32-public.zip
https://github.com/tandasat/HyperPlatform
https://github.com/ainfosec/MoRE
https://github.com/Bareflank/hypervisor
SimpleVisor 旨在最小化代码大小和复杂性——这确实以稳健性为代价。例如,尽管 SimpleVisor 执行的许多 VMX 操作“应该”永远不会失败,但总会有未知原因,例如内存损坏、CPU 勘误、无效的宿主 OS 状态以及潜在错误,可能导致某些操作失败。对于真正稳健的商业级软件,必须考虑这些可能性,并且必须添加错误处理、异常处理和检查来支持它们。此外,现存的大量 BIOS,以及不同的 CPU 和芯片组迭代,都可能各自具有必须检查的特定不兼容性或变通方法。SimpleVisor 不进行任何此类错误检查、验证和异常处理。它不是为生产使用而设计的稳健软件,而是一个参考代码库。
Copyright 2016 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.