內容簡介
windows內核安全與驅動開發共分三篇,基礎篇囊括了驅動開發的基礎知識,降低了入門的難度;開發篇介紹了在實際工作中可能遇到的各種開發需求的技術實現,包括:串口的過濾、鍵盤的過濾、磁盤的虛擬、磁盤的過濾、文件系統的過濾與監控、文件系統透明加密、文件系統微過濾驅動、網絡傳輸層過濾、Windows過濾平臺、NDIS協議驅動、NDIS小端口驅動、NDIS中間層驅動、IA-32匯編基礎、IA-32體系中的內存地址、處理器權限級別切換、IA-32體系結構中的中斷和Windows內核掛鉤;高級篇包含了匯編語言、操作系統原理、處理器體系架構相關的內容。作者簡介
譚文,畢業于西安交通大學。2002-2005:杭州核新軟件技術有限公司,虛擬磁盤與防火墻項目組。2005-2008:日電卓越軟件(北京)有限公司上海分公司,信息安全課。2008-今:英特爾亞太研發有限公司,動態指令轉換(BTPI)項目組。
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 ??臻g的開辟與恢復 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
使用說明
1、下載并解壓,得出pdf文件
2、如果打不開本文件,請務必下載pdf閱讀器
3、安裝后,在打開解壓得出的pdf文件
4、雙擊進行閱讀




