歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

從頭開始了解和使用Hypervisor(第1部分)

來源:本站整理 作者:佚名 時間:2019-12-04 TAG: 我要投稿


毫不夸張地說,學習完本文,你完全可以創建自己的虛擬環境,并且可以了解VMWare,VirtualBox,KVM和其他虛擬化軟件如何使用處理器的函數來創建虛擬環境。
Intel和AMD都在其現代CPU中支持虛擬化,Intel于2005年11月13日在奔騰4系列中推出了代號為“Vanderpool”的VT-x技術,VT-x是intel運用Virtualization虛擬化技術中的一個指令集。VT-x函數的CPU標志是“vmx”,代表虛擬機擴展。
另一方面,AMD開發了代號為“Pacifica”的第一代虛擬化擴展,并最初以AMD安全虛擬機(SVM)的形式發布,但后來以AMD Virtualization的商標銷售,縮寫為AMD-V。
虛擬機管理程序有兩種類型,類型1的管理程序稱為“裸機管理程序”或“本機”,因為它可以直接在裸機物理服務器上運行,因此類型1的管理程序可以直接訪問硬件。使用類型1虛擬機管理程序時,沒有要加載的操作系統作為虛擬機管理程序。
與類型1管理程序相反,就像其他任何應用程序一樣,類型2管理程序加載在操作系統內部。由于類型2虛擬機管理程序必須通過操作系統并由操作系統進行管理,因此類型2虛擬機管理程序(及其虛擬機)的運行效率(較慢)將低于類型1虛擬機管理程序。
關于虛擬化的更多概念是相同的,但是在VT-x和AMD-V中需要有不同的考慮。這些教程的其余部分主要關注VT-x,因為IntelCPU越來越流行,使用也越來越廣泛。在我看來,AMD在其手冊中更清晰地描述了虛擬化,但是Intel在某種程度上使讀者感到困惑,尤其是在虛擬化文件中。
虛擬機管理程序和平臺
這些概念是與平臺無關的,我的意思是你可以在Linux或Windows中輕松運行相同的代碼例程,并期望CPU產生相同的行為,但我更喜歡使用Windows,因為Windows更易于調試。在需要時提供一些Linux系統的示例。就個人而言,由于Linux內核管理#GP和其他異常之類的錯誤,并嘗試避免內核崩潰并保持系統正常運行,因此它更適合測試虛擬機管理程序或與CPU相關的任何事物。另一方面,Windows從不嘗試管理任何意外的異常,每當你不管理異常時,它都會導致藍屏死機,因此你可能會收到很多BSOD。最后,我可能(并且肯定)會犯錯誤,例如錯誤的實現或錯誤的信息。
需要的工具
安裝WDK的Visual Studio,你可以在此處獲取Windows Driver Kit(WDK)。
調試Windows和任何內核模式的最佳方法是使用Windows SDK中提供的Windbg。如果使用默認安裝選項安裝了WDK,則可能同時安裝了WDK和SDK,因此可以跳過此步驟。
你應該能夠使用Windbg調試操作系統(在本文中為Windows),更多信息請參見此處。OSR驅動程序加載器可以在這里下載,我們使用此工具將驅動程序加載到Windows計算機中。用于打印DbgPrint()結果的SysInternals調試視圖:

創建測試環境
本教程中幾乎所有代碼都必須在內核級別運行,并且你必須設置Linux內核模塊或Windows Driver Kit(WDK)模塊。由于配置VMM涉及許多匯編代碼,因此你應該知道如何在內核項目中運行內聯匯編。在Linux中,你不需要做任何特別的事情,但在Windows中,WDK不再支持x64環境中的內聯匯編,因此,如果你以前沒有解決此問題,則可能會很難創建一個簡單的x64內聯項目,但是不用擔心,在我后面的文章中我會一一講到。
現在該創建驅動程序了!
如果你想從Windows Driver Kit(WDK)開始,則整個驅動程序是這樣的:
#include
#include
#include
extern void inline AssemblyFunc1(void);
extern void inline AssemblyFunc2(void);
VOID DrvUnload(PDRIVER_OBJECT  DriverObject);
NTSTATUS DriverEntry(PDRIVER_OBJECT  pDriverObject, PUNICODE_STRING  pRegistryPath);
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, Example_Unload)
NTSTATUS DriverEntry(PDRIVER_OBJECT  pDriverObject, PUNICODE_STRING  pRegistryPath)
{
 NTSTATUS NtStatus = STATUS_SUCCESS;
 UINT64 uiIndex = 0;
 PDEVICE_OBJECT pDeviceObject = NULL;
 UNICODE_STRING usDriverName, usDosDeviceName;
 DbgPrint("DriverEntry Called.");
 RtlInitUnicodeString(&usDriverName, L"\Device\MyHypervisor");
 RtlInitUnicodeString(&usDosDeviceName, L"\DosDevices\MyHypervisor");
 NtStatus = IoCreateDevice(pDriverObject, 0, &usDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject);
 if (NtStatus == STATUS_SUCCESS)
 {
  pDriverObject->DriverUnload = DrvUnload;
  pDeviceObject->Flags |= IO_TYPE_DEVICE;
  pDeviceObject->Flags &= (~DO_DEVICE_INITIALIZING);
  IoCreateSymbolicLink(&usDosDeviceName, &usDriverName);
 }
 return NtStatus;
}
VOID DrvUnload(PDRIVER_OBJECT  DriverObject)

[1] [2] [3] [4] [5] [6]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 哪个app有捕鸟达人 甘肃今日快三开奖结果 31选7 山东黄金股票股吧 友玩广西棋牌游戏下载 武汉麻将七皮四赖规则 山西体彩泳坛夺金 青海11选5*结果 一定牛江苏十一选五 足球比分901008足球比分90 六台宝典图库免费资料 熊猫棋牌官方下载送金币 山东群英会破解软件 重庆幸运农场规则介绍 艾瑞亚·阿勒里 股票技术论坛