NewBluePill的源碼也看的差不多了,一直說等有時間了再寫學習的一些心得,拖來拖去弄到現在了,時間不是等來的,慢慢開始吧。
0x00 初識硬件虛擬化
硬件虛擬化對大數人來講還是比較陌生。什么是硬件虛擬化?因為早期的虛擬機都是進程級虛擬機,也就是作為已有操作系統的一個進程,完全通過軟件的手段來模擬硬件,軟件再翻譯內存地址的方法實現物理機器的模擬,這樣虛擬效率較低,資源利用率低。之后Intel和AMD相繼推出了支持硬件虛擬化的處理器,所謂硬件虛擬化,也就是在硬件抽象層對虛擬技術提供直接支持,提高虛擬效率。我們之前提到過在進程級虛擬機中的客戶機訪問的物理地址需要經過軟件的再次轉化成真實機器的物理地址,而且也需要給不同的客戶機操作系統編寫不同的虛擬設備驅動程序從而可以共享同一真實的硬件資源。而硬件虛擬化則是實現了內存地址甚至與I/O設備的直接映射,無需經過再一次的轉換。而硬件虛擬化技術中引出了一個重要的概念——VMM(Virtual Machine Monitor),使硬件虛擬化技術產生的一個新的特權級,用來處理虛擬硬件和真實硬件的通信和一些事件的處理,因此其系統權限在操作系統之上,產生了一個新的特權級“Ring -1”。可以簡單理解為利用硬件虛擬化技術可以讓我們的代碼運行在操作系統之下,監視整個操作系統的運行。
0x01 VT與NewBluePill
VT是Intel的硬件虛擬化技術,已經流行多年,但關於VT的資料並不多。之前有大牛利用VT寫出的調試器插件可以直接無視反調試,而學習VT技術,最好的資料莫過於NewBluePill源碼http://www.invisiblethingslab.com/itl/Resources.html (以下簡稱nbp),nbp是2007年由Invisible Things Lab公布,為nbp-0.32-public版本。其中實現了一個基本的VMM,可以在操作系統運行時動態加載和卸載,在操作系統不知情的情況下將操作系統置於虛擬機中運行和內存隱藏技術。雖然nbp支持Intel和AMD虛擬化,但在我們之后分析的重點是Intel的虛擬化,也就是主要學習的是VT技術。
0x02 NewBluePill編譯及調試
nbp的源碼已經上傳到網盤中點擊下載,可自行進行下載。關於編譯環境,我的是WDK7600,VMWare+Windows 7 X64 Ultimate SP1虛擬機。對於WDK的環境配置與虛擬機的安裝就不在此進行贅述了,安裝好編譯環境之后,在WDK的Win7命令行編譯環境中(Check版本)運行nbp-0.32-public\nbp-0.32-public\build_code.cmd。
如圖所示則編譯成功,在bin目錄下生成了nbp-0.32-public\amd64\newbp.sys文件。
在虛擬機的設置中需要將虛擬化選項選中。我使用的是VMWare10。
在nbp-0.32-public\common\newbp.c文件中的DriverEntry的開始部分加上代碼,使程序運行時中斷到WinDBG調試器:
#ifdef _DEBUG CmDebugBreak(); //int 3 #endif // _DEBUG