
Rusty Hypervisor - RustによるWindows UEFI Blue Pill Type-1ハイパーバイザー(コードネーム: Illusion)
ブログ: https://memn0ps.github.io/hypervisors-for-memory-introspection-and-reverse-engineering/
軽量でメモリセーフ、そして驚異的に高速なRustベースのIntel VT-x向けフックを備えたtype-1リサーチハイパーバイザであり、仮想化のコアコンセプトの研究に焦点を当てています。
注: Illusionハイパーバイザ (Windows UEFI Blue Pill Type-1ハイパーバイザ in Rust) はより安定しており、より多くの機能をサポートし、全体的により優れた設計となっています。Matrixハイパーバイザ (Windows Kernel Blue Pill Type-2ハイパーバイザ in Rust) はより古い実験的なバージョンであり、本番環境での使用を意図したものではありません。両プロジェクトは、人々がRustでのハイパーバイザ開発を始める手助けをするテンプレートとして機能します。
ページング: x64仮想アドレスから物理アドレスへの変換
この図は、従来のページングシステムにおけるx64仮想アドレスから物理アドレスへの変換の仕組みを示しています。x64アーキテクチャでは、この変換には4つのレベルのページテーブルが関与します: PML4、PDPT、PDT、およびPT (Page Map Level 4、Page Directory Pointer Table、Page Directory Table、およびPage Table) です。各レベルは仮想アドレスの9ビットを使用して次のレベルをインデックスし、最終的にRAM内の特定の物理アドレスを指します。このプロセスはオペレーティングシステムとメモリ管理ユニット (MMU) によって管理され、ソフトウェアが使用する仮想アドレスをハードウェアが使用する物理アドレスに変換します。

図1: x64仮想アドレス変換 (Full Credits: Guided Hacking)
Extended Page Tables (EPT): 第2レベルアドレス変換 (SLAT)
Extended Page Tables (EPT) は、Intel VT-xやAMD-VのNested Page Tables (NPT) などのハードウェア支援仮想化技術の機能です。EPTは第2レベルアドレス変換 (SLAT) を実装し、特に仮想化環境向けに設計されています。従来のページングがゲストOS内で仮想アドレスを物理アドレスに変換するのに対し、EPTはゲストOSが使用するゲスト物理アドレスをハイパーバイザが使用するホスト物理アドレスに変換する追加のレイヤーを加えます。この第2の変換レイヤーはハイパーバイザによって管理され、ゲストオペレーティングシステムが自身のページテーブルを独立して管理できるようにします。SLATはメモリ操作中のVM exitの必要性を最小限に抑えることでパフォーマンスを向上させ、オーバーヘッドを削減し仮想化効率を高めます。
以下の図は、Rustで書かれたWindows UEFI Blue Pill Type-1ハイパーバイザ (コードネーム: Illusion) に隠しEPTフックを実装する方法を示しています。

図2: Extended Page Tables (EPT) フック (Illusion)
ExceptionOrNmi (#GP, #PF, #BP, #UD) (0)、InitSignal (3)、StartupIpi (4)、Cpuid (10)、Getsec (11)、Hlt (12)、Invd (13)、Vmcall (18)、Vmclear (19)、Vmlaunch (20)、Vmptrld (21)、Vmptrst (22)、Vmresume (24)、Vmxon (27)、Vmxoff (26)、ControlRegisterAccesses (28)、Rdmsr (31)、Wrmsr (32)、MonitorTrapFlag (37)、Rdtsc (49)、EptViolation (48)、EptMisconfiguration (50)、Invept (53)、Invvpid (55)、Xsetbv (55)。UNUSABLEとしてマークするようUEFIメモリマップを変更)。cargo install cargo-make。cargo make build-debug。cargo make build-release。cargo make run-debug。cargo make run-release。bcdedit.exe /set testsigning onでテスト署名を有効化します。bcdedit.exe /bootdebug {bootmgr} on
bcdedit.exe /bootdebug on
bcdedit.exe /debug on
bcdedit.exe /dbgsettings net hostip:w.x.y.z port:n。UEFI ブルーピルハイパーバイザーは、以下の条件で動作します:
この UEFI ハイパーバイザーをセットアップする際は、システムの論理プロセッサ/コア/スレッド数に応じてファイルを設定することが重要です。global_const.rs 内の該当するコードを編集してください。
グローバルヒープアロケータはすべてのプロセッサ/コア/スレッドで共有され、事前に割り当てられたメモリプールです。スタックサイズはプロセッサ/コア/スレッドごとに割り当てられます。この設計により、特に事前に割り当てられたバッファを必要とするフックの設定などのタスクにおいて、メモリ割り当ての追跡が容易になります。このファイルの設定を調整することで、最適なパフォーマンスとリソース管理を維持しながら、すべてのプロセッサに対応する十分なメモリが割り当てられることを保証できます。
起動用の仮想 USB ドライブを作成する
管理者として以下の PowerShell スクリプトを実行し、USB ドライブに新しいパーティションを作成して FAT32 でフォーマットします。このスクリプトは既存のパーティションを 512 MB 縮小し、USB ドライブに「Hypervisor」というラベルの新しいパーティションを作成します。環境に応じてドライブレターを変更してください。あるいは、物理 USB ドライブを使用することもできます。
# Define the size to shrink in MB
$sizeToShrinkMB = 512
# Define the drive letter of the existing partition to shrink
$existingDriveLetter = "C"
# Define the drive letter and label for the new partition
$newDriveLetter = "D"
$newFileSystemLabel = "Hypervisor"
# Shrink the existing partition
$volume = Get-Volume -DriveLetter $existingDriveLetter
$partition = $volume | Get-Partition
Resize-Partition -DriveLetter $partition.DriveLetter -Size ($partition.Size - ($sizeToShrinkMB * 1MB))
# Create a new partition in the unallocated space
$disk = Get-Disk -Number $partition.DiskNumber
$newPartition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -DriveLetter $newDriveLetter
# Format the new partition
Format-Volume -DriveLetter $newDriveLetter -FileSystem FAT32 -NewFileSystemLabel $newFileSystemLabel
Write-Output "Partition created and formatted successfully."
VMware Workstation のセットアップ