日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Intel VT学习笔记(九)—— EPT应用示例

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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应用示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。