Intel VT学习笔记(九)—— EPT应用示例
Intel VT學習筆記(九)—— EPT應用示例
- 內存保護
- EPT violation
- 代碼實現
- 參考資料
內存保護
描述:嘗試使用EPT將一塊特定的物理內存保護起來。
先來選擇一塊物理地址,那么這里就跟周壑老師一樣,選擇「Page Fault」函數所在的物理地址。
首先使用PCHunter看一下虛擬地址是多少:
然后用WinDbg直接查看對應的物理地址:
可以看到「Page Fault」函數的物理地址是0x541450,即所屬的物理頁為0x541000。
那么,能不能讓Guest能夠執行它,但是不能夠對它讀寫呢?
這個是不能隨便設置的,需要看系統是否支持。(通過檢測IA32_VMX_EPT_VPID_CAP MSR,具體參考Intel手冊卷3附錄A.10)
只有當這個IA32_VMX_EPT_VPID_CAP MSR的第0位為1時,才支持將EPT物理頁面設置為可執行,但不可讀寫的權限(在筆者的環境中是支持的)。
代碼實現:
if (0x541000 == *ept_PT & 0xfffff000) //尋找Page Fault函數所在的物理頁 {*ept_PT &= 0xfffffff4; //去除可讀、可寫的權限 }運行結果:
此時能夠成功開啟VT,并且系統能夠正常運行。
那么來查看「Page Fault」函數的反匯編試試:
產生了一個VM-Exit事件,退出碼為0x30,對應的含義為「EPT violation」,表示EPT不允許Guest訪問該頁面。
EPT violation
描述:當EPT模式下訪問物理內存(讀、寫、執行)失敗時,會導致VM-Exit,退出碼為0x30,即EPT violation。
可以在Host中獲取具體的信息,然后進行相應的處理。
EPT violation的具體信息包含的含義如下(參考Intel開發手冊卷3表27-7):
可以通過該退出碼檢測Guest的行為,如果是讀/寫的時候,返回一個假頁面給Guest;如果是執行時,返回一個真頁面。
代碼實現
//ept.c ... ULONG64 fake_page_PA; //假頁面 ULONG64* hook_ept_PT; //用于替換頁面static void AllocateFakePage() {PVOID page = AllocateOnePage();fake_page_PA = MmGetPhysicalAddress(page).QuadPart; } ... if (0x541000 == (*ept_PT & 0xfffff000)) //尋找Page Fault函數所在的物理頁 {AllocateFakePage(); //分配一個假頁面*ept_PT &= 0xfffffff4; //真頁面去除可讀、可寫的權限hook_ept_PT = ept_PT; } ... //exithandler.c ... extern ULONG64 fake_page_PA; extern ULONG64* hook_ept_PT;void HandleEptViolation() {ULONG ExitQualification;ExitQualification = Vmx_VmRead(EXIT_QUALIFICATION);//判斷訪問權限,如果是讀/寫,就給一個假頁面,如果是執行,就給一個真頁面if (ExitQualification & 3) // 讀/寫{*hook_ept_PT = fake_page_PA | 0x33; //給假頁面,權限為讀/寫}else // 執行{*hook_ept_PT = 0x541000 | 0x34; //給真頁面,權限為執行} } ... case EXIT_REASON_EPT_VIOLATION:ExitInstructionLength = 0; //將指令長度改為0,表示不跳過指令HandleEptViolation(); //處理break; ...運行結果:
可以看到,此時讀取「Page Fault」函數的具體代碼時,返回的內容全是0,因為在讀/寫時,Host掛入了一個假頁面。
并且PCHunter將這個頁面的所有函數都認定為被Inline Hook了:
那么我們的目的也就達到了。
關于VT,筆者暫時先學習到這里,不得不說收獲了很多知識,感覺VT能做的事情遠不止如此,等有時間再深入研究一番。
參考資料
- VT虛擬化架構編寫視頻教程①~⑥課
- 周鶴《VT技術入門》系列視頻教程
- github項目:VT_Learn
- github項目: HyperPlatform
- Intel開發手冊 卷3:Chapter 23 ~ Chapter 33
- x86內部函數列表
- 科普下VT EPT
總結
以上是生活随笔為你收集整理的Intel VT学习笔记(九)—— EPT应用示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intel VT学习笔记(七)—— EP
- 下一篇: MFC类向导添加自定义消息未声明标识符的