前言
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 的核心技術方案選型不盡相同,因為不同的使用者群眾,其主機上軟體存在參差不齊的同類安全軟體,安全軟體之間也存在大量的相容性問題,這些問題的引用使得原本並不簡單的核心程式設計更為複雜化。記得有很多讀者問過我一個相同的問題:如何撰寫一個穩定的核心模組。這個問題其實沒有標準答案,以筆者的經驗來看,讀者首先應該養成良好的程式設計習慣,然後深入了解系統的各種安全機制以及攔截方法,在撰寫程式時,請思考以下幾個問題:①這行程式碼是否會被其他軟體攔截導致失敗;②這行程式碼是否會觸發一些協力廠商的回呼函數;③這行程式碼失敗後應該怎麼處理。本書在介紹技術的同時,也介紹了筆者的核心開發心得體會與技巧,希望這些體會與技巧可以為讀者帶來更多的思考。核心程式設計類似於武林秘笈的內功修煉,需要時間沉澱,並非一蹴而就,請讀者要有更多的耐心,「成功之道,貴在堅持」。
本書原始程式碼請至本公司官網deepmind.com.tw 搜尋本書後下載。作者亦有針對本書程式碼,維護一個github 的專案,網址為github.com/minglinchen/WinKernelDev。讀者可以隨時造訪這個網址下載最新的程式碼。
寫作是一項工作量極大而繁雜的工作,而對技術書籍來說更是如此。由於我個人工作的緣故,寫作只能在晚上或週末進行,有時為了整章內容的想法連貫而需要挑燈夜戰,通宵達旦。一路走來,感謝我的父母、妻子和女兒,在每天有限的時間裡,我需要投入更多的時間精力專注在寫作上而缺少對他們的陪伴,尤其是我的女兒淇淇,在深感愧疚的同時,也感謝他們的了解與支援。
感謝我的摯友黃瀚,在本書寫作過程中一直支援我,並為我提供了大量的技術性資源。感謝李冰和馮琦二位編輯,她們確保了本書所有文字內容嚴謹與通暢。
感謝「安全圈」內朋友們的支援,尤其感謝數篷科技的科學家吳燁、CTO 楊一飛以及架構師王柏達,他們在工作中為我提供大量的幫助。感謝上一本書籍熱心的讀者,他們回饋的問題更進一步地加強本書的內容。
最後,希望本書能為「安全圈」內的讀者或即將進入「安全圈」的讀者帶來更大的收穫。
陳銘霖