ionescu007/SimpleVisor
GitHub: ionescu007/SimpleVisor
SimpleVisor 是一个极简的 Intel VT-x 教育型 Hypervisor,用约 500 行 C 代码演示运行时动态虚拟化宿主机的核心技术。
Stars: 1927 | Forks: 281
# SimpleVisor
SimpleVisor 是一个简单、便携、针对 Intel x64/EM64T VT-x 的 Hypervisor,它有两个特定目标:使用最少的汇编代码(10 行),以及拥有最少的 VMX 相关代码来支持动态 hyperjacking 和 unhyperjacking(即在宿主机内部虚拟化宿主机状态),同时支持 EPT 和 VPID 等高级功能。它目前可以在 Windows 和 UEFI 环境中运行。
## 简介
你是否一直对如何构建 Hypervisor 感到好奇?Intel 的文档(数百页之多)是否让你感到沮丧?你在网上找到的示例是否让你更加困惑,或者需要花费数周时间阅读数万行代码?如果是这样,SimpleVisor 可能就是适合你的项目。
除去解释每一行代码以及特定于 Windows 或 Intel 特性的详尽注释外,SimpleVisor 仅包含约 500 行 C 代码和 10 行 x64 汇编代码,同时具备在所有最新版本 64 位 Windows 上运行的能力,并支持运行时动态加载/卸载。
此外,SimpleVisor 利用了一个轻量级 OS 库来处理 Windows 特定功能,将 Hypervisor 部分与 Windows 特定部分分离。利用这种可移植设计,现在还提供了 SimpleVisor 的 UEFI 版本。但请注意,由于 UEFI 的问题,它对 MP(多处理器)环境的支持并不稳健,并且加载操作系统最终会导致崩溃,因为操作系统在重新配置处理器资源时会触发生码路径。从 UEFI 虚拟化整个操作系统的启动过程超出了本项目的范围。
SimpleVisor 可以使用 Visual Studio 2015 Update 3 构建,虽然尚未测试也不支持较旧/较新的编译器,但它们很可能也能构建该项目。但是,重要的是保持你所看到的各种编译器和链接器设置不变。
SimpleVisor 目前已在以下平台上成功测试:
* Haswell 处理器上的 Windows 8.1(定制台式机)
* Sandy Bridge 处理器上的 Windows 10 Redstone 1(Samsung 930 笔记本电脑)
* Skylake 处理器上的 Windows 10 Threshold 2/Redstone 1(Surface Pro 4 平板电脑)
* Skylake 处理器上的 Windows 10 Threshold 2(Dell Inspiron 11-3153 w/ SGX)
* VMWare Workstation 11,但不支持 EPT(VMWare 不支持 1GB EPT)
* Asus Maximus VII Extreme 主板上的 UEFI 2.4(定制台式机)
目前,它尚未在 Bochs 上进行测试,但没有理由认为 SimpleVisor 不能在这样的环境中运行。但是,如果你的机器已经在 Hyper-V 或 Xen 等 Hypervisor 下运行,SimpleVisor 将无法加载。
请记住,明确不支持 x86 版本的 Windows、Nehalem 微架构之前的处理器以及 Windows 7。对后两者的支持很容易添加,并且存在于某些分支中。
## 动机
现有的 Hypervisor 项目要么极其复杂([Xen][1]、KVM、VirtualBox),要么是闭源的(VMware、Hyper-V),并且严重侧重于基于 Linux 的开发或系统。此外,它们中的大多数(Hyper-V 除外)明确是为了执行虚拟机而构建的,而不是为了虚拟化实时运行的系统,以便对其执行自省或其他安全相关任务。
然而,有几个项目确实脱颖而出,例如 Joanna 的原始 [Blue Pill][2],或者 [VirtDbg][3] 和 [HyperDbg][4] 等项目。不幸的是,其中大多数现在已相当陈旧,有些仅在 x86 处理器上运行,不支持 Windows 10 等较新的操作系统。另一个相当简单的示例在某些方面与 Blue Pill 类似,但实际上为 "Split-TLB" 提供了 EPT 使用的良好示例,它是来自 Jacob Torrey/AIS 的 [MoRE][7]。
真正提供一个以 Windows 为中心、现代化且受支持的 Hypervisor 的最接近项目是 [HyperPlatform][5],我们强烈建议将其作为更广泛可用研究型 Hypervisor 开发的起点。然而,在试图创建一个更广泛稳健的通用“平台”时,HyperPlatform 也存在一些臃肿,使得更难理解 Hypervisor 的真正基本需求以及如何初始化它。类似地,同样显示出对 STL/C++ 的热爱,但也包括 ELF 加载器和 UEFI/Linux 支持以及单元测试和更高稳健性的是同样来自 AIS 的 [Bareflank][8]。除此之外,你可能就要进入 Xen 级别的复杂性了。
如上所述,本项目的明确目标是在不产生负面影响的情况下,以任何可能的方式最小化代码,并专注于“裸机”需求。这包括:
* 最小化汇编代码的使用。如果不是因为缺少 `__lgdt` 内置函数,以及需要针对 Windows API 行为的变通方法,Hypervisor 入口点的前 4 条指令将是唯一需要汇编的部分。目前,该项目总共有 10 条指令,分布在 3 个函数中。这与通常有数百行汇编代码的其他 Hypervisor 项目截然不同。使用各种特定于 OS 的技巧和编译器快捷方式来实现此结果。
* 减少对不太可能发生的错误的检查。给定配置正确且受信任的输入数据集,诸如 `vmx_vmwrite` 和 `vmx_vmread` 之类的指令应该永远不会失败。
* 移除对 x86 的支持,这会使事情复杂化并导致针对 64 位字段的特殊处理。
* 明确将所有可能的 VM-Exit 减少到 Intel 架构定义的最低限度(CPUID、INVD、VMX 指令和 XSETBV)。这样做是有目的的,以保持 Hypervisor 尽可能小,以及初始化代码尽可能小。
* 不支持 VMCALL。许多 Hypervisor 使用 VMCALL 作为退出 Hypervisor 的方式,这需要汇编编程(没有内置函数)和额外的退出处理。SimpleVisor 改用 CPUID 陷阱。
* 依靠鲜为人知的 OS 函数来简化 Hypervisor 的开发,例如 Windows 上的通用 DPC 和休眠上下文,或 UEFI 上的 PI MP 协议。
* 以非常简单的方式支持 EPT/VPID,以展示该功能最简单实现的坚实基础。
* 特定于 OS 的例程的可移植性和隔离性。
另一个隐含目标是支持最新的硬件功能,因为即使是 [Bochs][6] 也不总是拥有最新的 Intel VMX 指令和/或定义。这些通常在头文件(如 "vmcs.h" 和 "vmx.h")中找到,各种项目有不同级别的定义。例如,Xen master 有一些未发布的 VM Exit 原因,但没有某些已发布的原因,而 Bochs 有已发布的原因,但没有未发布的原因!一个这样的例子是 1GB EPT 条目的使用,例如 VMWare 无法正确虚拟化它。
最后,SimpleVisor 旨在成为一个教育工具——它有详尽的注释,解释每行代码背后的所有逻辑,以及使其能够实现预期结果的特定 Windows 或 Intel VMX 技巧。各种错误或记录不完整的行为被明确指出。
## Windows 上的安装
由于 x64 Windows 要求所有驱动程序都必须签名,因此你必须对 SimpleVisor 二进制文件进行测试签名。可以通过使用“驱动程序签名”选项并使用你自己的证书启用“测试签名”来设置 Visual Studio 项目文件。你还可以从 UI 生成自己的证书。
其次,你必须在你的机器上启用测试签名模式。为此,首先启动到 UEFI 以关闭“安全启动”,否则无法启用测试签名模式。或者,如果你拥有有效的 KMCS 证书,你可以对驱动程序进行“生产签名”以避免此要求。
要设置测试签名模式,可以使用以下命令:
```bcdedit /set testsigning on```
重启后,你可以使用以下命令在注册表中为 SimpleVisor 设置所需的 Service Control Manager 条目:
```sc create simplevisor type= kernel binPath= ""```
然后你可以使用以下命令启动 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 勘误表、无效的宿主操作系统状态和潜在错误,这可能导致某些操作失败。对于真正稳健的商业级软件,必须考虑这些可能性,并且必须添加错误处理、异常处理和检查来支持它们。此外,大量的 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.
```
标签:EDK2, EPT, Hyperjacking, Hypervisor, Intel VT-x, Intel架构, Rootkit, UEFI, Visual Studio, VMX, VPID, Windows内核, x64汇编, Zeek, 客户端加密, 教育项目, 白帽子, 系统底层, 虚拟化, 虚拟化安全, 虚拟机扩展