|
引子
WRK 是微軟于 2006 年針對(duì)教育和學(xué)術(shù)界開放的 Windows 內(nèi)核的部分源碼,WRK(Windows Research Kernel)也就是 Windows 研究?jī)?nèi)核,在 WRK 中不僅僅只提供了 Windows 內(nèi)核模塊的部分代碼,其還提供了編譯工具,
也就是通過這個(gè)編譯工具,你可以將你的 WRK 編譯成一個(gè) EXE 文件,也就是內(nèi)核可執(zhí)行模塊,然后你可以利用這個(gè) EXE 文件來取代操作系統(tǒng)本身的內(nèi)核,這樣的話,下次開機(jī)的時(shí)候操作系統(tǒng)所加載的內(nèi)核就是您編譯的那個(gè) EXE 了。
工具軟件
Intel x86 CPU;VMware 6.5;Windows Server 2003 SP1(用于測(cè)試 WRK 編譯結(jié)果);Windows 7(用來編譯 WRK);WRK 1.2 ;
概覽 WRK
首先我們來找到當(dāng)前 Windows 操作系統(tǒng)下的內(nèi)核模塊文件,所謂的內(nèi)核模塊文件呢,其實(shí)就可以看做是 Windows 的內(nèi)核,其由執(zhí)行體和微內(nèi)核組成,該文件名為 ntoskrnl.exe ,即一個(gè)二進(jìn)制模塊,該文件位于:C:/Windows/System32 ;
而我們的 WRK 編譯后所得的結(jié)果應(yīng)該也是一個(gè)內(nèi)核模塊文件,也就是說我們編譯所得的結(jié)果應(yīng)該就是這個(gè) ntoskrnl.exe ,當(dāng)然編譯后的名稱是可以不同的,默認(rèn)編譯所得為 wrkx86.exe (這是 x86 環(huán)境下的默認(rèn)編譯結(jié)果名稱),下面來分析 WRK 中目錄結(jié)構(gòu):
首先來看 WS03SP1HALS 目錄:
WS03SP1HALS 代表的意思即 Windows Server 2003 SP1 HALS,也就是在 Windows Server 2003 SP1 下的 HAL (硬件抽象層)。在 Windows 操作系統(tǒng)中,HAL 其實(shí)是一個(gè)獨(dú)立的 DLL (在這里你就可以簡(jiǎn)單的將 HAL 看做一個(gè) DLL) ,通過 HAL 可以實(shí)現(xiàn)隔離掉硬件的差異,也就是上層的模塊無需考慮下層真實(shí)硬件之間的差異性,因?yàn)樯蠈幽K不能夠直接訪問硬件,而是通過 HAL 來訪問硬件的,所以對(duì)于硬件的差異性,在 HAL 中即可以解決掉,而不需要上層模塊來解決,這樣做的好處是很顯然的,那就是我們的上層模塊都是一樣的,也就是當(dāng)硬件改動(dòng)時(shí)不需要變,只要提供針對(duì)不同的硬件的 HAL 即可以實(shí)現(xiàn)在不同的硬件上運(yùn)轉(zhuǎn)我們的上層模塊。
由于我們的 PC 上的硬件不一致,所以必須有多個(gè) HAL 。比如我的 PC 的處理器為 Intel 的,而你的 PC 的處理器為 AMD 的,我的處理器為單核的,而你的處理器為四核的,那么這就會(huì)造成硬件上的不一致,為了解決這種不一致呢,Windows 在打包的時(shí)候會(huì)打包多個(gè) HAL 進(jìn)來,比如一個(gè) HAL 針對(duì)單核,一個(gè) HAL 針對(duì)多核,Windows 在安裝的時(shí)候就會(huì)自動(dòng)的識(shí)別出你的處理器是 AMD 還是 Intel ,是多核還是單核處理器,然后 Windows 就會(huì)自動(dòng)選擇一個(gè)合適的 HAL 給你安裝,同時(shí),將 HAL 名字修改為 HAL.DLL,而在 WS03SP1HALS 目錄下的也就是這些個(gè) HAL ,
比如我的 PC 的處理器為 Intel x86 系列的雙核處理器,自然在安裝 Windows 的時(shí)候,就會(huì)自動(dòng)選擇合適的 HAL ,比如 halmps.dll 作為 HAL ,然后在安裝 Windows 的時(shí)候?qū)⑦@個(gè) HAL 復(fù)制進(jìn)我的 C 盤指定目錄下后,
就將這個(gè) halmps.dll 改名為 hal.dll(為了統(tǒng)一所以改名),這樣就可以得到我們下面看到的在 C:/Windows/System32/hal.dll 了。
再來看 Public 目錄:
在這個(gè)目錄下包含的是一些頭文件,也就是 .h 文件,而且這些文件都是被各個(gè)組件所共享使用的,也就是公用的,其中含有 ddk , internal 等等,其中 internal 表示為內(nèi)部使用的,也就是內(nèi)核自身需要使用到的頭文件。
再來看 Tools 目錄:
前面提到,WRK 中不僅僅包含了微軟公開的關(guān)于 Windows 內(nèi)核的部分源代碼,還包括了用來編譯這部分源代碼的工具,而這些編譯工具自然就在這個(gè) Tools 目錄下了。在后面我們編譯這個(gè) WRK 源代碼的時(shí)候就會(huì)用到這個(gè) Tools 目錄下的工具了。
最后看 Base 目錄,其中 Base 目錄下的 ntos 目錄為 Windows 內(nèi)核模塊的主目錄:
下面就來逐一的介紹這些個(gè)目錄中的文件的含義:
build | WRK 只公開了部分源代碼,那些未公開的則以二進(jìn)制目標(biāo)代碼的形式存在于這個(gè)目錄下。 |
cache | 緩存管理器的實(shí)現(xiàn)的源文件。 |
config | 注冊(cè)表的實(shí)現(xiàn)的源文件。 |
dbgk | 調(diào)試子系統(tǒng)的內(nèi)核模式部分的源文件。 |
ex | 執(zhí)行體層函數(shù)(內(nèi)核堆 , 同步 , 定時(shí)器等)的源文件。 |
fsrtl | 文件系統(tǒng)運(yùn)行庫(kù)的源文件。 |
fstub | 文件系統(tǒng)引導(dǎo)接口。 |
io | I/O 管理器,不包括即插即用管理器和電源管理器部分。 |
ke | (微)內(nèi)核,包括線程調(diào)度器,CPU 管理以及底層的同步語義 |
lpc | 本地過程調(diào)用 (LPC) 機(jī)制的實(shí)現(xiàn)。 |
mm | 內(nèi)存管理器。 |
ob | 內(nèi)核對(duì)象管理器。 |
perf | 內(nèi)核的性能日志記錄功能。 |
ps | 進(jìn)程和線程。 |
se | 安全引用監(jiān)視器。 |
wmi | Windows 管理規(guī)范。 |
inc | 僅適用于 NTOS 部分的包含文件。 |
raw | RAW 文件系統(tǒng)驅(qū)動(dòng)程序的實(shí)現(xiàn)的源文件。 |
rtl | 內(nèi)核運(yùn)行時(shí)庫(kù)支持。 |
init | 內(nèi)核啟動(dòng)部分的代碼。 |
vdm | 虛擬 DOS 機(jī)。 |
verifier | 驅(qū)動(dòng)程序檢驗(yàn) |
編譯 WRK
首先是設(shè)置 WRK 根目錄下的 Tools 子目錄中的 x86 子目錄到 Path 環(huán)境變量中,
首先在控制臺(tái)下進(jìn)入到 WRK 根目錄下的 Base 目錄下的 Ntos 目錄下,
然后輸入命令:nmake –nologo x86= ;(如果是 AMD 的 CPU 的話命令會(huì)有所不同,而且環(huán)境變量的設(shè)置也不同)然后就開始編譯整個(gè) WRK 了。
編譯完成:
此時(shí)就可以在目錄:WRK-v1.2/base/ntos/build 下面找到編譯好的 EXE 文件了。至此編譯完成。
加載 WRK 編譯所得的內(nèi)核模塊
前面我們已經(jīng)由 WRK 編譯得到了內(nèi)核可執(zhí)行模塊,下面我們就要讓操作系統(tǒng)啟動(dòng)的時(shí)候加載上編譯所得的這個(gè)內(nèi)核可執(zhí)行模塊。我們使用的環(huán)境是在 VMware 6.5 中安裝好 Windows Server 2003 SP1 。
首先,我們將由 WRK 編譯所得的 wrkx86.exe 拷貝到虛擬機(jī)中,并且將這個(gè)文件放置到目錄(也就是 ntoskrnl.exe 所在目錄):
然后再在其系統(tǒng)安裝目錄下(一般為 C: 盤)下面找到 boot.ini 文件(默認(rèn)為隱藏)。
首先需要將這個(gè)文件的只讀屬性去掉,即將該文件改為可讀寫文件,
然后用記事本打開這個(gè) boot.ini 文件修改前的 boot.ini 文件:
再在 boot.ini 中添加如下行:
multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Windows Server 2003, WRK" /kernel=wrkx86.exe /hal=hal.dll
修改后的 boot.ini 文件:
將上面的都設(shè)置好以后就重新啟動(dòng) Windows Server 2003 SP1 。然后在啟動(dòng)畫面中即可以看到如下畫面:
我們選擇 Windows Server 2003 , WRK 啟動(dòng) Windows 操作系統(tǒng),這樣加載內(nèi)核可執(zhí)行模塊的就是我們由 WRK 編譯所得的那個(gè) wrkx86.exe 了。
總結(jié)
上面通過很多的截圖來詳細(xì)介紹了 WRK 的編譯以及加載由 WRK 編譯所得的內(nèi)核模塊的過程,對(duì)于 WRK 有什么作用呢?當(dāng)然其是用來學(xué)習(xí)滴,也就是通過 WRK 的學(xué)習(xí),可以更加深入的了解到 Windows 的內(nèi)核,等到那一天有實(shí)力了,你大可以通過修改 WRK 源代碼,然后再編譯成內(nèi)核模塊,然后再讓操作系統(tǒng)加載你自個(gè)的內(nèi)核模塊,當(dāng)然,這個(gè)不是很容易就可以達(dá)到的境界的!??!
其實(shí)呢,對(duì)于 WRK 來說,還有一個(gè)調(diào)試環(huán)境的搭配,通過這個(gè)調(diào)試環(huán)境,你可以在外面(指的是在虛擬機(jī)以外)通過 WinDbg 來調(diào)試這個(gè)內(nèi)核,但是由于這個(gè)在后面介紹驅(qū)動(dòng)程序的時(shí)候我會(huì)再做說明,所以這里就不添亂了。
NET技術(shù):Windows 內(nèi)核(WRK)簡(jiǎn)介,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。