深入淺出Windows API程序設(shè)計:核心編程篇
本書是 Windows API 程序設(shè)計的進階圖書,內(nèi)容包括多線程編程,內(nèi)存管理,文件、驅(qū)動器和目錄操作,進程,剪貼板,動態(tài)鏈接庫,INI 配置文件和注冊表操作,Windows 異常處理,WinSock 網(wǎng)絡(luò)編程,其他常用Windows API 編程知識,PE 文件格式深入剖析。通過閱讀本書,讀者可以對 Windows 程序設(shè)計有更加深入的認識,并將其應(yīng)用到實際場景中。
本書適合有一定經(jīng)驗的 Windows API 程序開發(fā)人員閱讀,也可以作為培訓(xùn)學(xué)校的教材使用。
1.本書基于Win10和VS 2019編寫。
2.本書包含大量的示例程序,能夠幫助讀者將所學(xué)應(yīng)用到實際工作中。
本書基于win10和VS2019編寫,除了基礎(chǔ)知識的梳理,還包含大量的示例程序,系統(tǒng)地介紹了Windows程序設(shè)計的核心編程思想與實踐,讀者通過閱讀本書能對Windows程序設(shè)計有更加深入的認識,從而應(yīng)用到實際場景中。
作者從2008年開始學(xué)習(xí)Windows API程序設(shè)計,精通匯編語言、C/C++和Windows API程序設(shè)計,精通Windows環(huán)境下的桌面軟件開發(fā)和加密解密。曾在tb網(wǎng)專門為客戶定制開發(fā)32/64位Windows桌面軟件;對加密解密情有獨鐘,經(jīng)常逆向分析各類商業(yè)軟件,對VMProtect、Safengine等高強加密保護軟件的脫殼或內(nèi)存補丁有深入研究和獨到見解;喜歡分析軟件安全漏洞,曾在金山和360等網(wǎng)站發(fā)表過多篇殺毒軟件漏洞分析文章。
第 1章 多線程編程 1
1.1 使用多線程的必要性 2
1.2 多線程編程 5
1.3 線程的終止及其他相關(guān)函數(shù) 8
1.4 線程間的通信 10
1.4.1 全局變量 11
1.4.2 自定義消息 11
1.4.3 事件對象 15
1.4.4 手動和自動重置事件對象 22
1.5 線程間的同步 25
1.5.1 用戶模式線程同步 28
1.5.2 內(nèi)核模式線程同步 36
第 2章 內(nèi)存管理 48
2.1 保護模式的分段與分頁管理機制 50
2.2 獲取系統(tǒng)信息與內(nèi)存狀態(tài) 53
2.3 虛擬地址空間管理函數(shù) 56
2.3.1 虛擬地址空間的分配與釋放 57
2.3.2 改變頁面保護屬性 60
2.3.3 查詢頁面信息 61
2.4 堆管理函數(shù) 62
2.4.1 私有堆的創(chuàng)建和釋放 63
2.4.2 在堆中分配和釋放內(nèi)存塊 64
2.4.3 其他堆管理函數(shù) 67
2.4.4 在C++中使用堆 68
2.5 其他內(nèi)存管理函數(shù) 70
第3章 文件、驅(qū)動器和目錄操作 72
3.1 基本概念 73
3.1.1 與硬盤存儲有關(guān)的幾個重要概念 73
3.1.2 分區(qū)、邏輯驅(qū)動器、文件系統(tǒng)和卷 74
3.1.3 文件名、目錄、路徑和當(dāng)前目錄 76
3.2 文件操作 77
3.2.1 創(chuàng)建和打開文件 77
3.2.2 讀寫文件 80
3.2.3 文件指針 83
3.2.4 文件屬性 85
3.2.5 復(fù)制文件 87
3.2.6 移動文件(目錄)、刪除文件 90
3.2.7 無緩沖I/O 93
3.3 邏輯驅(qū)動器和目錄 94
3.3.1 邏輯驅(qū)動器操作 94
3.3.2 目錄操作 96
3.3.3 環(huán)境變量 102
3.3.4 SHFileOperation函數(shù) 106
3.3.5 監(jiān)視目錄變化 107
3.3.6 獲取硬盤序列號 112
3.3.7 可移動硬盤和U盤監(jiān)控 118
3.3.8 獲取主板和BIOS序列號 121
3.4 內(nèi)存映射文件 127
3.4.1 內(nèi)存映射文件相關(guān)函數(shù) 128
3.4.2 通過內(nèi)存映射文件在多個進程間共享數(shù)據(jù) 134
3.4.3 使用內(nèi)存映射文件來處理大型文件 136
3.5 APC異步過程調(diào)用 137
第4章 進程 143
4.1 創(chuàng)建進程 143
4.2 多個進程間共享內(nèi)核對象 150
4.3 進程終止 153
4.4 進程間通信 154
4.4.1 WM_COPYDATA 154
4.4.2 管道 159
4.4.3 郵件槽 164
4.5 進程枚舉 165
4.5.1 TlHelp32系列函數(shù) 165
4.5.2 EnumProcesses函數(shù) 177
4.5.3 進程環(huán)境塊PEB 181
4.6 進程調(diào)試 185
4.6.1 讀寫其他進程的地址空間 185
4.6.2 獲取一個以暫停模式啟動的進程模塊基地址 189
4.6.3 調(diào)試API 193
4.6.4 內(nèi)存補丁 199
4.6.5 線程環(huán)境 204
4.7 窗口間諜 207
4.8 示例:一個程序退出時刪除自身 213
第5章 剪貼板 215
5.1 剪貼板常用函數(shù)與消息 215
5.1.1 基本剪貼板函數(shù) 215
5.1.2 剪貼板相關(guān)的消息 218
5.2 使用剪貼板進行進程間通信 220
5.2.1 Clipboard寫入端 221
5.2.2 Clipboard讀取端 226
5.3 監(jiān)視剪貼板內(nèi)容變化 230
5.3.1 相關(guān)函數(shù)和消息 230
5.3.2 剪貼板監(jiān)視程序ClipboardMonitor 232
5.3.3 監(jiān)視剪貼板的新方法 235
第6章 動態(tài)鏈接庫 236
6.1 靜態(tài)鏈接庫 236
6.2 動態(tài)鏈接庫 237
6.2.1 創(chuàng)建DLL項目 238
6.2.2 在可執(zhí)行模塊中使用DLL 244
6.2.3 入口點函數(shù)DllMain 246
6.2.4 延遲加載DLL 248
6.3 線程局部存儲 252
6.3.1 動態(tài)TLS 253
6.3.2 靜態(tài)TLS 256
6.4 Windows鉤子 258
6.5 在同一個可執(zhí)行文件的多個實例間共享變量 265
6.6 注入DLL 267
6.6.1 通過Windows鉤子注入DLL 267
6.6.2 通過創(chuàng)建遠程線程注入DLL 276
6.6.3 通過函數(shù)轉(zhuǎn)發(fā)器機制注入DLL 283
6.6.4 通過CreateProcess函數(shù)寫入ShellCode注入DLL 290
6.6.5 通過調(diào)試器寫入ShellCode注入DLL 293
6.6.6 通過APC機制注入DLL 293
6.6.7 通過輸入法機制注入DLL 293
6.7 Shadow API技術(shù) 299
6.8 Hook API技術(shù) 304
6.8.1 隨機數(shù) 304
6.8.2 通過遠程線程注入DLL實現(xiàn)API Hook 306
6.8.3 通過全局消息鉤子注入DLL實現(xiàn)進程隱藏 322
第7章 INI配置文件和注冊表操作 328
7.1 INI配置文件 329
7.1.1 鍵值對的創(chuàng)建、更新與刪除 329
7.1.2 獲取鍵值 330
7.1.3 管理小節(jié) 331
7.2 注冊表操作 335
7.2.1 子鍵的打開、關(guān)閉、創(chuàng)建和刪除 337
7.2.2 鍵值項的創(chuàng)建或設(shè)置、查詢和刪除 340
7.2.3 子鍵、鍵值項的枚舉 344
7.2.4 注冊表應(yīng)用:程序開機自動運行設(shè)置文件關(guān)聯(lián) 347
第8章 Windows異常處理 349
8.1 結(jié)構(gòu)化異常處理 349
8.1.1 try-except語句 349
8.1.2 GetExceptionCode和GetExceptionInformation 354
8.1.3 利用結(jié)構(gòu)化異常處理進行反調(diào)試 358
8.1.4 軟件異常 360
8.2 向量化異常處理(全局) 361
8.2.1 向量化異常處理簡介 361
8.2.2 利用向量化異常處理實現(xiàn)基于斷點的API Hook 362
8.3 頂層未處理異常過濾(全局) 367
8.4 向量化繼續(xù)處理(全局) 368
第9章 WinSock網(wǎng)絡(luò)編程 374
9.1 OSI參考模型和TCP/IP協(xié)議簇 374
9.1.1 OSI參考模型 374
9.1.2 TCP/IP協(xié)議簇 377
9.1.3 套接字網(wǎng)絡(luò)編程接口 379
9.2 IP地址、網(wǎng)絡(luò)字節(jié)順序和WinSock的地址表示方式 380
9.2.1 IP地址和端口 380
9.2.2 網(wǎng)絡(luò)字節(jié)順序 381
9.2.3 WinSock的地址表示方式 381
9.3 WinSock網(wǎng)絡(luò)編程 383
9.3.1 TCP網(wǎng)絡(luò)編程的一般步驟 384
9.3.2 TCP服務(wù)器程序 390
9.3.3 TCP客戶端程序 395
9.3.4 UDP編程 399
9.3.5 P2P技術(shù) 402
9.4 WinSock異步I/O模型 403
9.4.1 阻塞模式下的多線程多客戶端套接字編程 404
9.4.2 select模型 414
9.4.3 WSAAsyncSelect模型 419
9.4.4 WSAEventSelect模型 424
9.4.5 Overlapped模型 431
9.4.6 完成端口模型 447
9.4.7 深入介紹I/O完成端口 456
9.4.8 深入介紹線程池 463
9.5 IPHelper API及其他函數(shù) 474
9.5.1 獲取本地計算機的網(wǎng)絡(luò)適配器信息 475
9.5.2 其他函數(shù) 478
9.5.3 校對時間程序 480
9.6 系統(tǒng)網(wǎng)絡(luò)連接的啟用和禁用 482
第 10章 其他常用Windows API編程知識 489
10.1 快捷方式 489
10.2 程序開機自動啟動 491
10.2.1 將程序的快捷方式寫入開機自動啟動程序目錄 491
10.2.2 創(chuàng)建任務(wù)計劃實現(xiàn)開機自動啟動 493
10.2.3 創(chuàng)建系統(tǒng)服務(wù)實現(xiàn)開機自動啟動 493
10.3 用戶賬戶控制 508
10.3.1 自動提示用戶提升權(quán)限 510
10.3.2 利用ShellExecuteEx函數(shù)以管理員權(quán)限啟動程序 512
10.3.3 繞過UAC提權(quán)提示以管理員權(quán)限運行 513
10.4 用戶界面特權(quán)隔離 514
10.5 窗口的查找與枚舉 515
10.6 實現(xiàn)任務(wù)欄通知區(qū)域圖標與氣泡通知 517
第 11章 PE文件格式深入剖析 520
11.1 DOS頭(DOS MZ頭和DOSStub塊) 521
11.2 PE頭(IMAGE_NT_HEADER32結(jié)構(gòu)) 522
11.3 節(jié)表(節(jié)區(qū)信息結(jié)構(gòu)IMAGE_SECTION_HEADER列表) 531
11.4 64位可執(zhí)行文件格式PE32+ 537
11.5 導(dǎo)入表 538
11.6 導(dǎo)出表 547
11.7 重定位表 552
11.8 模擬PE加載器直接加載可執(zhí)行文件到進程內(nèi)存中執(zhí)行 555
11.9 線程局部存儲表 563
11.10 加載配置信息表 568
11.11 資源表 569
11.12 延遲加載導(dǎo)入表 577
11.13 校驗和與CRC 577
11.14 64位程序中如何書寫匯編代碼(以獲取CPUID為例) 580
11.15 Detours-master庫 583
11.15.1 注入DLL的編寫 583
11.15.2 將注入DLL加載到目標進程中 586
11.15.3 編輯可執(zhí)行文件 591
11.16 通過修改模塊導(dǎo)入表中的IAT項來Hook API 592