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;
其詳細情況看《處理器虛擬化技術》即可,其結構如下圖