VT MSR、CR、 Exception、#PF

Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.html

VT MSR、CR、 Exception、#PF

1. MSR寄存器讀寫攔截

    開啓虛擬機控制字段:VM-execution control[28] 置爲1時,則開啓 MSR BitMap;

  ② 開啓MSR BitMap時,我們需要申請一塊 4KB內存,作爲 MSR_BitMap,其構造如下圖:

    

  ③ 當申請好BitMap並設置好對應攔截的,使用 __vmx_vmwrite,向 MsrBitMapAddress 字段填入 MSR_BitMap的物理地址;

  ④ VM-Exit Reason 其 RDMSR 與 WRMSR 的錯誤碼分別是 31 與 32,攔截下來即可;

  ⑤ 對於這部分的處理,如果我們想走正常流暢,其指令解析如下,我們自己調用 rdmsr rcx,讀出的結果分別存儲到 rax 與 rdx 中。

     

 

2. CR3寄存器讀寫攔截

   ① VM-execution control 第 15 、16 是關於CR3讀寫攔截的;

  ② 除此之外,其還規定了 CR3_TARGE_COUNT 、CR3_TARGE_VALUE0、CR3_TARGE_VALUE1、CR3_TARGE_VALUE2、CR3_TARGE_VALUE3字段;

  ③ 其攔截規則是當其 CR3 不屬於 VALUE 0-3 時,則會產生VM-Exit,否則不會產生;

  ④ 其Exit-Reason中有相關Exit原因,重點是 EXIT_QUALIFICATION,當退出原因是CR寄存器時,其EXIT_QUALIFICATION的字段如下:

    我們根據如下信息,很好判斷其各種屬性

     

 

 3. Exception攔截

  其存在一個 Exception BitMap位,當產生異常時,其會檢查該Bitmap相關位是否值1,如果置1則產生Exit;

  比如,我們想要攔截 0xE 事件,則 EXCEPTION_BITMAP |= (1<<0xE),來將有關置位即可;

  當我們接管有關異常時,我們大概率無法自己處理,此時我們還要繼續交給操作系統來進行處理;

  因此我們要使用事件注入,將有關異常事件注入進去,讓系統自己執行。

 

4. #PF異常的處理攔截特點

  #PF異常應該是操作系統中最常見的異常,Intel VT 對其進行了拓展,其多出了 PEFC_MASK 與 PEFC_MATCH;

  簡單來說,就是當產生 #PF異常時,其會存在一個 #PF碼 - PEFC,PEFC & PEFC_MSAS == PEFC_MATCH時,會產生Exit;

  其詳細情況看《處理器虛擬化技術》即可,其結構如下圖

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章