絕對硬派:Windows 核心首度公開 C++解析
內容描述
本書特色
本書作者使用了WDK作為驅動程式的開發,在重要部分,更使用了神級的組合語言進行修改編輯,久違的Windows核心剖析好書
◎ 用最強大的C++、組合語言,充分解析32位元及64位元
◎ 從Windows XP、Windows Vista、Windows 7到最新的Windows 10,處理程序大公開
◎ 徹底解決對Windows一知半解的尷尬局面,一探封閉系統Windows核心的究竟
專家推薦
本書是作者多年實作經驗的精華之作,深入淺出的揭開現代OS核心的神秘面紗,是每一位安全技術實作者的良器。
~~ 數篷科技CTO 楊一飛
本書系統地介紹Windows系統程式設計機制,內容豐富、簡單易懂,想學習Windows核心程式設計,有這一本足矣。
~~十五派信息安全教育創始人 任曉琿
本書作者以雄厚的技術實力和多年程式設計經驗,系統地介紹Windows核心程式設計的方方面面。本書適合入門與進階Windows和新開發的讀者閱讀。
~~騰訊安全部總監、安全應急響應中心(TSRC)負責人 胡珀 (lake2)
這是一本有關Windows驅動開發的寶典,內容全面、詳實。書中介紹的方法和技巧實用性強,有很高的參考和學習價值。
~~騰訊防毒實驗室負責人 馬勁松
Windows平台的核心安全在未來很長一段時間仍會是軟體安全界重要的技術領域之一,本書全新的技術內容會讓你受益匪淺。
~~《Android 軟體安全權威指南》作者 豐生強
本書內容豐富、主題清晰,作者有著豐富的驅動開發經驗,會助您快速進階Windows核心程式設計開發。
~~GeekPwn評委、滴滴美國研究院資深專家工程師 王宇
本書不僅可以學習Windows核心開發的理論知識,還有很多實際案例,可以很好地提高閱讀者的動手能力,並累積程式設計經驗。
~~永安在線 CTO 鄧欣
作者分享了Windows主機安全面向的開發技巧,讀者只要認真閱讀並動手實作,一定會收穫滿滿。
~~PC Hunter作者 linxer
適合讀者群 電腦軟體安全從業者,有C 語言基礎且有興趣了解 Windows 核心、希望從事 Windows 核心開發、或對電腦安全感興趣的讀者。
作者簡介
譚文,網名楚狂人
安全軟體發展經驗豐富,曾任職NEC、英特爾亞太研發有限公司、騰訊科技。從事過企業安全軟體、x86版Android的houdini專案、騰訊電腦管家、騰訊遊戲安全等開發工作,對Windows核心有深入研究。
現任騰訊科技遊戲安全團隊驅動程式開發負責人,專家工程師。
陳銘霖
終端開發經驗豐富,先後任深信服科技架構師、騰訊科技高級工程師;曾主導騰訊電腦管家核心安全驅動開發,以及疑難病毒打擊專案、騰訊Windows伺服器安全開發專案;對Windows及macOS系統有深入研究,在To C以及To B行業有豐富的開發經驗。
現任數篷科技高級架構師,終端安全負責人。
目錄
前言
第一篇 基礎篇
01 核心程式設計環境
1.1 下載開發編譯環境
1.2 撰寫第一個C 檔案
1.3 編譯第一個驅動
02 核心驅動執行與偵錯
2.1 驅動的執行
2.2 服務的基本操作
2.3 驅動的偵錯
03 核心程式設計基礎
3.1 上下文環境
3.2 插斷要求等級
3.3 驅動例外
3.4 字串操作
3.5 鏈結串列
3.6 迴旋栓鎖
3.7 記憶體分配
3.8 物件與控制碼
3.9 登錄檔
3.10 檔案操作
3.11 執行緒與事件
04 應用與核心通訊
4.1 核心方面的程式設計
4.2 應用方面的程式設計
05 64 位元和32 位元核心開發差異
5.1 64 位元系統新增機制
5.2 程式設計差異
06 核心程式設計技巧
6.1 初始化設定值問題
6.2 有效性判斷
6.3 即時申請
6.4 獨立性與最小化原則
6.5 巢狀結構陷阱
6.6 穩定性處理
第二篇 過濾篇
07 序列埠的過濾
7.1 過濾的概念
7.2 獲得實際資料
7.3 完整的程式
08 鍵盤的過濾
8.1 技術原理
8.2 鍵盤過濾的架構
8.3 鍵盤過濾的請求處理
8.4 從請求中列印出按鍵資訊
8.5 Hook 分發函數
8.6 Hook 鍵盤中斷反過濾
8.7 直接用通訊埠操作鍵盤
09 磁碟的虛擬
9.1 虛擬的磁碟
9.2 一個實際的實例
9.3 入口函數
9.4 EvtDriverDeviceAdd 函數
9.5 FAT12/16 磁碟卷冊初始化
9.6 驅動中的請求處理
9.7 Ramdisk 的編譯和安裝
10 磁碟的過濾
10.1 磁碟過濾驅動的概念
10.2 具有還原功能的磁碟卷冊過濾驅動
10.3 驅動分析
11 檔案系統的過濾與監控
11.1 檔案系統的裝置物件
11.2 檔案系統的分發函數
11.3 裝置的綁定前期工作
11.4 檔案系統控制裝置的綁定
11.5 檔案系統卷冊裝置的綁定
11.6 讀/寫操作的過濾
11.7 其他操作的過濾
11.8 路徑過濾的實現
11.9 把sfilter 編譯成靜態程式庫
12 檔案系統透明加密
12.1 檔案透明加密的應用
12.2 區分處理程序
12.3 記憶體對映與檔案緩衝
12.4 加密標識
12.5 檔案加密表
12.6 檔案開啟處理
12.7 讀/寫加密和解密
12.8 crypt_file 的組裝
13 檔案系統微過濾驅動
13.1 檔案系統微過濾驅動簡介
13.2 Minifilter 的程式設計架構
13.3 Minifilter 如何與應用程式通訊
13.4 Minifilter 的安裝與載入
14 網路傳輸層過濾
14.1 TDI 概要
14.2 TDI 的過濾架構
14.3 產生請求:取得位址
14.4 控制請求
14.5 本書實例tdifw.lib 的應用
15 Windows 過濾平台
15.1 WFP 簡介
15.2 WFP 架構
15.3 基本物件模型
15.4 WFP 操作
15.5 WFP 過濾實例
16 NDIS 協定驅動
16.1 乙太網路封包和網路驅動架構
16.2 協定驅動的DriverEntry
16.3 協定與網路卡的綁定
16.4 綁定的解除
16.5 在使用者態操作協定驅動
16.6 在核心態完成功能的實現
16.7 協定驅動的接收回呼
17 NDIS 迷你通訊埠驅動
17.1 迷你通訊埠驅動的應用與概述
17.2 迷你通訊埠驅動的初始化
17.3 開啟ndisprot 裝置
17.4 使用ndisprot 發送封包
17.5 使用ndisprot 接收封包
17.6 其他的特徵回呼函數的實現
18 NDIS 中間層驅動
18.1 NDIS 中間層驅動概述
18.2 中間層驅動的入口與綁定
18.3 中間層驅動發送資料封包
18.4 中間層驅動接收資料封包
18.5 中間層驅動程式查詢和設定
18.6 NDIS 控制碼
18.7 產生普通控制裝置
第三篇 應用篇
19 IA-32 組合語言基礎
19.1 x86 記憶體、暫存器與堆疊
19.2 x86 中函數的實現
19.3 x86 中函數的呼叫與傳回
19.4 從32 位元組合語言到64 位元組合語言
19.5 64 位元下的函數實現
20 Windows 核心掛鉤
20.1 系統服務描述符號表掛鉤
20.2 函數匯出表掛鉤
20.3 Windows 7 系統下IofCallDriver的追蹤
20.4 Windows 7 系統下內聯掛鉤
20.5 中斷與中斷掛鉤
21 Windows 通知與回呼
21.1 Windows 的事件通知與回呼
21.2 常用的事件通知
21.3 Windows 回呼機制
21.4 安全的死角,回呼的應用
22 保護處理程序
22.1 核心物件簡介
22.2 核心物件的結構
22.3 保護核心物件
22.4 處理程序的保護
23 程式植入與防植入
23.1 植入與防植入簡介
23.2 常用的植入方式
23.3 主動植入
23.4 被動植入
23.5 防植入
23.6 歸納
A 如何使用本書的原始程式
B 練習題
序
前言
Windows 是目前主流的封閉原始碼作業系統,從第一個NT 核心的Windows2000 至今,已經有20 年左右的歷史。在這漫長的20 年內,為了滿足日益變化的業務需求,以及應對不斷升級的安全挑戰,Windows 作業系統核心一直不斷升級與增強,其主要表現是核心中增加了新的邏輯模組與安全機制,其中最為典型的是64 位元的Windows 作業系統核心比較32 位元核心增加了Patch Guard" 模組,這個模組的主要作用是檢查核心是否被協力廠商核心模組「污染」,目的是防止病毒木馬使用核心掛鉤或綁架的技術篡改核心。新的安全機制常常會對安全開發者帶來一定的影響,其原因是一些軟體過度依賴系統未公開的底層技術,而正確的做法是開發者需緊密依賴系統提供的公開機制,利用可利用的機制完成相同的功能,這要求開發者對整個Windows 核心機制有深入的了解。作者撰寫本書的目的之一,正是希望讀者能對Windows 核心有更全面、更深入的認識。
本書的前身是《Windows 核心程式設計與驅動開發》,本書在前者的基礎上,刪除了部分過時的章節,重新定義了大部分基礎章節並新增了部分目前較為熱門的技術,同時為了使本書內容更為聚焦,刪除了與Windows 核心連結性不強的內容。
本書針對的讀者群主要有以下幾種。
■ 有一定 C 語言基礎,有興趣了解 Windows 核心的讀者。
■ 有一定 C 語言基礎,並且希望從事 Windows 核心開發的讀者。
■ 有一定基礎的 Windows 核心開發者,有意願進一步加強的讀者。
本書共分為三篇。第一篇為基礎篇(第1 章∼第6 章),從初學者的角度出發,介紹Windows 核心的基本概念、開發環境的架設、系統機制以及核心程式設計的技巧。第1 章與第2 章是本書最為基礎的部分,介紹了核心程式設計的基本概念與開發環境架設,初學者應該首先學習這部分內容。第3 ∼第5 章重點介紹了系統的常用機制,這些機制的使用會貫穿本書所有章節,掌握這些常用機制是核心開發者最基本的要求。第6 章介紹了核心程式設計的注意事項與技巧,這些注意事項與技巧可以幫助初學者少走冤枉路,快速入門。
第二篇為過濾篇(第7 章∼第18 章),是本書的核心內容,由易到難詳細介紹了Windows 系統的過濾機制。首先以最簡單的序列埠過濾驅動開始,剖析了一個過濾驅動的最基本要素,然後分別介紹了鍵盤過濾、磁碟過濾、檔案過濾以及網路過濾。對於網路過濾,本篇從不同的網路層次與角度介紹了TDI、WFP 以及NDIS 等機制。本篇內容涵蓋了目前Windows 系統絕大部分主流的過濾技術。
第三篇為應用篇(第19 章∼第23 章),結合前兩篇的基礎知識,本篇綜合介紹了Windows 安全領域所需的其他技術,透過對本篇的學習,讀者將發現安全技術並不侷限於系統提供的現成機制。本篇選取了目前主流安全軟體所使用到的典型技術,深入淺出,首先介紹了CPU 的基本基礎知識,然後基於上述基礎知識,第20 章重點介紹了Windows 下的掛鉤技術,掛鉤技術常被用於安全軟體的檢測、稽核、攔截等技術;第22 章和第23 章從守護的角度,介紹了自我保護技術。
筆者擁有十餘年的Windows 開發經驗,主導過資料安全、主機安全、伺服器安全等專案,有關To C(針對消費者群眾)和To B(針對企業使用者群眾)企業,深知Windows 核心的複雜性,由於企業的特殊環境,To C 和To B 的核心技術方案選型不盡相同,因為不同的使用者群眾,其主機上軟體存在參差不齊的同類安全軟體,安全軟體之間也存在大量的相容性問題,這些問題的引用使得原本並不簡單的核心程式設計更為複雜化。記得有很多讀者問過我一個相同的問題:如何撰寫一個穩定的核心模組。這個問題其實沒有標準答案,以筆者的經驗來看,讀者首先應該養成良好的程式設計習慣,然後深入了解系統的各種安全機制以及攔截方法,在撰寫程式時,請思考以下幾個問題:①這行程式碼是否會被其他軟體攔截導致失敗;②這行程式碼是否會觸發一些協力廠商的回呼函數;③這行程式碼失敗後應該怎麼處理。本書在介紹技術的同時,也介紹了筆者的核心開發心得體會與技巧,希望這些體會與技巧可以為讀者帶來更多的思考。核心程式設計類似於武林秘笈的內功修煉,需要時間沉澱,並非一蹴而就,請讀者要有更多的耐心,「成功之道,貴在堅持」。
本書原始程式碼請至本公司官網https://deepmind.com.tw 搜尋本書後下載。作者亦有針對本書程式碼,維護一個github 的專案,網址為https://github.com/minglinchen/WinKernelDev。讀者可以隨時造訪這個網址下載最新的程式碼。
寫作是一項工作量極大而繁雜的工作,而對技術書籍來說更是如此。由於我個人工作的緣故,寫作只能在晚上或週末進行,有時為了整章內容的想法連貫而需要挑燈夜戰,通宵達旦。一路走來,感謝我的父母、妻子和女兒,在每天有限的時間裡,我需要投入更多的時間精力專注在寫作上而缺少對他們的陪伴,尤其是我的女兒淇淇,在深感愧疚的同時,也感謝他們的了解與支援。
感謝我的摯友黃瀚,在本書寫作過程中一直支援我,並為我提供了大量的技術性資源。感謝李冰和馮琦二位編輯,她們確保了本書所有文字內容嚴謹與通暢。
感謝「安全圈」內朋友們的支援,尤其感謝數篷科技的科學家吳燁、CTO 楊一飛以及架構師王柏達,他們在工作中為我提供大量的幫助。感謝上一本書籍熱心的讀者,他們回饋的問題更進一步地加強本書的內容。
最後,希望本書能為「安全圈」內的讀者或即將進入「安全圈」的讀者帶來更大的收穫。
陳銘霖