-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
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書號: 41721
詢問書籍請說出此書號!

缺書
不接受訂購

出版日:6/1/2015
頁數:684
光碟數:1
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
不接受訂購
ISBN:9787121262159
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

本書的前身是《天書夜讀——從匯編語言到Windows內核編程》和《寒江獨釣——Windows內核安全編程》。實際上,本書相當于這兩本書(重寫和充實了不少章節)的合體。因為這兩本書講述的內容本來就是同一類技術,只不過各有側重,合并成一本書之后體系更加完整了。
與Windows客戶端安全軟件開發相關的驅動程序開發是本書的主題。因為這些驅動程序都運行在Windows內核中,所以本書稱為《Windows內核安全與驅動開發》。這些驅動程序主要分成三大類:第一類是串口、鍵盤等輸入/輸出設備驅動程序;第二類是硬盤、文件系統驅動程序;第三類是網絡驅動程序。覆蓋了客戶端安全的Windows編程中所涉及的各種驅動程序。書中的程序使用環境從32位到64位,從Windows XP到Windows 8都有涉及,大部分程序不經過修改即可在Windows 10上運行。同時本書也深入淺出地介紹了進行內核安全編程所需要的操作系統、匯編等基礎知識。
與前身相比,本書重新排布了章節,主體上分為三個部分。第一個部分為“基礎篇”,囊括了驅動開發的基礎知識,降低了入門的難度;第二個部分為“開發篇”,包含了在實際工作中可能遇到的各種開發需求的技術實現;第三個部分是“高級篇”,匯編語言、操作系統原理、處理器體系架構相關的內容都放在了本篇中介紹。本篇內容對讀者來說可能會感覺比較困難,但由于有前兩篇的基礎,相信讀者不會太難以跨越。
本書是由長期從事這個行業的工程師自己寫的,所以處處以實用為準。對細節的考究主要體現在對實際問題的解決,而不是知識的詳盡程度上。有些讀者可能會覺得這不太像一本“教科書”,在某些細節點上很有“囫圇吞棗”的嫌疑。當然,本書本來就不是教科書,但它是可以用來學習的。只是學習的方法,以實際應用為唯一的動力。
以前常有讀者和我交流。我發現最常問的問題是:“我對內核編程有興趣,請問應該如何學習呢?”
學習的方法應該根據每個人不同的需要有所不同。每個人性格不同,學習的路線也會不一樣。比如有的人就擅長計劃,他們會先制定周全的步驟,然后按部就班地執行。先從有經驗的人那里討教“如何學習”也是步驟之一。我曾很努力地想這樣去做,但總是沒有足夠的毅力而失敗。所以我成了一個隨波逐流、隨遇而安的家伙。我的學習都是迫不得已,沒有計劃和方法可言。所以被問到這個問題時,我只能說,我都是在解決實際問題的過程中學習的。這個風格也被帶到了本書中。
在讀大學的時候,我對驅動開發并無任何概念,我也不為此擔心。什么時候我會需要為一個硬件去編寫驅動程序呢?這不是硬件廠商的事嗎?我為一家硬件廠商工作的機會本來就低,更何況幾千個員工里輪到我去寫驅動的概率更是低到不可思議的程度。但世事就這么難料。我剛進第一家公司,自以為VC 6.0用得多么熟練,準備大干一場的時候,老板說:“我這里有個無盤驅動,你去做試試看……”
當時,他們需要的是一種類似“網絡鄰居”的共享盤。硬盤的主體在服務器上,上面有很多文件共享給所有的客戶機。Windows本身的“網絡鄰居”不足以滿足全部需求。他們要求每個客戶機對這個磁盤都有讀寫的權力,可以新建、修改或者刪除磁盤上的文件。如果直接用Windows的目錄共享,很快這個磁盤上的文件就會被修改得亂七八糟。所以另一個要求是,任何人都可以修改,但任何人的修改都不得影響他人。
這聽起來有點怪,其實很簡單。大家共享一臺服務器的磁盤上的所有文件,但各自對這些文件的修改都保存到本地。雖然聽起來是很合理、簡潔的一個需求,但是對我來說卻完全摸不著頭腦。我寫過很多程序,但還從未寫過一個東西能讓計算機的硬盤的行為發生改變。這是因為我一直只會寫用戶軟件,從沒動過操作系統。
操作系統非常努力地提供了完善的功能,來應付各種用戶的需求。但用戶的需求真是取之不盡、用之不竭的,僅僅一家開發操作系統的公司,永遠也無法滿足用戶的需求。是否允許第三方擁有操作系統的權限來滿足這些需求呢?這就形成了兩種截然不同的應對方案:Windows是允許的,任何第三方都可以通過開發驅動程序的形式來改變系統內核的行為;而像蘋果的iOS這種操作系統是完全禁止的。
為了證明我的價值足夠保底薪水,我不得不開始研究這個東西怎么實現。它肯定不是我以前實現過的任何一類工程。當時還是Windows 9x的時代,資料奇缺,甚至連開發用的工具包都不知道去哪里找。具體的過程我已經記不太清了,侯捷翻譯后又免費放出電子版的一本專門講VXD的書起了很大的作用。
最后我把這個東西做了出來。那時,我每天加班到晚上,早晨一睜眼就想往公司里趕。我敢保證任何人換了是我也會一樣:第一次參加工作,到手的第一個任務,誰都想證實自己的價值。我不記得有多少知識被我“囫圇吞棗”了,但我確實滿足了用戶的需求。離奇的是,那時我還根本不會用WinDbg,整個過程只靠“藍屏試驗”,壓根就沒像樣地調試過。這根本無須任何學習方法。在有如此強烈需求的境況下,一切的不合理都會順理成章。
開發驅動程序類似于為普通的軟件開發一個“組件”。與別人約定好調用的接口,你就可以和別人協同合作,開發一個“dll”之類的組件去給別人使用。對操作系統內核也是如此,只不過這個接口由操作系統硬性規定,容不得協商。
在那個項目中我們寫了種種功能來“愚弄”操作系統。這聽起來像是一個磁盤相關的驅動,實際上卻是一個文件系統過濾驅動。它過濾文件系統的行為,比如:讀取文件時,我們讓操作系統以為在操作普通的本地文件系統,其實卻是去網絡上取文件內容;而修改文件時,我們也讓操作系統以為修改成功了,實際上數據并沒有寫入到網絡上的服務器中,而是寫到本地了。這是我第一次接觸這類驅動程序。
有了這些項目的經驗,后來就有了《天書夜讀——從匯編語言到Windows內核編程》《寒江獨釣——Windows內核安全編程》之類的書,也有了本書。雖然這個跨度有點長,一晃七八年過去了,但這和我的拖拖拉拉有很大的關系。《寒江獨釣——Windows內核安全編程》絕版之后,編輯一直催促我修改出新的版本。但我繼續磨蹭,直到我到了騰訊電腦管家的團隊,這里遇到的優秀同事愿意幫我整理已經亂七八糟的稿子,并填充最新的章節,最后耐心地審校和完善代碼,本書才能最終得以面世。至于如何學習,我已經說了自己的糟糕的例子。我可以大概總結如下:
有計劃和毅力是最好的。耐心地讀完本書,調通上邊所有的例子。雖然工作中不一定真會用到,但里面的東西都是別人實際用到過的。
沒有必要害怕接受自己不熟悉的工作任務。泰山壓頂的工作壓力也是學習最好的動力——好吧,因為我沒有前面一條,所以這一條就成了我唯一的動力了。碰到急需完成的任務,本書上有時也有可以參考的現成代碼,不妨翻一翻看看。懂不懂沒關系,先用了再說。
理想是美好的,可以創造一些令人意外的東西。但最后還是要著眼于實際。
寫代碼是一件很爽快的事,但調代碼會很煩。讀者如果買了本書并且打算從事這方面的工作,希望不要為調試的各種困難而煩躁,因為以后這就是工作的主要部分了。我因為第一個任務的緣故,一不小心就陷入十多年。開頭幾年里大多數時間我都很煩躁,常常被BUG逼得感覺走投無路。現在好多了,差不多有七分自信能將事做成。當然,剩下三分還是要靠天意的。

譚文
2015年5月
內容簡介:

(含CD光盤1張)本書的前身是《天書夜讀——從匯編語言到Windows內核編程》和《寒江獨釣——Windows內核安全編程》。與Windows客戶端安全軟件開發相關的驅動程序開發是本書的主題。書中的程序使用環境從32位到64位,從Windows XP到Windows 8都有涉及,大部分程序不經過修改即可在Windows 10上運行。同時本書也深入淺出地介紹了進行內核安全編程所需要的操作系統、匯編等基礎知識。
本書共分三篇,基礎篇囊括了驅動開發的基礎知識,降低了入門的難度;開發篇介紹了在實際工作中可能遇到的各種開發需求的技術實現,包括:串口的過濾、鍵盤的過濾、磁盤的虛擬、磁盤的過濾、文件系統的過濾與監控、文件系統透明加密、文件系統微過濾驅動、網絡傳輸層過濾、Windows過濾平臺、NDIS協議驅動、NDIS小端口驅動、NDIS中間層驅動、IA-32匯編基礎、IA-32體系中的內存地址、處理器權限級別切換、IA-32體系結構中的中斷和Windows內核掛鉤;高級篇包含了匯編語言、操作系統原理、處理器體系架構相關的內容。本書是由長期從事這個行業的工程師自己寫的,所以處處以實用為準。對細節的考究主要體現在對實際問題的解決,而不是知識的詳盡程度上。

目錄:

基 礎 篇

第1章 內核上機指導 2
1.1 下載和使用WDK 2
1.1.1 下載并安裝WDK 2
1.1.2 編寫第一個C文件 4
1.1.3 編譯一個工程 5
1.2 安裝與運行 6
1.2.1 下載一個安裝工具 6
1.2.2 運行與查看輸出信息 7
1.2.3 在虛擬機中運行 8
1.3 調試內核模塊 9
1.3.1 下載和安裝WinDbg 9
1.3.2 設置Windows XP調試執行 9
1.3.3 設置Vista調試執行 10
1.3.4 設置VMware的管道虛擬串口 11
1.3.5 設置Windows內核符號表 12
1.3.6 實戰調試first 13
第2章 內核編程環境及其特殊性 16
2.1 內核編程的環境 16
2.1.1 隔離的應用程序 16
2.1.2 共享的內核空間 17
2.1.3 無處不在的內核模塊 18
2.2 數據類型 19
2.2.1 基本數據類型 19
2.2.2 返回狀態 19
2.2.3 字符串 20
2.3 重要的數據結構 21
2.3.1 驅動對象 21
2.3.2 設備對象 22
2.3.3 請求 24
2.4 函數調用 25
2.4.1 查閱幫助 25
2.4.2 幫助中有的幾類函數 26
2.4.3 幫助中沒有的函數 28
2.5 Windows的驅動開發模型 29
2.6 WDK編程中的特殊點 30
2.6.1 內核編程的主要調用源 30
2.6.2 函數的多線程安全性 30
2.6.3 代碼的中斷級 32
2.6.4 WDK中出現的特殊代碼 32
第3章 字符串與鏈表 35
3.1 字符串操作 35
3.1.1 使用字符串結構 35
3.1.2 字符串的初始化 36
3.1.3 字符串的拷貝 37
3.1.4 字符串的連接 38
3.1.5 字符串的打印 38
3.2 內存與鏈表 40
3.2.1 內存的分配與釋放 40
3.2.2 使用LIST_ENTRY 41
3.2.3 使用長長整型數據 43
3.3 自旋鎖 44
3.3.1 使用自旋鎖 44
3.3.2 在雙向鏈表中使用自旋鎖 45
3.3.3 使用隊列自旋鎖提高性能 46
第4章 文件、注冊表、線程 47
4.1 文件操作 47
4.1.1 使用OBJECT_ATTRIBUTES 47
4.1.2 打開和關閉文件 48
4.1.3 文件讀/寫操作 51
4.2 注冊表操作 53
4.2.1 注冊表鍵的打開 53
4.2.2 注冊表鍵值的讀 55
4.2.3 注冊表鍵值的寫 57
4.3 時間與定時器 58
4.3.1 獲得當前“滴答”數 58
4.3.2 獲得當前系統時間 58
4.3.3 使用定時器 59
4.4 線程與事件 62
4.4.1 使用系統線程 62
4.4.2 在線程中睡眠 63
4.4.3 使用同步事件 64
第5章 應用與內核通信 67
5.1 內核方面的編程 68
5.1.1 生成控制設備 68
5.1.2 控制設備的名字和符號鏈接 70
5.1.3 控制設備的刪除 71
5.1.4 分發函數 72
5.1.5 請求的處理 73
5.2 應用方面的編程 74
5.2.1 基本的功能需求 74
5.2.2 在應用程序中打開與關閉設備 75
5.2.3 設備控制請求 75
5.2.4 內核中的對應處理 77
5.2.5 結合測試的效果 79
5.3 阻塞、等待與安全設計 80
5.3.1 驅動主動通知應用 80
5.3.2 通信接口的測試 81
5.3.3 內核中的緩沖區鏈表結構 83
5.3.4 輸入:內核中的請求處理中的安全檢查 84
5.3.5 輸出處理與卸載清理 85
第6章 64位和32位內核開發差異 88
6.1 64位系統新增機制 88
6.1.1 WOW64子系統 88
6.1.2 PatchGuard技術 91
6.1.3 64位驅動的編譯、安裝與運行 91
6.2 編程差異 92
6.2.1 匯編嵌入變化 92
6.2.2 預處理與條件編譯 93
6.2.3 數據結構調整 93
開 發 篇

第7章 串口的過濾 96
7.1 過濾的概念 96
7.1.1 設備綁定的內核API之一 97
7.1.2 設備綁定的內核API之二 98
7.1.3 生成過濾設備并綁定 98
7.1.4 從名字獲得設備對象 100
7.1.5 綁定所有串口 101
7.2 獲得實際數據 102
7.2.1 請求的區分 102
7.2.2 請求的結局 103
7.2.3 寫請求的數據 104
7.3 完整的代碼 105
7.3.1 完整的分發函數 105
7.3.2 如何動態卸載 106
7.3.3 代碼的編譯與運行 107
第8章 鍵盤的過濾 109
8.1 技術原理 110
8.1.1 預備知識 110
8.1.2 Windows中從擊鍵到內核 110
8.1.3 鍵盤硬件原理 112
8.2 鍵盤過濾的框架 112
8.2.1 找到所有的鍵盤設備 112
8.2.2 應用設備擴展 115
8.2.3 鍵盤過濾模塊的DriverEntry 117
8.2.4 鍵盤過濾模塊的動態卸載 117
8.3 鍵盤過濾的請求處理 119
8.3.1 通常的處理 119
8.3.2 PNP的處理 120
8.3.3 讀的處理 121
8.3.4 讀完成的處理 122
8.4 從請求中打印出按鍵信息 123
8.4.1 從緩沖區中獲得KEYBOARD_INPUT_DATA 123
8.4.2 從KEYBOARD_INPUT_DATA中得到鍵 124
8.4.3 從MakeCode到實際字符 124
8.5 Hook分發函數 126
8.5.1 獲得類驅動對象 126
8.5.2 修改類驅動的分發函數指針 127
8.5.3 類驅動之下的端口驅動 128
8.5.4 端口驅動和類驅動之間的協作機制 129
8.5.5 找到關鍵的回調函數的條件 129
8.5.6 定義常數和數據結構 130
8.5.7 打開兩種鍵盤端口驅動尋找設備 131
8.5.8 搜索在KbdClass類驅動中的地址 133
8.6 Hook鍵盤中斷反過濾 135
8.6.1 中斷:IRQ和INT 136
8.6.2 如何修改IDT 136
8.6.3 替換IDT中的跳轉地址 137
8.6.4 QQ的PS/2反過濾措施 139
8.7 直接用端口操作鍵盤 139
8.7.1 讀取鍵盤數據和命令端口 139
8.7.2 p2cUserFilter的最終實現 140
第9章 磁盤的虛擬 143
9.1 虛擬的磁盤 143
9.2 一個具體的例子 143
9.3 入口函數 144
9.3.1 入口函數的定義 144
9.3.2 Ramdisk驅動的入口函數 145
9.4 EvtDriverDeviceAdd函數 146
9.4.1 EvtDriverDeviceAdd的定義 146
9.4.2 局部變量的聲明 146
9.4.3 磁盤設備的創建 147
9.4.4 如何處理發往設備的請求 148
9.4.5 用戶配置的初始化 149
9.4.6 鏈接給應用程序 151
9.4.7 小結 152
9.5 FAT12/16磁盤卷初始化 152
9.5.1 磁盤卷結構簡介 152
9.5.2 Ramdisk對磁盤的初始化 154
9.6 驅動中的請求處理 160
9.6.1 請求的處理 160
9.6.2 讀/寫請求 160
9.6.3 DeviceIoControl請求 162
9.7 Ramdisk的編譯和安裝 164
9.7.1 編譯 164
9.7.2 安裝 164
9.7.3 對安裝的深入探究 165
第10章 磁盤的過濾 167
10.1 磁盤過濾驅動的概念 167
10.1.1 設備過濾和類過濾 167
10.1.2 磁盤設備和磁盤卷設備過濾驅動 167
10.1.3 注冊表和磁盤卷設備過濾驅動 168
10.2 具有還原功能的磁盤卷過濾驅動 168
10.2.1 簡介 168
10.2.2 基本思想 169
10.3 驅動分析 169
10.3.1 DriverEntry函數 169
10.3.2 AddDevice函數 170
10.3.3 PnP請求的處理 174
10.3.4 Power請求的處理 178
10.3.5 DeviceIoControl請求的處理 178
10.3.6 bitmap的作用和分析 182
10.3.7 boot驅動完成回調函數和稀疏文件 187
10.3.8 讀/寫請求的處理 190
第11章 文件系統的過濾與監控 199
11.1 文件系統的設備對象 200
11.1.1 控制設備與卷設備 200
11.1.2 生成自己的一個控制設備 201
11.2 文件系統的分發函數 202
11.2.1 普通的分發函數 202
11.2.2 文件過濾的快速IO分發函數 203
11.2.3 快速IO分發函數的一個實現 205
11.2.4 快速IO分發函數逐個簡介 206
11.3 設備的綁定前期工作 207
11.3.1 動態地選擇綁定函數 207
11.3.2 注冊文件系統變動回調 208
11.3.3 文件系統變動回調的一個實現 209
11.3.4 文件系統識別器 211
11.4 文件系統控制設備的綁定 212
11.4.1 生成文件系統控制設備的過濾設備 212
11.4.2 綁定文件系統控制設備 213
11.4.3 利用文件系統控制請求 215
11.5 文件系統卷設備的綁定 217
11.5.1 從IRP中獲得VPB指針 217
11.5.2 設置完成函數并等待IRP完成 218
11.5.3 卷掛載IRP完成后的工作 221
11.5.4 完成函數的相應實現 223
11.5.5 綁定卷的實現 224
11.6 讀/寫操作的過濾 226
11.6.1 設置一個讀處理函數 226
11.6.2 設備對象的區分處理 227
11.6.3 解析讀請求中的文件信息 228
11.6.4 讀請求的完成 230
11.7 其他操作的過濾 234
11.7.1 文件對象的生存周期 234
11.7.2 文件的打開與關閉 235
11.7.3 文件的刪除 237
11.8 路徑過濾的實現 238
11.8.1 取得文件路徑的三種情況 238
11.8.2 打開成功后獲取路徑 238
11.8.3 在其他時刻獲得文件路徑 240
11.8.4 在打開請求完成之前獲得路徑名 240
11.8.5 把短名轉換為長名 242
11.9 把sfilter編譯成靜態庫 243
11.9.1 如何方便地使用sfilter 243
11.9.2 初始化回調、卸載回調和綁定回調 244
11.9.3 綁定與回調 245
11.9.4 插入請求回調 246
11.9.5 如何利用sfilter.lib 249
第12章 文件系統透明加密 252
12.1 文件透明加密的應用 252
12.1.1 防止企業信息泄密 252
12.1.2 文件透明加密防止企業信息泄密 253
12.1.3 文件透明加密軟件的例子 253
12.2 區分進程 254
12.2.1 機密進程與普通進程 254
12.2.2 找到進程名字的位置 255
12.2.3 得到當前進程的名字 256
12.3 內存映射與文件緩沖 257
12.3.1 記事本的內存映射文件 257
12.3.2 Windows的文件緩沖 258
12.3.3 文件緩沖:明文還是密文的選擇 259
12.3.4 清除文件緩沖 260
12.4 加密標識 263
12.4.1 保存在文件外、文件頭還是文件尾 263
12.4.2 隱藏文件頭的大小 264
12.4.3 隱藏文件頭的設置偏移 266
12.4.4 隱藏文件頭的讀/寫偏移 267
12.5 文件加密表 267
12.5.1 何時進行加密操作 267
12.5.2 文件控制塊與文件對象 268
12.5.3 文件加密表的數據結構與初始化 269
12.5.4 文件加密表的操作:查詢 270
12.5.5 文件加密表的操作:添加 271
12.5.6 文件加密表的操作:刪除 272
12.6 文件打開處理 273
12.6.1 直接發送IRP進行查詢與設置操作 274
12.6.2 直接發送IRP進行讀/寫操作 276
12.6.3 文件的非重入打開 277
12.6.4 文件的打開預處理 280
12.7 讀/寫加密和解密 285
12.7.1 在讀取時進行解密 285
12.7.2 分配與釋放MDL 286
12.7.3 寫請求加密 287
12.8 crypt_file的組裝 289
12.8.1 crypt_file的初始化 289
12.8.2 crypt_file的IRP預處理 290
12.8.3 crypt_file的IRP后處理 293
第13章 文件系統微過濾驅動 297
13.1 文件系統微過濾驅動簡介 297
13.1.1 文件系統微過濾驅動的由來 297
13.1.2 Minifilter的優點與不足 298
13.2 Minifilter的編程框架 298
13.2.1 微文件系統過濾的注冊 299
13.2.2 微過濾器的數據結構 300
13.2.3 卸載回調函數 303
13.2.4 預操作回調函數 303
13.2.5 后操作回調函數 306
13.2.6 其他回調函數 307
13.3 Minifilter如何與應用程序通信 309
13.3.1 建立通信端口的方法 310
13.3.2 在用戶態通過DLL使用通信端口的范例 311
13.4 Minifilter的安裝與加載 314
13.4.1 安裝Minifilter的INF文件 314
13.4.2 啟動安裝完成的Minifilter 316
第14章 網絡傳輸層過濾 317
14.1 TDI概要 317
14.1.1 為何選擇TDI 317
14.1.2 從socket到Windows內核 318
14.1.3 TDI過濾的代碼例子 319
14.2 TDI的過濾框架 319
14.2.1 綁定TDI的設備 319
14.2.2 唯一的分發函數 320
14.2.3 過濾框架的實現 322
14.2.4 主要過濾的請求類型 323
14.3 生成請求:獲取地址 324
14.3.1 過濾生成請求 324
14.3.2 準備解析IP地址與端口 326
14.3.3 獲取生成的IP地址和端口 327
14.3.4 連接終端的生成與相關信息的保存 329
14.4 控制請求 330
14.4.1 TDI_ASSOCIATE_ADDRESS的過濾 330
14.4.2 TDI_CONNECT的過濾 332
14.4.3 其他的次功能號 333
14.4.4 設置事件的過濾 334
14.4.5 TDI_EVENT_CONNECT類型的設置事件的過濾 336
14.4.6 直接獲取發送函數的過濾 337
14.4.7 清理請求的過濾 339
14.5 本書例子tdifw.lib的應用 341
14.5.1 tdifw庫的回調接口 341
14.5.2 tdifw庫的使用例子 342
第15章 Windows過濾平臺 345
15.1 WFP簡介 345
15.2 WFP框架 345
15.3 基本對象模型 347
15.3.1 過濾引擎 347
15.3.2 墊片 347
15.3.3 呼出接口 347
15.3.4 分層 348
15.3.5 子層 349
15.3.6 過濾器 350
15.3.7 呼出接口回調函數 354
15.4 WFP操作 359
15.4.1 呼出接口的注冊與卸載 360
15.4.2 呼出接口的添加與移除 360
15.4.3 子層的添加與移除 361
15.4.4 過濾器的添加 362
15.5 WFP過濾例子 362
第16章 NDIS協議驅動 370
16.1 以太網包和網絡驅動架構 370
16.1.1 以太網包和協議驅動 370
16.1.2 NDIS網絡驅動 371
16.2 協議驅動的DriverEntry 372
16.2.1 生成控制設備 372
16.2.2 注冊協議 374
16.3 協議與網卡的綁定 375
16.3.1 協議與網卡的綁定概念 375
16.3.2 綁定回調處理的實現 376
16.3.3 協議綁定網卡的API 378
16.3.4 解決綁定競爭問題 379
16.3.5 分配接收和發送的包池與緩沖池 380
16.3.6 OID請求的發送和請求完成回調 381
16.3.7 ndisprotCreateBinding的最終實現 385
16.4 綁定的解除 390
16.4.1 解除綁定使用的API 390
16.4.2 ndisprotShutdownBinding的實現 392
16.5 在用戶態操作協議驅動 395
16.5.1 協議的收包與發包 395
16.5.2 在用戶態編程打開設備 396
16.5.3 用DeviceIoControl發送控制請求 397
16.5.4 用WriteFile發送數據包 399
16.5.5 用ReadFile發送數據包 400
16.6 在內核態完成功能的實現 402
16.6.1 請求的分發與實現 402
16.6.2 等待設備綁定完成與指定設備名 402
16.6.3 指派設備的完成 403
16.6.4 處理讀請求 406
16.6.5 處理寫請求 408
16.7 協議驅動的接收回調 412
16.7.1 和接收包有關的回調函數 412
16.7.2 ReceiveHandler的實現 413
16.7.3 TransferDataCompleteHandler的實現 417
16.7.4 ReceivePacketHandler的實現 418
16.7.5 接收數據包的入隊 420
16.7.6 接收數據包的出隊和讀請求的完成 422
第17章 NDIS小端口驅動 427
17.1 小端口驅動的應用與概述 427
17.1.1 小端口驅動的應用 427
17.1.2 小端口驅動示例 428
17.1.3 小端口驅動的運作與編程概述 429
17.2 小端口驅動的初始化 429
17.2.1 小端口驅動的DriverEntry 429
17.2.2 小端口驅動的適配器結構 431
17.2.3 配置信息的讀取 433
17.2.4 設置小端口適配器上下文 433
17.2.5 MPInitialize的實現 434
17.2.6 MPHalt的實現 437
17.3 打開ndisprot設備 438
17.3.1 IO目標 438
17.3.2 給IO目標發送DeviceIoControl請求 439
17.3.3 打開ndisprot接口并完成配置設備 441
17.4 使用ndisprot發送包 443
17.4.1 小端口驅動的發包接口 443
17.4.2 發送控制塊(TCB) 444
17.4.3 遍歷包組并填寫TCB 446
17.4.4 寫請求的構建與發送 449
17.5 使用ndisprot接收包 451
17.5.1 提交數據包的內核API 451
17.5.2 從接收控制塊(RCB)提交包 452
17.5.3 對ndisprot讀請求的完成函數 454
17.5.4 讀請求的發送 456
17.5.5 用于讀包的WDF工作任務 457
17.5.6 ndisedge讀工作任務的生成與入列 459
17.6 其他的特征回調函數的實現 461
17.6.1 包的歸還 461
17.6.2 OID查詢處理的直接完成 462
17.6.3 OID設置處理 465
第18章 NDIS中間層驅動 467
18.1 NDIS中間層驅動概述 467
18.1.1 Windows網絡架構總結 467
18.1.2 NDIS中間層驅動簡介 468
18.1.3 NDIS中間層驅動的應用 469
18.1.4 NDIS包描述符結構深究 470
18.2 中間層驅動的入口與綁定 473
18.2.1 中間層驅動的入口函數 473
18.2.2 動態綁定NIC設備 474
18.2.3 小端口初始化(MpInitialize) 475
18.3 中間層驅動發送數據包 477
18.3.1 發送數據包原理 477
18.3.2 包描述符“重利用” 478
18.3.3 包描述符“重申請” 481
18.3.4 發送數據包的異步完成 482
18.4 中間層驅動接收數據包 484
18.4.1 接收數據包概述 484
18.4.2 用PtReceive接收數據包 485
18.4.3 用PtReceivePacket接收 490
18.4.4 對包進行過濾 491
18.5 中間層驅動程序查詢和設置 494
18.5.1 查詢請求的處理 494
18.5.2 設置請求的處理 496
18.6 NDIS句柄 498
18.6.1 不可見的結構指針 498
18.6.2 常見的NDIS句柄 499
18.6.3 NDIS句柄誤用問題 500
18.6.4 一種解決方案 502
18.7 生成普通控制設備 503
18.7.1 在中間層驅動中添加普通設備 503
18.7.2 使用傳統方法來生成控制設備 505
第19章 IA-32匯編基礎 511
19.1 x86內存、寄存器與堆棧 511
19.1.1 _asm關鍵字 511
19.1.2 x86中的mov指令 512
19.1.3 x86中的寄存器與內存 512
19.1.4 賦值語句的實現 513
19.2 x86中函數的實現 514
19.2.1 一個函數的例子 514
19.2.2 堆棧的介紹 515
19.2.3 寄存器的備份和恢復 516
19.2.4 內部變量與返回值 518
19.3 x86中函數的調用與返回 521
19.3.1 函數的調用指令call 521
19.3.2 通過堆棧傳遞參數 521
19.3.3 從函數返回 523
19.3.4 三種常見的調用協議 524
19.4 從32位匯編到64位匯編 526
19.4.1 Intel 64與IA-32體系架構簡介 526
19.4.2 64位指令與32位指令 526
19.4.3 通用寄存器 527
19.5 64位下的函數實現 528
19.5.1 函數概覽 528
19.5.2 32位參數的傳遞 529
19.5.3 64位參數與返回值 530
19.5.4 棧空間的開辟與恢復 531
第20章 IA-32體系中的內存地址 534
20.1 內存的虛擬地址 534
20.1.1 C語言中的內存地址 534
20.1.2 虛擬地址的構成 535
20.1.3 段的選擇 536
20.2 全局描述符表和段描述符 538
20.2.1 全局描述符表 538
20.2.2 段類型 539
20.2.3 段寄存器與段選擇子 540
20.2.4 64位模式下的段 541
20.3 分段編程實踐 542
20.3.1 系統表寄存器的結構 542
20.3.2 在匯編語言中獲取全局描述表的位置 543
20.3.3 調試范例:sgdt指令的錯誤使用 545
20.3.4 在64位下獲得全局描述符表 547
20.4 線性地址基礎 549
20.4.1 分頁控制機制 550
20.4.2 線性地址的轉換 551
20.4.3 混合頁面大小 552
20.4.4 32位物理地址的頁目錄和頁表項 552
20.5 各種特殊分頁方式 555
20.5.1 PAE分頁方式 555
20.5.2 PSE-36分頁機制 558
20.5.3 IA-32e模式下的線性地址 559
20.6 分頁編程實踐 562
20.6.1 頁目錄和頁目錄指針表的獲取 562
20.6.2 頁表的獲取 564
20.6.3 線性地址的結構 567
第21章 處理器權限級別切換 571
21.1 Ring0和Ring3權限級別 571
21.2 保護模式下的分頁內存保護 572
21.3 分頁內存不可執行保護 574
21.3.1 不可執行保護原理 574
21.3.2 不可執行保護的漏洞 575
21.3.3 上機實踐 577
21.4 權限級別的切換 579
21.4.1 調用門及其漏洞 579
21.4.2 sysenter和sysexit指令 581
21.4.3 上機實踐 583
第22章 IA-32體系結構中的中斷 585
22.1 中斷基礎知識 585
22.1.1 中斷描述符表 585
22.1.2 中斷處理過程 587
22.1.3 64位模式下的中斷處理機制 589
22.1.4 多核下的中斷 589
22.2 Windows中斷機制 593
22.3 中斷編程實踐 596
22.3.1 IDT Hook 596
22.3.2 巧用IDT Hook實現安全防護 598
第23章 Windows內核掛鉤 601
23.1 系統服務描述符表掛鉤 602
23.1.1 系統服務描述符表(SSDT) 602
23.1.2 系統服務描述符表掛鉤的意圖 603
23.1.3 尋找要掛鉤的函數的地址 604
23.1.4 函數被掛鉤的過程 605
23.1.5 具體實現的代碼 606
23.2 函數導出表掛鉤 608
23.2.1 內核函數的種類 608
23.2.2 掛鉤IoCallDriver 610
23.2.3 對跳轉地址進行修改 611
23.3 Windows 7系統下IofCallDriver的跟蹤 612
23.4 Windows 7系統下內聯掛鉤 615
23.4.1 寫入跳轉指令并拷貝代碼 615
23.4.2 實現中繼函數 617
高 級 篇

第24章 Windows通知與回調 620
24.1 Windows的事件通知與回調 620
24.2 常用的事件通知 620
24.2.1 創建進程通知 621
24.2.2 創建線程通知 625
24.2.3 加載模塊通知 626
24.2.4 注冊表操作通知 629
24.3 Windows回調機制 636
24.3.1 回調對象 636
24.3.2 回調對象的創建 637
24.3.3 回調對象的注冊 637
24.3.4 回調的通告 638
24.4 安全的死角,回調的應用 639
第25章 保護進程 640
25.1 內核對象簡介 640
25.2 內核對象的結構 641
25.3 保護內核對象 642
25.3.1 處理對象的打開 643
25.3.2 處理句柄的復制 644
25.3.3 處理句柄的繼承 646
25.4 進程的保護 652
25.4.1 保護原理 652
25.4.2 Vista以后的進程對象保護 654
25.4.3 進程的其他保護 655
附錄A 如何使用本書的源碼光盤 656
附錄B 練習題 659
序: