-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Windows內核編程

( 簡體 字)
作者:譚文,陳銘霖類別:1. -> 程式設計 -> 綜合
譯者:
出版社:電子工業出版社Windows內核編程 3dWoo書號: 52544
詢問書籍請說出此書號!

有庫存
NT售價: 990

出版日:3/1/2020
頁數:656
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121384882
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

到現在仍清晰記得初見銘霖兄時,他儒雅、謙遜,令人印象非常深刻,而我早在此之前就拜讀過銘霖兄的著作。
現在回想起來,我不由得對那本書有了更加深刻的理解。
記得那是在2015年年末,當時我們正在策劃規模約1000多個課時的系統內核安全課程,教研部的負責人當時向我推薦了一本集大成之作,并準備以此書為模板策劃課程的大部分內容,而這個負責重新整理編輯以前中國內核領域兩本大作的編者正是銘霖兄。
當時的課程研發工作從2015年年末一直持續到了2017年年初,雖然在此之前我們教研組的老師,以及課程研發的負責人都做過內核安全相關的研究,但仍然被其中冗雜的規則與部分諱莫如深的非公開技術細節拖住了腳步,整個研發工作進展頗為艱辛,而正是銘霖兄的那本著作,為我們艱難的研發之旅點亮了一盞明燈,大大加快了我們課程研發的步伐,也正是因為這次經歷,使得陳銘霖這個名字印在了我的腦海里。
后來在一次偶然的機會下,得知銘霖兄正在寫一本新的與Windows內核編程相關的書籍,頓時激起了我的好奇心,由于我也曾出版過兩本書籍,深知耕耘文字的不易,像系統內核編程這種前后依存關系緊密、內部知識點交織復雜的書籍更是難以掌控,除了要能統領此領域內各技術細節外,還要有一種不為功利、默默耕耘的精神追求,這在當前國內的技術領域內是非常寶貴且罕見的。
然而緣分是個奇怪的東西,經過我一位摯友的介紹,后來有幸能與銘霖兄相識,我們初見便促膝長談了近6個小時,至今銘霖兄那談到內核編程話題時滔滔不絕的樣子仍歷歷在目。
在我們談到要出版的新著作時,其實我內心是有所疑慮的,雖然銘霖兄有過出版經歷,并且在騰訊、深信服科技等頂級安全實驗室的多年工作中積累了大量的寶貴經驗,但當時銘霖兄也正值創業初期,如何能在繁忙且高壓的創業工作之余照顧好家人,還要再安排出如此巨大的精力去沉淀梳理自己的所思所想?我不由得替銘霖兄默默擔憂。
而一切憂慮在銘霖兄邀請我查看其書稿時瞬間煙消云散,當我看到這本600余頁的“大部頭”時,不由得替銘霖兄高興,也不由得替國內的內核開發從業者們高興。
這是一本從初學者角度出發,以內核安全高度為終點的書,本書從最基本的Windows內核級基本概念開始介紹,只要讀者具備C語言基礎就可以讀懂,并在第二篇中由易到難地介紹了各種內核編程中的過濾技術,最后拔高到內核安全,不夸張地說,如果讀者想要學習Windows內核安全,有這本書基本就夠了。
隨著網絡空間安全的逐步發展以及對個人隱私的逐步重視,這幾年略微降溫的內核編程在個人隱私保護以及防泄密等領域漸漸升溫,內核編程即將迎來第二春,而這本書不失為各位讀者把握住這一技術潮流的最有利武器。
最后,在有幸作序之余,祝愿這本書能有更多的讀者,能有更多的認可,能發揮更多的價值,希望這本書能成為國內Windows內核編程的經典著作。



任曉琿
十五派信息安全教育創始人
《黑客免殺攻防》作者
黑客反病毒組織創始人
2019年11月
前 言



Windows是當前主流的閉源操作系統,從第一個NT內核的Windows 2000至今,已經有20年左右的歷史,在這漫長的20年內,為了滿足日益變化的業務需求,以及應對不斷升級的安全挑戰,Windows操作系統內核一直不斷升級與完善,其主要表現是內核中增加了新的邏輯模塊與安全機制,其中最為典型的是64位的Windows操作系統內核對比32位內核增加了“PatchGuard”模塊,這個模塊的主要作用是檢查內核是否被第三方內核模塊“污染”,目的是防止病毒木馬使用內核掛鉤或劫持的技術篡改內核。新的安全機制往往會對安全開發者帶來一定的影響,其原因是一些軟件過度依賴系統未公開的底層技術,而正確的做法是開發者需緊密依賴系統提供的公開機制,利用可利用的機制完成相同的功能,這要求開發者對整個Windows內核機制有深入的理解,作者編寫本書的目的之一,正是希望讀者能對Windows內核有更全面、更深入的認識。
本書的前身是《Windows內核編程與驅動開發》,本書在前者的基礎上,刪除了部分過時章節,重寫了大部分基礎章節并新增了部分當前較為熱門的技術章節,同時為了使本書內容更為聚焦,刪除了與Windows內核關聯性不強的內容。
本書面向的人群主要有以下幾類。
? 有一定C語言基礎,有興趣了解Windows內核的讀者。
? 有一定C語言基礎,并且希望從事Windows內核開發的讀者。
? 有一定基礎的Windows內核開發者,有意愿進一步提高的讀者。
本書共分為三部分。第一部分,從初學者的角度出發,介紹Windows內核的基本概念、開發環境的搭建、系統機制以及內核編程的技巧;其中,第1章與第2章是本書最為基礎的部分,介紹了內核編程的基本概念與開發環境搭建,初學者應該首先學習這部分內容。第3∼5章重點介紹了系統的常用機制,這些機制的使用會貫穿本書所有章節,掌握這些常用機制是內核開發者最基本的要求。第6章介紹了內核編程的注意事項與技巧,這些注意事項與技巧可以幫助初學者少走彎路,快速入門。
第二篇為過濾篇,是本書的核心內容,分別詳細介紹了Windows系統的過濾機制。首先以最簡單的串口過濾驅動開始,剖析了一個過濾驅動的最基本要素,然后分別介紹了鍵盤過濾、磁盤過濾、文件過濾以及網絡過濾,由易到難;對于網絡過濾,本篇從不同的網絡層次與角度介紹了TDI、WFP以及NDIS等機制。本篇內容涵蓋了目前Windows系統絕大部分主流的過濾技術。
第三篇為應用篇,結合前面兩篇的知識點,本篇綜合介紹了Windows安全領域所需的其他技術,通過對本篇的學習,讀者將會發現安全技術并不局限于系統提供的現成機制。本篇選取了目前主流安全軟件所使用到的典型技術,深入淺出,首先介紹了CPU的基本知識點,然后基于上述知識點,第20章重點介紹了Windows下的掛鉤技術,掛鉤技術常被用于安全軟件的檢測、審計、攔截等技術;第22章與第23章從守護的角度,為讀者介紹了自我保護技術。
筆者擁有十余年的Windows開發經驗,主導過數據安全、主機安全、服務器安全等項目,涉及to C(面向消費者群體)和to B(面向企業用戶群體)行業,深知Windows內核的復雜性,由于行業的特殊環境,to C和to B的內核技術方案選型不盡相同,因為不同的用戶群體,其主機上軟件存在參差不齊的同類安全軟件,安全軟件之間也存在大量的兼容性問題,這些問題的引入使得原本并不簡單的內核編程更為復雜化。記得有很多讀者問過我一個相同的問題:如何編寫一個穩定的內核模塊。這個問題其實沒有標準答案,從筆者的經驗來看,讀者首先應該養成良好的編程習慣,然后深入理解系統的各種安全機制以及攔截方法,在編寫代碼時候,請思考如下幾個問題:?這句代碼是否會被其他軟件攔截導致失敗;?這句代碼是否會觸發一些第三方的回調函數;?這句代碼失敗后應該怎么處理。本書在為讀者介紹技術的同時,也為讀者介紹了筆者的內核開發心得體會與技巧,希望這些體會與技巧可以為讀者帶來更多的思考。內核編程類似于武林秘籍的內功修煉,需要時間沉淀,并非一蹴而就,請讀者賦予更多的耐心,“成功之道,貴在堅持”。
技術書籍寫作的工作量巨大而繁雜,在整個寫作過程中,要感謝安全圈內朋友的支持,尤其感謝數篷科技的科學家吳燁以及CTO楊一飛、架構師王柏達,他們在工作中為我提供了大量的幫助,使得本書能順利出版。感謝我的父母、妻子、女兒以及其他家人,在每天有限的時間里,需要花費更多的精力在寫作上而缺少對他們的陪伴,尤其是我的女兒,在深感愧疚的同時,也感謝他們的理解與支持;感謝上一本書籍的熱心讀者,他們反饋的問題更好地完善了本書內容。最后,希望本書能為安全圈內的讀者或者即將進入安全圈的讀者帶來更大的收獲。



陳銘霖
2019年11月于深圳







本書的作者和貢獻者



本書的前身是《Windows內核安全與驅動開發》,除了直接編寫本書的作者外,也有業內技術人士協同編寫了部分章節,所有作者一并介紹如下:
譚文,網名楚狂人,已有十七年客戶端安全軟件開發經驗。先后在NEC、英特爾亞太研發有限公司、騰訊科技任職。曾經從事過企業安全軟件、x86版Android的houdini項目、騰訊電腦管家、騰訊游戲安全等開發工作。對Windows內核有深入的研究,現任騰訊科技游戲安全團隊驅動程序開發負責人,專家工程師。指導本書主題思想,編寫了核心過濾章節,并審核了所有新章節。
陳銘霖,現任職數篷科技終端安全負責人,負責終端安全開發,之前曾任騰訊科技高級工程師,主導騰訊電腦管家客戶端安全項目也曾任深信服科技Windows架構師以及虛擬化產品架構師。有十余年終端安全開發經驗,覆蓋to C、to B及to G行業,并具有千萬級DAU安全產品的研發經驗。主導了全書內容,重寫了大部分章節,新增了部分章節。
張佩,Windows驅動開發技術專家,長期從事聲卡、顯卡等硬件驅動程序的開發、調試工作。目前在英特爾亞太研發有限公司平板電腦相關部門工作。曾著有《竹林蹊徑——深入淺出Windows驅動開發》一書。為本書貢獻了若干個網絡驅動相關的章節。
楊瀟,曾任Windows客戶端安全工程師,先后在上海貝爾和北京Comodo工作。后來離職創業,目前為西安一家醫療科技公司的CEO。編寫了本書磁盤驅動相關章節。
邵堅磊,網名wowocock,業內著名的Windows安全技術專家。長期從事Windows安全相關的內核開發工作。目前在奇虎360任職。編寫了本書部分章節并提供了部分代碼實例。
盧冠豪,中國臺灣人。畢業于輔仁大學資訊工程學系。長期從事C、C++、網絡與通信程序設計工作,參與過“端點安全”“資產管理”“網絡流量分析”等項目的開發與維護,擅長Windows項目開發。編寫了本書文件系統微端口過濾一章。
本書讀者反饋的QQ群是4088102,想了解更多信息也可以關注微信訂閱號:終端安全編程。





特別致謝



在本書的著作過程中,獲得了安全界內熱心朋友們的鼎力支持,他們的專業知識能力分布在國內不同的安全領域,為本書的基礎定位、技術重點以及應用方向給出了科學的優化性建議。
下面是為本書提供過幫助的朋友:
任曉琿(A1Pass),十五派信息安全教育CEO,《黑客免殺攻防》的作者,一位具有遠大理想抱負的技術專家,筆者的摯友。他的價值觀深深影響著筆者,并且審閱了本書的主體脈絡,結合當前行業形勢為本書定位給出了寶貴的建議。
李常坤,奇安信技術總監,審閱了全書主體脈絡,為本書的技術構成給出了寶貴的建議。
黃瀚(EvilKnight),安全技術專家,筆者的摯友,在本書最開始進行技術選型時提供了大量的安全人脈資源,使本書的技術選型可以很好地滿足行業內不同的需要。在本書編寫的后期,審閱了本書的主要章節,提出了很多寶貴的建議。
楊一飛,數篷科技CTO,前百度安全專家,筆者工作中的伙伴,生活上的摯友,行事低調卻對技術有狂熱的追求,在工作中為筆者提供了大量的幫助以及先進的技術理念,部分先進理念提煉后也被編寫到本書中。
豐生強(@非蟲),《Android軟件安全與逆向分析》、《macOS軟件安全與逆向分析》的作者,審閱了本書的主要章節,站在跨緯度的系統角度為本書給出了寶貴的意見。
胡訓國,準動網絡科技首席技術專家,前騰訊高級安全工程師,審閱了本書第三篇,幫忙勘正內容中的一些錯誤。
祁偉,華為終端安全專家,前騰訊高級安全工程師,審閱了本書的第一篇,幫忙勘正內容中的一些錯誤。
王淙,Windows內核驅動專家,審閱了本書第二篇的部分章節,幫忙勘正內容中的一些錯誤。
鄒冠群,資深軟件安全專家,為本書的技術細節提供了部分參考資料。
張天郁,數篷科技Windows驅動專家,前上海2345內核高級工程師,受邀幫忙整理本書部分代碼,并幫忙更正代碼中的錯誤。
周子淇,軟件安全專家,為本書的技術細節提供了部分參考資料。
丁健海,高級安全研究員,軟件安全專家,為本書的技術細節提供了部分參考資料。
內容簡介:

本書前身是《Windows內核安全與驅動開發》,重點圍繞Windows操作系統的機制介紹內核安全編程技術,除了少數特殊章節,大部分內容均適用于Windows 2000至Windows 10操作系統,體系結構覆蓋32位以及64位。同時本書也深入淺出地介紹了匯編基礎和系統內核機制。本書共分為三篇,分別從不同的角度介紹內核編程技術。第1篇面向零基礎的讀者,其中“內核編程環境”“內核驅動運行與調試”“內核編程基礎”重點介紹與內核編程相關的基本知識、開發環境搭建,以及基本的編程機制。“應用與內核通信”和“64位和32位內核開發差異”主要介紹應用層編程與內核編程的數據交互。最后,介紹了編程過程所需注意的事項,以及設計技巧。第2篇結合操作系統的機制,從最簡單的“串口的過濾”開始,介紹了“鍵盤的過濾”‘“磁盤的過濾”“文件系統的過濾”“Windows過濾平臺”“NDIS協議驅動”“NDIS小端口驅動”,以及“NDIS中間層驅動”。覆蓋了整個Windows系統的主流過濾框架,并且深入剖析了文件透明加密解密的原理。第3篇側重安全技術,重點介紹了安全編程所需要使用的知識,如“IA-32匯編基礎”“Windows內核掛鉤”“Windows通知與回調”“保護進程”,以及“代碼注入與防注入”。本書由具有十多年終端安全開發經驗的從業人員編寫,以簡潔實用為準則,理論與實際案例相結合。適用于計算機軟件安全從業人員、有一定C語言基礎且對計算機安全感興趣的愛好者。
目錄:

第1篇 基礎篇
第1章 內核編程環境 002
1.1 下載開發編譯環境 002
1.1.1 編譯環境介紹 002
1.1.2 下載Visual Studio與WDK 004
1.2 編寫第一個C文件 006
1.2.1 通過Visual Studio新建工程 006
1.2.2 內核入口函數 007
1.2.3 編寫入口函數體 008
1.3 編譯第一個驅動 010
1.3.1 通過Visual Studio編譯 010
1.3.2 通過WDK直接編譯 011
第2章 內核驅動運行與調試 013
2.1 驅動的運行 013
2.2 服務的基本操作 015
2.2.1 打開服務管理器 015
2.2.2 服務的注冊 016
2.2.3 服務的啟動與停止 018
2.2.4 服務的刪除 019
2.2.5 服務的例子 020
2.2.6 服務小結 022
2.3 驅動的調試 022
2.3.1 基于VS+WDK環境調試 022
2.3.2 基于Windbg調試 026
第3章 內核編程基礎 029
3.1 上下文環境 029
3.2 中斷請求級別 031
3.3 驅動異常 033
3.4 字符串操作 034
3.5 鏈表 036
3.5.1 頭節點初始化 038
3.5.2 節點插入 038
3.5.3 鏈表遍歷 039
3.5.4 節點移除 040
3.6 自旋鎖 040
3.6.1 使用自旋鎖 040
3.6.2 在雙向鏈表中使用自旋鎖 041
3.6.3 使用隊列自旋鎖提高性能 042
3.7 內存分配 043
3.7.1 常規內存分配 043
3.7.2 旁視列表 045
3.8 對象與句柄 049
3.9 注冊表 054
3.9.1 注冊表的打開與關閉 054
3.9.2 注冊表的修改 056
3.9.3 注冊表的讀取 057
3.10 文件操作 060
3.10.1 文件的打開與關閉 060
3.10.2 文件的讀寫 063
3.11 線程與事件 066
3.11.1 使用系統線程 066
3.11.2 使用同步事件 067
第4章 應用與內核通信 070
4.1 內核方面的編程 071
4.1.1 生成控制設備 071
4.1.2 控制設備的名字和符號鏈接 073
4.1.3 控制設備的刪除 074
4.1.4 分發函數 074
4.1.5 請求的處理 076
4.2 應用方面的編程 077
4.2.1 基本的功能需求 077
4.2.2 在應用程序中打開與關閉設備 077
4.2.3 設備控制請求 078
4.2.4 內核中的對應處理 080
4.2.5 結合測試的效果 082
第5章 64位和32位內核開發差異 083
5.1 64位系統新增機制 083
5.1.1 WOW64子系統 083
5.1.2 PatchGuard技術 086
5.1.3 64位驅動的編譯、安裝與運行 086
5.2 編程差異 087
5.2.1 匯編嵌入變化 087
5.2.2 預處理與條件編譯 088
5.2.3 數據結構調整 088
第6章 內核編程技巧 090
6.1 初始化賦值問題 090
6.2 有效性判斷 091
6.3 一次性申請 092
6.4 獨立性與最小化原則 095
6.5 嵌套陷阱 097
6.6 穩定性處理 098
6.6.1 事前處理 098
6.6.2 事中處理 100
6.6.3 事后處理 104
第2篇 過濾篇
第7章 串口的過濾 106
7.1 過濾的概念 106
7.1.1 設備綁定的內核API之一 106
7.1.2 設備綁定的內核API之二 107
7.1.3 生成過濾設備并綁定 108
7.1.4 從名字獲得設備對象 110
7.1.5 綁定所有串口 111
7.2 獲得實際數據 112
7.2.1 請求的區分 112
7.2.2 請求的結局 113
7.2.3 寫請求的數據 114
7.3 完整的代碼 114
7.3.1 完整的分發函數 114
7.3.2 如何動態卸載 116
7.3.3 代碼的編譯與運行 117
第8章 鍵盤的過濾 119
8.1 技術原理 120
8.1.1 預備知識 120
8.1.2 Windows中從擊鍵到內核 120
8.1.3 鍵盤硬件原理 122
8.2 鍵盤過濾的框架 122
8.2.1 找到所有的鍵盤設備 122
8.2.2 應用設備擴展 125
8.2.3 鍵盤過濾模塊的DriverEntry 127
8.2.4 鍵盤過濾模塊的動態卸載 127
8.3 鍵盤過濾的請求處理 129
8.3.1 通常的處理 129
8.3.2 PNP的處理 130
8.3.3 讀的處理 131
8.3.4 讀完成的處理 132
8.4 從請求中打印出按鍵信息 133
8.4.1 從緩沖區中獲得KEYBOARD_
INPUT_DATA 133
8.4.2 從KEYBOARD_INPUT_DATA
中得到鍵 134
8.4.3 從MakeCode到實際字符 134
8.5 Hook分發函數 136
8.5.1 獲得類驅動對象 136
8.5.2 修改類驅動的分發函數指針 137
8.5.3 類驅動之下的端口驅動 138
8.5.4 端口驅動和類驅動之間的
協作機制 139
8.5.5 找到關鍵的回調函數的條件 140
8.5.6 定義常數和數據結構 140
8.5.7 打開兩種鍵盤端口驅動
尋找設備 141
8.5.8 搜索在KbdClass類驅動中的
地址 143
8.6 Hook鍵盤中斷反過濾 145
8.6.1 中斷:IRQ和INT 146
8.6.2 如何修改IDT 147
8.6.3 替換IDT中的跳轉地址 148
8.6.4 QQ的PS/2反過濾措施 149
8.7 直接用端口操作鍵盤 150
8.7.1 讀取鍵盤數據和命令端口 150
8.7.2 p2cUserFilter的最終實現 151
第9章 磁盤的虛擬 153
9.1 虛擬的磁盤 153
9.2 一個具體的例子 153
9.3 入口函數 154
9.3.1 入口函數的定義 154
9.3.2 Ramdisk驅動的入口函數 155
9.4 EvtDriverDeviceAdd函數 156
9.4.1 EvtDriverDeviceAdd的定義 156
9.4.2 局部變量的聲明 157
9.4.3 磁盤設備的創建 157
9.4.4 如何處理發往設備的請求 158
9.4.5 用戶配置的初始化 160
9.4.6 鏈接給應用程序 161
9.5 FAT12/16磁盤卷初始化 163
9.5.1 磁盤卷結構簡介 163
9.5.2 Ramdisk對磁盤的初始化 164
9.6 驅動中的請求處理 170
9.6.1 請求的處理 170
9.6.2 讀/寫請求 171
9.6.3 DeviceIoControl請求 172
9.7 Ramdisk的編譯和安裝 175
9.7.1 編譯 175
9.7.2 安裝 175
9.7.3 對安裝的深入探究 175
第10章 磁盤的過濾 177
10.1 磁盤過濾驅動的概念 177
10.1.1 設備過濾和類過濾 177
10.1.2 磁盤設備和磁盤卷設備
過濾驅動 177
10.1.3 注冊表和磁盤卷設備過濾
驅動 178
10.2 具有還原功能的磁盤卷過濾驅動 178
10.2.1 簡介 178
10.2.2 基本思想 179
10.3 驅動分析 179
10.3.1 DriverEntry函數 179
10.3.2 AddDevice函數 180
10.3.3 PnP請求的處理 184
10.3.4 Power請求的處理 188
10.3.5 DeviceIoControl請求的處理 189
10.3.6 bitmap的作用和分析 192
10.3.7 boot驅動完成回調函數和
稀疏文件 198
10.3.8 讀/寫請求的處理 200
第11章 文件系統的過濾與監控 209
11.1 文件系統的設備對象 210
11.1.1 控制設備與卷設備 210
11.1.2 生成自己的一個控制設備 211
11.2 文件系統的分發函數 212
11.2.1 普通的分發函數 212
11.2.2 文件過濾的快速IO分發函數 213
11.2.3 快速IO分發函數的一個實現 215
11.2.4 快速IO分發函數逐個簡介 216
11.3 設備的綁定前期工作 217
11.3.1 動態地選擇綁定函數 217
11.3.2 注冊文件系統變動回調 219
11.3.3 文件系統變動回調的一個
實現 220
11.3.4 文件系統識別器 221
11.4 文件系統控制設備的綁定 222
11.4.1 生成文件系統控制設備的
過濾設備 222
11.4.2 綁定文件系統控制設備 223
11.4.3 利用文件系統控制請求 225
11.5 文件系統卷設備的綁定 227
11.5.1 從IRP中獲得VPB指針 227
11.5.2 設置完成函數并等待IRP
完成 228
11.5.3 卷掛載IRP完成后的工作 231
11.5.4 完成函數的相應實現 233
11.5.5 綁定卷的實現 234
11.6 讀/寫操作的過濾 236
11.6.1 設置一個讀處理函數 236
11.6.2 設備對象的區分處理 237
11.6.3 解析讀請求中的文件信息 238
11.6.4 讀請求的完成 241
11.7 其他操作的過濾 244
11.7.1 文件對象的生存周期 244
11.7.2 文件的打開與關閉 245
11.7.3 文件的刪除 247
11.8 路徑過濾的實現 248
11.8.1 取得文件路徑的三種情況 248
11.8.2 打開成功后獲取路徑 249
11.8.3 在其他時刻獲得文件路徑 250
11.8.4 在打開請求完成之前獲得
路徑名 251
11.8.5 把短名轉換為長名 253
11.9 把sfilter編譯成靜態庫 254
11.9.1 如何方便地使用sfilter 254
11.9.2 初始化回調、卸載回調和
綁定回調 254
11.9.3 綁定與回調 256
11.9.4 插入請求回調 257
11.9.5 如何利用sfilter.lib 259
第12章 文件系統透明加密 263
12.1 文件透明加密的應用 263
12.1.1 防止企業信息泄密 263
12.1.2 文件透明加密防止企業信息
泄密 263
12.1.3 文件透明加密軟件的例子 264
12.2 區分進程 265
12.2.1 機密進程與普通進程 265
12.2.2 找到進程名字的位置 266
12.2.3 得到當前進程的名字 267
12.3 內存映射與文件緩沖 268
12.3.1 記事本的內存映射文件 268
12.3.2 Windows的文件緩沖 269
12.3.3 文件緩沖:明文還是密文的
選擇 270
12.3.4 清除文件緩沖 271
12.4 加密標識 274
12.4.1 保存在文件外、文件頭還是
文件尾 274
12.4.2 隱藏文件頭的大小 275
12.4.3 隱藏文件頭的設置偏移 277
12.4.4 隱藏文件頭的讀/寫偏移 277
12.5 文件加密表 278
12.5.1 何時進行加密操作 278
12.5.2 文件控制塊與文件對象 279
12.5.3 文件加密表的數據結構與
初始化 280
12.5.4 文件加密表的操作:查詢 281
12.5.5 文件加密表的操作:添加 282
12.5.6 文件加密表的操作:刪除 283
12.6 文件打開處理 284
12.6.1 直接發送IRP進行查詢與
設置操作 285
12.6.2 直接發送IRP進行讀/寫操作 287
12.6.3 文件的非重入打開 288
12.6.4 文件的打開預處理 291
12.7 讀/寫加密和解密 296
12.7.1 在讀取時進行解密 296
12.7.2 分配與釋放MDL 297
12.7.3 寫請求加密 298
12.8 crypt_file的組裝 300
12.8.1 crypt_file的初始化 300
12.8.2 crypt_file的IRP預處理 301
12.8.3 crypt_file的IRP后處理 304
第13章 文件系統微過濾驅動 308
13.1 文件系統微過濾驅動簡介 308
13.1.1 文件系統微過濾驅動的由來 308
13.1.2 Minifilter的優點與不足 309
13.2 Minifilter的編程框架 309
13.2.1 微文件系統過濾的注冊 310
13.2.2 微過濾器的數據結構 311
13.2.3 卸載回調函數 314
13.2.4 預操作回調函數 314
13.2.5 后操作回調函數 317
13.2.6 其他回調函數 318
13.3 Minifilter如何與應用程序通信 320
13.3.1 建立通信端口的方法 320
13.3.2 在用戶態通過DLL使用通信
端口的范例 322
13.4 Minifilter的安裝與加載 325
13.4.1 安裝Minifilter的INF文件 325
13.4.2 啟動安裝完成的Minifilter 326
第14章 網絡傳輸層過濾 328
14.1 TDI概要 328
14.1.1 為何選擇TDI 328
14.1.2 從socket到Windows內核 329
14.1.3 TDI過濾的代碼例子 330
14.2 TDI的過濾框架 330
14.2.1 綁定TDI的設備 330
14.2.2 唯一的分發函數 331
14.2.3 過濾框架的實現 333
14.2.4 主要過濾的請求類型 335
14.3 生成請求:獲取地址 336
14.3.1 過濾生成請求 336
14.3.2 準備解析IP地址與端口 337
14.3.3 獲取生成的IP地址和端口 338
14.3.4 連接終端的生成與相關信息
的保存 340
14.4 控制請求 341
14.4.1 TDI_ASSOCIATE_ADDRESS
的過濾 341
14.4.2 TDI_CONNECT的過濾 343
14.4.3 其他的次功能號 344
14.4.4 設置事件的過濾 345
14.4.5 TDI_EVENT_CONNECT類型
的設置事件的過濾 346
14.4.6 直接獲取發送函數的過濾 348
14.4.7 清理請求的過濾 350
14.5 本書例子tdifw.lib的應用 351
14.5.1 tdifw庫的回調接口 351
14.5.2 tdifw庫的使用例子 353
第15章 Windows過濾平臺 355
15.1 WFP簡介 355
15.2 WFP框架 355
15.3 基本對象模型 357
15.3.1 過濾引擎 357
15.3.2 墊片 357
15.3.3 呼出接口 357
15.3.4 分層 358
15.3.5 子層 359
15.3.6 過濾器 360
15.3.7 呼出接口回調函數 364
15.4 WFP操作 369
15.4.1 呼出接口的注冊與卸載 369
15.4.2 呼出接口的添加與移除 370
15.4.3 子層的添加與移除 371
15.4.4 過濾器的添加 372
15.5 WFP過濾例子 372
第16章 NDIS協議驅動 380
16.1 以太網包和網絡驅動架構 380
16.1.1 以太網包和協議驅動 380
16.1.2 NDIS網絡驅動 381
16.2 協議驅動的DriverEntry 382
16.2.1 生成控制設備 382
16.2.2 注冊協議 383
16.3 協議與網卡的綁定 385
16.3.1 協議與網卡的綁定概念 385
16.3.2 綁定回調處理的實現 386
16.3.3 協議綁定網卡的API 388
16.3.4 解決綁定競爭問題 389
16.3.5 分配接收和發送的包池與
緩沖池 390
16.3.6 OID請求的發送和請求
完成回調 391
16.3.7 ndisprotCreateBinding的
最終實現 395
16.4 綁定的解除 400
16.4.1 解除綁定使用的API 400
16.4.2 ndisprotShutdownBinding的
實現 402
16.5 在用戶態操作協議驅動 405
16.5.1 協議的收包與發包 405
16.5.2 在用戶態編程打開設備 405
16.5.3 用DeviceIoControl發送
控制請求 407
16.5.4 用WriteFile發送數據包 409
16.5.5 用ReadFile發送數據包 410
16.6 在內核態完成功能的實現 412
16.6.1 請求的分發與實現 412
16.6.2 等待設備綁定完成與指定
設備名 412
16.6.3 指派設備的完成 413
16.6.4 處理讀請求 416
16.6.5 處理寫請求 418
16.7 協議驅動的接收回調 422
16.7.1 和接收包有關的回調函數 422
16.7.2 ReceiveHandler的實現 423
16.7.3 TransferDataCompleteHandler
的實現 427
16.7.4 ReceivePacketHandler的實現 428
16.7.5 接收數據包的入隊 430
16.7.6 接收數據包的出隊和讀請求
的完成 432
第17章 NDIS小端口驅動 437
17.1 小端口驅動的應用與概述 437
17.1.1 小端口驅動的應用 437
17.1.2 小端口驅動示例 438
17.1.3 小端口驅動的運作與編程
概述 438
17.2 小端口驅動的初始化 439
17.2.1 小端口驅動的DriverEntry 439
17.2.2 小端口驅動的適配器結構 441
17.2.3 配置信息的讀取 442
17.2.4 設置小端口適配器上下文 443
17.2.5 MPInitialize的實現 444
17.2.6 MPHalt的實現 447
17.3 打開ndisprot設備 447
17.3.1 IO目標 447
17.3.2 給IO目標發送DeviceIoControl
請求 449
17.3.3 打開ndisprot接口并完成
配置設備 451
17.4 使用ndisprot發送包 453
17.4.1 小端口驅動的發包接口 453
17.4.2 發送控制塊(TCB) 454
17.4.3 遍歷包組并填寫TCB 456
17.4.4 寫請求的構建與發送 458
17.5 使用ndisprot接收包 461
17.5.1 提交數據包的內核API 461
17.5.2 從接收控制塊(RCB)
提交包 462
17.5.3 對ndisprot讀請求的完成
函數 463
17.5.4 讀請求的發送 466
17.5.5 用于讀包的WDF工作任務 467
17.5.6 ndisedge讀工作任務的生成
與入列 469
17.6 其他的特征回調函數的實現 471
17.6.1 包的歸還 471
17.6.2 OID查詢處理的直接完成 472
17.6.3 OID設置處理 475
第18章 NDIS中間層驅動 477
18.1 NDIS中間層驅動概述 477
18.1.1 Windows網絡架構總結 477
18.1.2 NDIS中間層驅動簡介 478
18.1.3 NDIS中間層驅動的應用 479
18.1.4 NDIS包描述符結構深究 480
18.2 中間層驅動的入口與綁定 483
18.2.1 中間層驅動的入口函數 483
18.2.2 動態綁定NIC設備 483
18.2.3 小端口初始化(MpInitialize) 485
18.3 中間層驅動發送數據包 486
18.3.1 發送數據包原理 486
18.3.2 包描述符“重利用” 488
18.3.3 包描述符“重申請” 490
18.3.4 發送數據包的異步完成 492
18.4 中間層驅動接收數據包 494
18.4.1 接收數據包概述 494
18.4.2 用PtReceive接收數據包 494
18.4.3 用PtReceivePacket接收 499
18.4.4 對包進行過濾 501
18.5 中間層驅動程序查詢和設置 504
18.5.1 查詢請求的處理 504
18.5.2 設置請求的處理 506
18.6 NDIS句柄 507
18.6.1 不可見的結構指針 507
18.6.2 常見的NDIS句柄 508
18.6.3 NDIS句柄誤用問題 510
18.6.4 一種解決方案 512
18.7 生成普通控制設備 512
18.7.1 在中間層驅動中添加普通設備 512
18.7.2 使用傳統方法來生成控制設備 515
第3篇 應用篇
第19章 IA-32匯編基礎 522
19.1 x86內存、寄存器與堆棧 522
19.1.1 _asm關鍵字 522
19.1.2 x86中的mov指令 523
19.1.3 x86中的寄存器與內存 523
19.1.4 賦值語句的實現 524
19.2 x86中函數的實現 525
19.2.1 一個函數的例子 525
19.2.2 堆棧的介紹 526
19.2.3 寄存器的備份和恢復 527
19.2.4 內部變量與返回值 529
19.3 x86中函數的調用與返回 531
19.3.1 函數的調用指令call 531
19.3.2 通過堆棧傳遞參數 532
19.3.3 從函數返回 533
19.3.4 三種常見的調用協議 535
19.4 從32位匯編到64位匯編 536
19.4.1 Intel 64與IA-32體系
架構簡介 536
19.4.2 64位指令與32位指令 536
19.4.3 通用寄存器 537
19.5 64位下的函數實現 538
19.5.1 函數概覽 538
19.5.2 32位參數的傳遞 539
19.5.3 64位參數與返回值 540
19.5.4 棧空間的開辟與恢復 541
第20章 Windows內核掛鉤 544
20.1 系統服務描述符表掛鉤 545
20.1.1 系統服務描述符表(SSDT) 545
20.1.2 系統服務描述符表掛鉤的意圖 546
20.1.3 尋找要掛鉤的函數的地址 547
20.1.4 函數被掛鉤的過程 548
20.1.5 具體實現的代碼 549
20.2 函數導出表掛鉤 551
20.2.1 內核函數的種類 551
20.2.2 掛鉤IoCallDriver 553
20.2.3 對跳轉地址進行修改 554
20.3 Windows 7系統下IofCallDriver的
跟蹤 555
20.4 Windows 7系統下內聯掛鉤 558
20.4.1 寫入跳轉指令并拷貝代碼 558
20.4.2 實現中繼函數 560
20.5 中斷與中斷掛鉤 562
20.5.1 IA-32體系結構中的中斷 562
20.5.2 中斷處理過程 563
20.5.3 64位模式下的中斷處理機制 564
20.5.4 多核下的中斷 565
20.5.5 Windows中斷機制 570
20.5.6 IDT Hook 573
20.5.7 IDT Hook實現安全防護 574
第21章 Windows通知與回調 577
21.1 Windows的事件通知與回調 577
21.2 常用的事件通知 577
21.2.1 創建進程通知 578
21.2.2 創建線程通知 582
21.2.3 加載模塊通知 583
21.2.4 注冊表操作通知 586
21.3 Windows回調機制 592
21.3.1 回調對象 593
21.3.2 回調對象的創建 593
21.3.3 回調對象的注冊 594
21.3.4 回調的通告 595
21.4 安全的死角,回調的應用 595
第22章 保護進程 597
22.1 內核對象簡介 597
22.2 內核對象的結構 598
22.3 保護內核對象 599
22.3.1 處理對象的打開 600
22.3.2 處理句柄的復制 601
22.3.3 處理句柄的繼承 603
22.4 進程的保護 609
22.4.1 保護原理 609
22.4.2 Vista以后的進程對象保護 611
22.4.3 進程的其他保護 612
第23章 代碼注入與防注入 613
23.1 注入與防注入簡介 613
23.2 常用的注入方式 614
23.3 主動注入 614
23.3.1 AppInit注入 615
23.3.2 SPI注入 618
23.3.3 消息事件注入 620
23.3.4 其他注入 621
23.4 被動注入 621
23.4.1 遠線程注入 621
23.4.2 APC注入 622
23.4.3 父子進程注入 623
23.5 防注入 624
23.5.1 防止主動注入 624
23.5.2 防止被動注入 629
23.6 總結 630
附錄A 如何使用本書的源碼 631
附錄B 練習題 634
序: