寒江獨釣:Windows核心安全編程

寒江獨釣:Windows核心安全編程

《寒江獨釣:Windows核心安全編程》是2009年發表於網路的圖書,作者是譚文。

基本介紹

  • 書名:寒江獨釣:Windows核心安全編程
  • 作者:譚文
  • ISBN:9787121087967
  • 頁數:516
  • 出版時間:2009-06
  • 開本:16(185*260)
  • 叢書名:驅網核心技術叢書
內容簡介,圖書目錄,

內容簡介

本書從Windows核心編程出發,全面介紹串口、鍵盤、磁碟、檔案系統、網路等相關的Windows核心模組的編程技術,以及基於這些技術的密碼保護、防毒引擎、檔案加密、網路嗅探、網路防火牆的具體實現。
對於驅動編程模型的選擇,本書同時兼顧WDM與WDF。 本書適合大專院校計算機系的學生、計算機編程愛好者、普通Windows程式設計師、Windows核心程式設計師、信息安全行業的程式設計師使用。閱讀本書,需要讀者有C語言、數據結構、作業系統和計算機網路的基礎知識。

圖書目錄

第1章 核心上機指導 1
Windows核心編程的動手有點麻煩,並不是僅僅安裝一個獨立的軟體(比如VC)之後就可以安然地開始編寫代碼,然後運行了。需要下載開發包、配置開發環境、準備調試工具,可能還需要一些小工具協同工作。這一步攔住了不少的初學者。本章以詳細圖文攻略,來引導讀者完成這一麻煩的步驟。
1.1 下載和使用WDK 2
1.1.1 下載安裝WDK 2
1.1.2 編寫第一個C檔案 3
1.1.3 編譯一個工程 5
1.2 安裝與運行 6
1.2.1 下載一個安裝工具 6
1.2.2 運行與查看輸出信息 7
1.2.3 在虛擬機中運行 9
1.3 調試核心模組 9
1.3.1 下載和安裝WinDbg 9
1.3.2 設定Windows XP調試執行 10
1.3.3 設定Vista調試執行 11
1.3.4 設定VMWare的管道虛擬串口 11
1.3.5 設定Windows核心符號表 13
1.3.6 實戰調試first 14
練習題 16
第2章 核心編程環境及其特殊性 17
編寫過驅動程式的讀者可能會很熟悉這一切,但是對只從事過應用程式的讀者而言,要理解核心編程環境的特殊性,就很需要一些功夫和悟性了。在應用程式中,多執行緒的情況已經帶來了一定理解的困難;而核心代碼呢?幾乎無時無刻不運行在多執行緒之下。它從哪裡開始?從哪裡結束?它在什麼進程內運行?這些問題一言難盡。
2.1 核心編程的環境 18
2.1.1 隔離的應用程式 18
2.1.2 共享的核心空間 19
2.1.3 無處不在的核心模組 20
2.2 數據類型 21
2.2.1 基本數據類型 21
2.2.2 返回狀態 22
2.2.3 字元串 23
2.3 重要的數據結構 23
2.3.1 驅動對象 23
2.3.2 設備對象 25
2.3.3 請求 26
2.4 函式調用 28
2.4.1 查閱幫助 28
2.4.2 幫助中有的幾類函式 30
2.4.3 幫助中沒有的函式 32
2.5 Windows的驅動開發模型 32
2.6 WDK編程中的特殊點 33
2.6.1 核心編程的主要調用源 33
2.6.2 函式的多執行緒安全性 34
2.6.3 代碼的中斷級 36
2.6.4 WDK中出現的特殊代碼 37
練習題 38
第3章 串口的過濾 40
在安全軟體的開發中,串口驅動的套用並不常見。但是本書以串口驅動作為第一個介紹的實例。為何?僅僅是因為串口簡單。從簡單的例子入手,可以為讀者帶來稍許輕鬆的感受。
3.1 過濾的概念 41
3.1.1 設備綁定的核心API之一 41
3.1.2 設備綁定的核心API之二 43
3.1.3 生成過濾設備並綁定 43
3.1.4 從名字獲得設備對象 45
3.1.5 綁定所有串口 46
3.2 獲得實際數據 47
3.2.1 請求的區分 47
3.2.2 請求的結局 48
3.2.3 寫請求的數據 49
3.3 完整的代碼 50
3.3.1 完整的分發函式 50
3.3.2 如何動態卸載 52
3.3.3 完整的代碼 53
本章的示例代碼 53
練習題 54
第4章 鍵盤的過濾 56
鍵盤是很重要的輸入設備!這是因為我們用鍵盤錄入信息、用鍵盤輸入密碼,甚至用鍵盤編程,也用鍵盤著書立說。對於黑客來說,使用龐大的計算機資源去破解那些堅不可摧的加密算法,哪如偷偷地記下用戶用鍵盤輸入的密鑰更加簡單呢?本章專注於鍵盤的保護。
4.1 技術原理 57
4.1.1 預備知識 57
4.1.2 Windows中從擊鍵到核心 58
4.1.3 鍵盤硬體原理 60
4.2 鍵盤過濾的框架 61
4.2.1 找到所有的鍵盤設備 61
4.2.2 套用設備擴展 64
4.2.3 鍵盤過濾模組的DriverEntry 65
4.2.4 鍵盤過濾模組的動態卸載 66
4.3 鍵盤過濾的請求處理 68
4.3.1 通常的處理 68
4.3.2 PNP的處理 69
4.3.3 讀的處理 70
4.3.4 讀完成的處理 71
4.4 從請求中列印出按鍵信息 72
4.4.1 從緩衝區中獲得KEYBOARD_INPUT_DATA 72
4.4.2 從KEYBOARD_INPUT_DATA中得到鍵 73
4.4.3 從MakeCode到實際字元 74
4.5 Hook分發函式 75
4.5.1 獲得類驅動對象 76
4.5.2 修改類驅動的分發函式指針 77
4.5.3 類驅動之下的連線埠驅動 78
4.5.4 連線埠驅動和類驅動之間的協作機制 79
4.5.5 找到關鍵的回調函式的條件 80
4.5.6 定義常數和數據結構 80
4.5.7 打開兩種鍵盤連線埠驅動尋找設備 81
4.5.8 搜尋在KbdClass類驅動中的地址 83
4.6 Hook鍵盤中斷反過濾 86
4.6.1 中斷:IRQ和INT 86
4.6.2 如何修改IDT 87
4.6.3 替換IDT中的跳轉地址 88
4.6.4 QQ的PS/2反過濾措施 90
4.7 利用IOAPIC重定位中斷處理函式 90
4.7.1 什麼是IOAPIC 90
4.7.2 如何訪問IOAPIC 91
4.7.3 編程修改IOAPIC重定位表 92
4.7.4 插入新的中斷處理 93
4.7.5 驅動入口和卸載的實現 95
4.8 直接用連線埠操作鍵盤 96
4.8.1 讀取鍵盤數據和命令連線埠 96
4.8.2 p2cUserFilter的最終實現 97
本章的示例代碼 98
練習題 99
第5章 磁碟的虛擬 100
CPU是計算機的核心,但是它不保存信息。如果它被竊,我們可以簡單地購買一個新的。但是如果裝滿了機密信息的硬碟被竊了,那可就不是買一個新的就能彌補得了的。本章介紹硬碟核心魔術:虛擬硬碟。虛擬硬碟可以不被盜竊者利用嗎?良好的設計可以做到這一點。
5.1 虛擬的磁碟 101
5.2 一個具體的例子 101
5.3 入口函式 102
5.3.1 入口函式的定義 102
5.3.2 Ramdisk驅動的入口函式 103
5.4 EvtDriverDeviceAdd函式 104
5.4.1 EvtDriverDeviceAdd的定義 104
5.4.2 局部變數的聲明 105
5.4.3 磁碟設備的創建 105
5.4.4 如何處理髮往設備的請求 107
5.4.5 用戶配置的初始化 108
5.4.6 連結給應用程式 110
5.4.7 小結 111
5.5 FAT12/16磁碟卷初始化 111
5.5.1 磁碟卷結構簡介 111
5.5.2 Ramdisk對磁碟的初始化 113
5.6 驅動中的請求處理 119
5.6.1 請求的處理 119
5.6.2 讀/寫請求 120
5.6.3 DeviceIoControl請求 122
5.7 Ramdisk的編譯和安裝 124
5.7.1 編譯 124
5.7.2 安裝 125
5.7.3 對安裝的深入探究 125
練習題 126
第6章 磁碟過濾 127
很多網咖的老闆、公司的IT管理部門以及讀者自己都很厭惡硬碟總是被病毒和木馬搞得一團糟。一些簡單的還原軟體可以搞定這個問題:重啟之後,對硬碟的修改都奇蹟般地消失了。這是怎么實現的呢?本章告訴您答案。
6.1 磁碟過濾驅動的概念 128
6.1.1 設備過濾和類過濾 128
6.1.2 磁碟設備和磁碟卷設備過濾驅動 128
6.1.3 註冊表和磁碟卷設備過濾驅動 129
6.2 具有還原功能的磁碟卷過濾驅動 129
6.2.1 簡介 129
6.2.2 基本思想 130
6.3 驅動分析 130
6.3.1 DriverEntry函式 130
6.3.2 AddDevice函式 132
6.3.3 PnP請求的處理 136
6.3.4 Power請求的處理 140
6.3.5 DeviceIoControl請求的處理 140
6.3.6 bitmap的作用和分析 144
6.3.7 boot驅動完成回調函式和稀疏檔案 150
6.3.8 讀/寫請求的處理 152
6.3.9 示例代碼 160
6.3.10 練習題 161
第7章 檔案系統的過濾與監控 162
硬碟是硬碟,而檔案系統是檔案系統,可是有的人總是把它們當做一回事。其實硬碟很簡單,硬碟就是一個很簡單的保存信息的盒子;而複雜的是檔案系統,它很精妙地把簡單的數據組織成複雜的檔案。作為信息安全的專家,我們當然不能讓檔案系統脫離我們的控制之外。
7.1 檔案系統的設備對象 163
7.1.1 控制設備與卷設備 163
7.1.2 生成自己的一個控制設備 165
7.2 檔案系統的分發函式 166
7.2.1 普通的分發函式 166
7.2.2 檔案過濾的快速IO分發函式 167
7.2.3 快速IO分發函式的一個實現 169
7.2.4 快速IO分發函式逐個簡介 170
7.3 設備的綁定前期工作 172
7.3.1 動態地選擇綁定函式 172
7.3.2 註冊檔案系統變動回調 173
7.3.3 檔案系統變動回調的一個實現 175
7.3.4 檔案系統識別器 176
7.4 檔案系統控制設備的綁定 177
7.4.1 生成檔案系統控制設備的過濾設備 177
7.4.2 綁定檔案系統控制設備 178
7.4.3 利用檔案系統控制請求 180
7.5 檔案系統卷設備的綁定 183
7.5.1 從IRP中獲得VPB指針 183
7.5.2 設定完成函式並等待IRP完成 184
7.5.3 卷掛載IRP完成後的工作 187
7.5.4 完成函式的相應實現 190
7.5.5 綁定卷的實現 191
7.6 讀/寫操作的過濾 193
7.6.1 設定一個讀處理函式 193
7.6.2 設備對象的區分處理 194
7.6.3 解析讀請求中的檔案信息 195
7.6.4 讀請求的完成 198
7.7 其他操作的過濾 202
7.7.1 檔案對象的生存周期 202
7.7.2 檔案的打開與關閉 203
7.7.3 檔案的刪除 205
7.8 路徑過濾的實現 206
7.8.1 取得檔案路徑的3種情況 206
7.8.2 打開成功後獲取路徑 207
7.8.3 在其他時刻獲得檔案路徑 209
7.8.4 在打開請求完成之前獲得路徑名 209
7.8.5 把短名轉換為長名 211
7.9 把sfilter編譯成靜態庫 212
7.9.1 如何方便地使用sfilter 212
7.9.2 初始化回調、卸載回調和綁定回調 213
7.9.3 綁定與回調 215
7.9.4 插入請求回調 216
7.9.5 如何利用sfilter.lib 218
本章的示例代碼 221
練習題 221
第8章 檔案系統透明加密 223
如何阻止企業的機密檔案被主動泄密,但是又不用關閉網路、禁止隨身碟等手段重重束縛大家?很多跡象表明,檔案系統透明加密是最優的選擇。既然從前一章讀者已經學會了控制檔案系統,那么現在,該是我們摩拳擦掌,用它來保護我們的機密信息的時候了。
8.1 檔案透明加密的套用 224
8.1.1 防止企業信息泄密 224
8.1.2 檔案透明加密防止企業信息泄密 224
8.1.3 檔案透明加密軟體的例子 225
8.2 區分進程 226
8.2.1 機密進程與普通進程 226
8.2.2 找到進程名字的位置 227
8.2.3 得到當前進程的名字 228
8.3 記憶體映射與檔案緩衝 229
8.3.1 記事本的記憶體映射檔案 229
8.3.2 Windows的檔案緩衝 230
8.3.3 檔案緩衝:明文還是密文的選擇 232
8.3.4 清除檔案緩衝 233
8.4 加密標識 236
8.4.1 保存在檔案外、檔案頭還是檔案尾 236
8.4.2 隱藏檔案頭的大小 237
8.4.3 隱藏檔案頭的設定偏移 239
8.4.4 隱藏檔案頭的讀/寫偏移 240
8.5 檔案加密表 241
8.5.1 何時進行加密操作 241
8.5.2 檔案控制塊與檔案對象 242
8.5.3 檔案加密表的數據結構與初始化 243
8.5.4 檔案加密表的操作:查詢 244
8.5.5 檔案加密表的操作:添加 245
8.5.6 檔案加密表的操作:刪除 246
8.6 檔案打開處理 248
8.6.1 直接傳送IRP進行查詢與設定操作 248
8.6.2 直接傳送IRP進行讀/寫操作 250
8.6.3 檔案的非重入打開 252
8.6.4 檔案的打開預處理 255
8.7 讀寫加密/解密 260
8.7.1 在讀取時進行解密 260
8.7.2 分配與釋放MDL 261
8.7.3 寫請求加密 262
8.8 crypt_file的組裝 265
8.8.1 crypt_file的初始化 265
8.8.2 crypt_file的IRP預處理 266
8.8.3 crypt_file的IRP後處理 269
本章的示例代碼 272
練習題 272
第9章 檔案系統微過濾驅動 273
從來都不原地踏步的微軟,早就準備好了下一代的檔案系統過濾的框架、文檔、代碼例子。雖然本書的前兩章的範例在Windows 7上都還可以正常運行,但是如果不學習一下最新的接口,讀者一定會覺得不自在。但是讀者可以放心,在前面學習的基礎上,了解新的接口是易如反掌的。
9.1 檔案系統微過濾驅動簡介 274
9.1.1 檔案系統微過濾驅動的由來 274
9.1.2 Minifilter的優點與不足 275
9.2 Minifilter的編程框架 275
9.2.1 微檔案系統過濾的註冊 276
9.2.2 微過濾器的數據結構 277
9.2.3 卸載回調函式 280
9.2.4 預操作回調函式 281
9.2.5 後操作回調函式 284
9.2.6 其他回調函式 285
9.3 Minifilter如何與應用程式通信 288
9.3.1 建立通信連線埠的方法 288
9.3.2 在用戶態通過DLL使用通信連線埠的範例 290
9.4 Minifilter的安裝與載入 292
9.4.1 安裝Minifilter的INF檔案 293
9.4.2 啟動安裝完成的Minifilter 294
本章的示例代碼 295
練習題 295
第10章 網路傳輸層過濾 296
筆者常常使用防火牆,它們看上去真的很神奇。如果懷疑自己的機器上有見不得人的進程打開了網路連線埠盜走機密信息,防火牆將提醒您,雖然防火牆並不知道它是否是一個木馬。這是怎么做到的?本章為您揭曉謎底。
10.1 TDI概要 297
10.1.1 為何選擇TDI 297
10.1.2 從socket到Windows核心 297
10.1.3 TDI過濾的代碼例子 299
10.2 TDI的過濾框架 299
10.2.1 綁定TDI的設備 299
10.2.2 唯一的分發函式 300
10.2.3 過濾框架的實現 302
10.2.4 主要過濾的請求類型 304
10.3 生成請求:獲取地址 305
10.3.1 過濾生成請求 305
10.3.2 準備解析IP位址與連線埠 307
10.3.3 獲取生成的IP位址和連線埠 308
10.3.4 連線終端的生成與相關信息的保存 310
10.4 控制請求 311
10.4.1 TDI_ASSOCIATE_ADDRESS的過濾 311
10.4.2 TDI_CONNECT的過濾 313
10.4.3 其他的次功能號 314
10.4.4 設定事件的過濾 316
10.4.5 TDI_EVENT_CONNECT類型的設定事件的過濾 318
10.4.6 直接獲取傳送函式的過濾 320
10.4.7 清理請求的過濾 322
10.5 本書例子tdifw.lib的套用 323
10.5.1 tdifw庫的回調接口 323
10.5.2 tdifw庫的使用例子 325
本章的示例代碼 326
練習題 327
第11章 NDIS協定驅動 328
網路的連線只是外表而已,實際上,最終它們變成了一個個在網線上往返的網路包。高明的黑客是不會去用Socket來生成連線的。把黑暗的信息隱藏在單個的數據包里,你還可以發現它們嗎?本章介紹的NDIS協定驅動,是Windows網路抓包工具的基礎。
11.1 乙太網包和網路驅動架構 329
11.1.1 乙太網包和協定驅動 329
11.1.2 NDIS網路驅動 330
11.2 協定驅動的DriverEntry 331
11.2.1 生成控制設備 331
11.2.2 註冊協定 333
11.3 協定與網卡的綁定 335
11.3.1 協定與網卡的綁定概念 335
11.3.2 綁定回調處理的實現 335
11.3.3 協定綁定網卡的API 338
11.3.4 解決綁定競爭問題 339
11.3.5 分配接收和傳送的包池與緩衝池 340
11.3.6 OID請求的傳送和請求完成回調 342
11.3.7 ndisprotCreateBinding的最終實現 345
11.4 綁定的解除 351
11.4.1 解除綁定使用的API 351
11.4.2 ndisprotShutdownBinding的實現 353
11.5 在用戶態操作協定驅動 356
11.5.1 協定的收包與發包 356
11.5.2 在用戶態編程打開設備 357
11.5.3 用DeviceIoControl傳送控制請求 358
11.5.4 用WriteFile傳送數據包 360
11.5.5 用ReadFile傳送數據包 362
11.6 在核心態完成功能的實現 363
11.6.1 請求的分發與實現 363
11.6.2 等待設備綁定完成與指定設備名 364
11.6.3 指派設備的完成 365
11.6.4 處理讀請求 368
11.6.5 處理寫請求 370
11.7 協定驅動的接收回調 374
11.7.1 和接收包有關的回調函式 374
11.7.2 ReceiveHandler的實現 376
11.7.3 TransferDataCompleteHandler的實現 380
11.7.4 ReceivePacketHandler的實現 381
11.7.5 接收數據包的入隊 383
11.7.6 接收數據包的出隊和讀請求的完成 385
本章的示例代碼 388
練習題 389
第12章 NDIS小連線埠驅動 390
如果厭煩了漏洞百出的乙太網,還有什麼可以充當我的網路接口嗎?當然,一切能通信的設備,皆有替代乙太網的潛質。即使您不願意修改無數通過TCP接口編程的應用程式,我們依然可以用其他通信設備來虛擬網卡。本章介紹小連線埠驅動來虛擬網卡的技術。
12.1 小連線埠驅動的套用與概述 391
12.1.1 小連線埠驅動的套用 391
12.1.2 小連線埠驅動的實例 392
12.1.3 小連線埠驅動的運作與編程概述 393
12.2 小連線埠驅動的初始化 393
12.2.1 小連線埠驅動的DriverEntry 393
12.2.2 小連線埠驅動的適配器結構 396
12.2.3 配置信息的讀取 397
12.2.4 設定小連線埠適配器上下文 398
12.2.5 MPInitialize的實現 399
12.2.6 MPHalt的實現 402
12.3 打開ndisprot設備 403
12.3.1 I/O目標 403
12.3.2 給IO目標傳送DeviceIoControl請求 404
12.3.3 打開ndisprot接口並完成配置設備 406
12.4 使用ndisprot傳送包 409
12.4.1 小連線埠驅動的發包接口 409
12.4.2 傳送控制塊(TCB) 409
12.4.3 遍歷包組並填寫TCB 412
12.4.4 寫請求的構建與傳送 415
12.5 使用ndisprot接收包 417
12.5.1 提交數據包的核心API 417
12.5.2 從接收控制塊(RCB)提交包 418
12.5.3 對ndisprot讀請求的完成函式 420
12.5.4 讀請求的傳送 422
12.5.5 用於讀包的WDF工作任務 424
12.5.6 ndisedge讀工作任務的生成與入列 426
12.6 其他的特徵回調函式的實現 428
12.6.1 包的歸還 428
12.6.2 OID查詢處理的直接完成 429
12.6.3 OID設定處理 432
本章的示例代碼 433
練習題 434
第13章 NDIS中間層驅動 435
當我們不滿足於抓包和發包,而試圖控制本機上流入和流出的所有數據包的時候,NDIS中間層驅動是最終的選擇。防火牆的功能在這裡得到加強:我們不再滿足於看到連線、連線埠、對方IP位址,而是要看到每一個數據包的原始結構。本章介紹NDIS中間層驅動。
13.1 NDIS中間層驅動概述 436
13.1.1 Windows網路架構總結 436
13.1.2 NDIS中間層驅動簡介 437
13.1.3 NDIS中間層驅動的套用 438
13.1.4 NDIS包描述符結構深究 439
13.2 中間層驅動的入口與綁定 442
13.2.1 中間層驅動的入口函式 442
13.2.2 動態綁定NIC設備 443
13.2.3 小連線埠初始化(MpInitialize) 445
13.3 中間層驅動傳送數據包 447
13.3.1 傳送數據包原理 447
13.3.2 包描述符“重利用” 448
13.3.3 包描述符“重申請” 451
13.3.4 傳送數據包的異步完成 453
13.4 中間層驅動接收數據包 455
13.4.1 接收數據包概述 455
13.4.2 用PtReceive接收數據包 456
13.4.3 用PtReceivePacket接收 461
13.4.4 對包進行過濾 463
13.5 中間層驅動程式查詢和設定 466
13.5.1 查詢請求的處理 466
13.5.2 設定請求的處理 468
13.6 NDIS句柄 470
13.6.1 不可見的結構指針 470
13.6.2 常見的NDIS句柄 471
13.6.3 NDIS句柄誤用問題 473
13.6.4 一種解決方案 475
13.7 生成普通控制設備 476
13.7.1 在中間層驅動中添加普通設備 476
13.7.2 使用傳統方法來生成控制設備 478
本章的示例代碼 483
練習題 483
附錄A 如何使用本書的源碼光碟 485

相關詞條

熱門詞條

聯絡我們