本文只是學習此視頻後的一些總結 不當之處還請指出
視頻作者:小寶來了
視頻連接:http://bbs.pediy.com/showthread.php?t=211973
約定:
本文中出現的名詞
虛擬機 客戶機 GUEST 都是被監控的操作系統或應用程序
宿主機 HOST Hypervisor都是指監控虛擬機的“原”操作系統
VMM:當客戶機發生退出事件時,進入的就是VMM
VM:當客戶機正常運行時就是VM
VMM監控VM
1.什麼是虛擬機?
自己的理解是:運行在Hypervisor監控下的系統爲虛擬機
以下內容摘自看雪論壇兩個大牛
首先要說一下VMM(Virtual Machine Monitor),這個是虛擬機的監控器,監控着虛擬機的運行。比如虛擬機想執行一條指令:cpuid,這個時候被VMM捕捉到,然後VMM去模擬執行這條指令(模擬執行的意思是按我們自己的意願去執行),然後返回給虛擬機,完成了一次vm exit。因爲VMM需要執行ring0的指令,所以VMM需要運行在ring0下。
而VT使得CPU進入了一個全新的特殊模式(VMX模式),在這個模式下,CPU可以處於VMX root狀態或者VMX non-root狀態。處於VMX non-root操作狀態下的CPU行爲受到了某些方面的限制,關鍵的共享資源必須運行於VMX root操作狀態的監控器的控制之下,並且,對於VMX non-root狀態中的任何CPU特權都有效(只要處於VMX non-root狀態,ring0 - ring3 都被監控)。因此,將VMM運行於VMX root操作狀態,可以輕鬆監控管理客戶操作系統(就是安裝在虛擬機裏面的操作系統)和客戶應用程序(虛擬機裏面操作系統裏面安裝的軟件)。
----以上資料摘自看雪論壇海風月影
VT 技術方面, 因爲VT技術比較新, 如果你對VT技術還不甚明白, 請先查看intel 文檔. 中文不大好可以配合newbluepill那本書看, VT技術方面, 我使用它的下面幾個特性.
重定向中斷. 對於1號中斷, 屬於硬件中斷, 我會在windows中搜索0x20一下的中斷號給1號中斷使用. 對於3號中斷屬於軟中斷, 隨便在IDT中搜索一個空的就OK了.
MSR寄存器保護, 我在插件開啓的時候會將MSR_IA32_SYSENTER_EIP 0x176 換掉, 換成我們實現的KiFastCallEntry. 在這裏判斷是否是我們需要出來的SSDT調用, 根據不同的SSDT調用我們轉到不同的內核模塊中. (我們重定位的模塊, 或者是系統本身的模塊)
VT技術還有很多特性, 比如CR寄存器訪問, DR寄存器訪問. 本來都想用上, 但是發現, 不行. 因爲在CR寄存器訪問, 和DR寄存器訪問的時候, 我沒有辦法確定線程的運行上下文在那個進程, 線程環境中.. 所以針對Cr3的保護, 和DRx寄存器保護沒有做.
另外還有一個比較遺憾的地方是, 本來我決定要給整一個無限斷點的. 後面因爲項目擱置沒有弄. 另外一個是想寫一個類似NewBluePill的內存隱藏. 如果給臺硬件調試器, 可以試試.
----以上資料摘自看雪論壇Ddvp插件作者JoenChen
2.VT啓動流程:
詳細見:intel手冊 31.5章
VMX退出原因指示器:記錄了什麼原因導致產生退出事件的(比如觸發了CPUID)
VMCS:記錄了導致退出事件時的一些信息(寄存器同上下文)
虛擬機狀態保存區:記錄了當發生退出事件時的信息 用於恢復虛擬機的狀態或我們修改
宿主機狀態保存區:略
虛擬機運行控制域:定義虛擬機什麼情況下發生退出事件
其它省略
3.VMX相關彙編指令
VMREAD當虛擬機發生退出事件時,使用VMREAD讀取發生退出事件時的上下文
VMWRITE當虛擬機發生退出事件時,如果需要按我們的意願執行 則使用次指令修改相關參數
VMCALL一個讓虛擬機主動發生退出事件的指令用於關閉VT時
VMLAUNCH:啓動虛擬機 並將控制權交於虛擬機
VMRESUME:用於在宿主機中恢復虛擬機運行並將控制權交給虛擬機
VMXOFF:關閉虛擬機
VMXON:啓用一些VMX 指令
下一章將將檢測CPU是否支持虛擬化