
Минимальный гипервизор Intel VT-x для Windows и UEFI, который виртуализирует работающий хост для интроспекции, поддерживая динамический hyperjacking, unhyperjacking, EPT и VPID.
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. Однако обратите внимание, что она не имеет надёжной поддержки MP-сред из-за проблем с UEFI, и что загрузка операционной системы в конечном итоге приведёт к сбою, поскольку ОС столкнётся с нереализованными путями кода из-за своей реконфигурации ресурсов процессора. Виртуализация всей загрузки операционной системы из UEFI выходит за рамки проекта.
SimpleVisor можно собрать с помощью Visual Studio 2015 Update 3, и хотя более старые/новые компиляторы не тестировались и не поддерживаются, вполне вероятно, что они также смогут собрать проект. Однако важно сохранить различные настройки компилятора и компоновщика такими, как вы их видите.
В настоящее время SimpleVisor успешно протестирован на следующих платформах:
На данный момент он не тестировался на Bochs, но нет причин, по которым SimpleVisor не мог бы работать и в такой среде. Однако, если ваша машина уже работает под гипервизором, таким как Hyper-V или Xen, SimpleVisor не загрузится.
Имейте в виду, что x86-версии Windows явно не поддерживаются, как и процессоры более ранние, чем микроархитектура Nehalem, а также Windows 7. Поддержку последних двух легко добавить, и она существует в некоторых форках.
Слишком многие проекты гипервизоров либо чрезвычайно сложны ([Xen][1], KVM, VirtualBox) и/или закрыты (VMware, Hyper-V), а также сильно ориентированы на разработку или системы на базе Linux. Кроме того, большинство из них (кроме Hyper-V) явно созданы для обеспечения выполнения виртуальных машин, а не для виртуализации живой, работающей системы с целью выполнения интроспекции или других задач, связанных с безопасностью.
Однако несколько проектов выделяются из общей массы, например, оригинальный [Blue Pill][2] от Джоанны, или такие проекты, как [VirtDbg][3] и [HyperDbg][4]. К сожалению, большинство из них к настоящему времени стали довольно старыми, а некоторые работают только на x86-процессорах и не поддерживают более новые операционные системы, такие как Windows 10. Другой довольно простой пример, в некоторых аспектах похожий на Blue Pill, но фактически представляющий хороший пример использования EPT для "Split-TLB" — это [MoRE][7] от Jacob Torrey/AIS.
Ближайший проект, который действительно представляет ориентированный на Windows, современный и поддерживаемый гипервизор — это [HyperPlatform][5], и мы настоятельно рекомендуем его в качестве отправной точки для более широко применимой исследовательской разработки гипервизоров. Однако, пытаясь создать универсальную "платформу", которая была бы более широко надёжной, HyperPlatform также страдает от некоторой раздутости, что затрудняет понимание того, каковы действительно базовые потребности гипервизора и как его инициализировать. В том же духе, с такой же любовью к STL/C++, но также включая загрузчик ELF и поддержку UEFI/Linux наряду с модульными тестами и ещё большей надёжностью, — это [Bareflank][8], также от AIS. За пределами этого вы, вероятно, уже переходите к сложности уровня Xen.
Явная цель этого проекта, как указано выше, состояла в том, чтобы минимизировать код любым возможным способом, не вызывая негативных побочных эффектов, и сосредоточиться на потребностях "bare-metal". Это включает:
Ещё одной подразумеваемой целью была поддержка самых последних аппаратных функций, поскольку даже [Bochs][6] не всегда имеет самые последние инструкции и/или определения Intel VMX. Они часто встречаются в заголовочных файлах, таких как "vmcs.h" и "vmx.h", которые различные проекты имеют с разным уровнем полноты. Например, Xen master имеет некоторые невыпущенные причины VM Exit, но не некоторые выпущенные, которые есть у Bochs, хотя у него нет невыпущенных! Один из таких примеров — использование 1GB EPT-записей, которые, например, VMWare не виртуализирует корректно.
Наконец, SimpleVisor задуман как образовательный инструмент — он содержит исчерпывающие комментарии, объясняющие всю логику каждой строки кода, и конкретные советы и приёмы по Windows или Intel VMX, позволяющие достичь желаемого результата. Различные ошибки или плохо документированные поведения явно отмечаются.
Поскольку x64 Windows требует подписи всех драйверов, вы должны выполнить testsign бинарного файла SimpleVisor. Файл проекта Visual Studio можно настроить для этого, используя параметры "Driver Signing" и включив "Test Sign" с вашим собственным сертификатом. Из интерфейса вы также можете сгенерировать свой собственный.