
Hypervisor Intel VT-x minimale per Windows e UEFI che virtualizza un host live per l'introspezione, supportando hyperjacking dinamico, unhyperjacking, EPT e VPID.
SimpleVisor è un hypervisor semplice e portabile, specifico per Intel x64/EM64T VT-x, con due obiettivi precisi: utilizzare la minor quantità possibile di codice assembly (10 righe) e avere la minor quantità possibile di codice relativo a VMX per supportare l'hyperjacking e l'unhyperjacking dinamico (ovvero, virtualizzare lo stato dell'host dall'interno dell'host) supportando al contempo funzionalità avanzate come EPT e VPID. Attualmente funziona sia su Windows che in ambienti UEFI.
Sei sempre stato curioso di sapere come costruire un hypervisor? La documentazione di Intel (le molte centinaia di pagine) ti ha scoraggiato? Gli esempi che hai trovato online ti hanno solo confuso ulteriormente, o hanno richiesto settimane di lettura attraverso decine di migliaia di righe di codice? Se è così, SimpleVisor potrebbe essere il progetto che fa per te.
Senza contare gli esaustivi commenti che spiegano ogni singola riga di codice, e le specifiche idiosincrasie legate a Windows o a Intel, SimpleVisor conta circa 500 righe di codice C e 10 righe di codice assembly x64, il tutto con la capacità di funzionare su ogni versione recente di Windows a 64 bit, e supportando il caricamento/scaricamento dinamico a runtime.
Inoltre, SimpleVisor utilizza una libreria OS leggera per le funzionalità specifiche di Windows, separando le parti relative all'hypervisor da quelle specifiche di Windows. Sfruttando questo design portabile, è ora disponibile anche una versione UEFI di SimpleVisor. Nota tuttavia che non ha un supporto robusto per ambienti MP a causa di problemi con UEFI, e che il caricamento di un sistema operativo finirà per causare un crash poiché il SO incontrerà percorsi di codice non implementati a causa della sua riconfigurazione delle risorse del processore. Virtualizzare l'intero avvio del sistema operativo da UEFI è al di fuori dello scopo del progetto.
SimpleVisor può essere compilato con Visual Studio 2015 Update 3, e sebbene compilatori più vecchi/nuovi non siano stati testati e non siano supportati, è probabile che possano compilare il progetto altrettanto. È importante, tuttavia, mantenere le varie impostazioni del compilatore e del linker come le vedi.
SimpleVisor è stato attualmente testato con successo sulle seguenti piattaforme:
Al momento, non è stato testato su Bochs, ma non c'è motivo per cui SimpleVisor non possa funzionare anche in un tale ambiente. Tuttavia, se la tua macchina è già in esecuzione sotto un hypervisor come Hyper-V o Xen, SimpleVisor non si caricherà.
Tieni presente che le versioni x86 di Windows non sono espressamente supportate, né lo sono i processori precedenti alla microarchitettura Nehalem, né Windows 7. Il supporto per questi ultimi due è facile da aggiungere ed esiste in alcuni fork.
Troppi progetti di hypervisor là fuori sono estremamente complicati ([Xen][1], KVM, VirtualBox) e/o closed-source (VMware, Hyper-V), oltre che fortemente orientati allo sviluppo o ai sistemi basati su Linux. Inoltre, la maggior parte di essi (a parte Hyper-V) è espressamente costruita allo scopo di consentire l'esecuzione di macchine virtuali, e non la virtualizzazione di un sistema vivo e in esecuzione, al fine di eseguire introspezione o altre attività legate alla sicurezza su di esso.
Alcuni progetti si distinguono tuttavia dalla massa, come il [Blue Pill][2] originale di Joanna, o progetti come [VirtDbg][3] e [HyperDbg][4]. Sfortunatamente, la maggior parte di questi è ormai piuttosto datata, e alcuni funzionano solo su processori x86, e non supportano sistemi operativi più recenti come Windows 10. Un altro esempio piuttosto semplice, simile a Blue Pill per alcuni aspetti, ma che in realtà fornisce un buon esempio di utilizzo di EPT per "Split-TLB" è [MoRE][7] di Jacob Torrey/AIS.
Il progetto più vicino che fornisce effettivamente un hypervisor incentrato su Windows, moderno e supportato è [HyperPlatform][5], e raccomandiamo vivamente il suo utilizzo come punto di partenza per uno sviluppo di hypervisor di tipo ricerca più ampiamente utilizzabile. Tuttavia, nel tentativo di creare una "piattaforma" generica più ampiamente robusta, HyperPlatform soffre anche di un po' di bloat, rendendo più difficile capire quali siano veramente le esigenze di base di un hypervisor, e come inizializzarne uno. In modo simile, e mostrando un uguale amore per STL/C++, ma includendo anche un loader ELF e il supporto UEFI/Linux insieme a unit test e ancora più robustezza, c'è [Bareflank][8], sempre di AIS. Oltre a ciò, probabilmente si entra nella complessità di livello Xen.
L'obiettivo espresso di questo progetto, come affermato sopra, era minimizzare il codice in ogni modo possibile, senza causare effetti collaterali negativi, e concentrandosi sulle esigenze "bare-metal". Questo include:
Un altro obiettivo implicito era supportare le più recenti funzionalità hardware, dato che persino [Bochs][6] non ha sempre le istruzioni e/o le definizioni Intel VMX più recenti. Queste si trovano spesso in file header come "vmcs.h" e "vmx.h" che vari progetti hanno a vari livelli di definizione. Per esempio, Xen master ha alcuni motivi di VM Exit non rilasciati, ma non certi rilasciati, che Bochs ha, sebbene non abbia quelli non rilasciati! Un esempio di ciò è l'uso di voci EPT da 1GB, che per esempio VMWare non virtualizza correttamente.
Infine, SimpleVisor è pensato per essere uno strumento educativo -- ha commenti esaustivi che spiegano tutta la logica dietro ogni riga di codice, e specifici suggerimenti e trucchi su Windows o Intel VMX che gli permettono di ottenere il risultato desiderato. Vari bug o comportamenti scarsamente documentati vengono esplicitamente segnalati.