
Rusty Hypervisor - Rust로 구현된 Windows UEFI 블루 필 Type-1 하이퍼바이저 (코드명: Illusion)
블로그: https://memn0ps.github.io/hypervisors-for-memory-introspection-and-reverse-engineering/
Intel VT-x용 훅을 갖춘 경량의 메모리 안전하고 매우 빠른 Rust 기반 type-1 연구용 하이퍼바이저로, 가상화의 핵심 개념을 연구하는 데 초점을 맞추고 있습니다.
참고: Illusion 하이퍼바이저(Rust로 구현된 Windows UEFI Blue Pill Type-1 하이퍼바이저)가 더 안정적이고, 더 많은 기능을 지원하며, 전반적으로 더 나은 설계를 갖추고 있습니다. Matrix 하이퍼바이저(Rust로 구현된 Windows Kernel Blue Pill Type-2 하이퍼바이저)는 더 오래된 실험적 버전이며 프로덕션 용도로 사용하기 위한 것이 아닙니다. 두 프로젝트 모두 사람들이 Rust로 하이퍼바이저 개발을 시작할 수 있도록 돕기 위한 템플릿 역할을 합니다.
페이징: x64 가상 주소를 물리 주소로 변환하기
이 다이어그램은 전통적인 페이징 시스템에서 x64 가상 주소를 물리 주소로 변환하는 메커니즘을 보여줍니다. x64 아키텍처에서 이 변환은 PML4, PDPT, PDT, PT(Page Map Level 4, Page Directory Pointer Table, Page Directory Table, Page Table)의 네 단계 페이지 테이블을 포함합니다. 각 단계는 가상 주소의 9비트를 사용하여 다음 단계를 인덱싱하며, 궁극적으로 RAM의 특정 물리 주소를 가리킵니다. 이 과정은 운영체제와 MMU(Memory Management Unit)에 의해 관리되며, MMU는 소프트웨어가 사용하는 가상 주소를 하드웨어가 사용하는 물리 주소로 변환합니다.

그림 1: x64 가상 주소 변환 (전체 크레딧: Guided Hacking)
확장 페이지 테이블(EPT): 2단계 주소 변환(SLAT)
확장 페이지 테이블(EPT)은 Intel VT-x 및 AMD-V의 Nested Page Tables(NPT)와 같은 하드웨어 지원 가상화 기술의 기능입니다. EPT는 가상화 환경을 위해 특별히 설계된 2단계 주소 변환(SLAT)을 구현합니다. 전통적인 페이징이 게스트 OS 내에서 가상 주소를 물리 주소로 변환하는 반면, EPT는 게스트 물리 주소(게스트 OS가 사용)를 호스트 물리 주소(하이퍼바이저가 사용)로 변환하는 추가 계층을 더합니다. 이 두 번째 변환 계층은 하이퍼바이저에 의해 관리되며, 게스트 운영체제가 자체 페이지 테이블을 독립적으로 관리할 수 있도록 합니다. SLAT는 메모리 작업 중 VM 종료의 필요성을 최소화하여 성능을 향상시키며, 이는 오버헤드를 줄이고 가상화 효율성을 높입니다.
아래 다이어그램은 Rust로 작성된 Windows UEFI Blue Pill Type-1 하이퍼바이저(코드명: Illusion)에서 숨겨진 EPT 훅을 구현하는 방법을 보여줍니다.

그림 2: 확장 페이지 테이블(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 설정