深入淺出Windows API程序設(shè)計(jì):核心編程篇
本書是 Windows API 程序設(shè)計(jì)的進(jìn)階圖書,內(nèi)容包括多線程編程,內(nèi)存管理,文件、驅(qū)動(dòng)器和目錄操作,進(jìn)程,剪貼板,動(dòng)態(tài)鏈接庫(kù),INI 配置文件和注冊(cè)表操作,Windows 異常處理,WinSock 網(wǎng)絡(luò)編程,其他常用Windows API 編程知識(shí),PE 文件格式深入剖析。通過(guò)閱讀本書,讀者可以對(duì) Windows 程序設(shè)計(jì)有更加深入的認(rèn)識(shí),并將其應(yīng)用到實(shí)際場(chǎng)景中。
本書適合有一定經(jīng)驗(yàn)的 Windows API 程序開發(fā)人員閱讀,也可以作為培訓(xùn)學(xué)校的教材使用。
1.本書基于Win10和VS 2019編寫。
2.本書包含大量的示例程序,能夠幫助讀者將所學(xué)應(yīng)用到實(shí)際工作中。
本書基于win10和VS2019編寫,除了基礎(chǔ)知識(shí)的梳理,還包含大量的示例程序,系統(tǒng)地介紹了Windows程序設(shè)計(jì)的核心編程思想與實(shí)踐,讀者通過(guò)閱讀本書能對(duì)Windows程序設(shè)計(jì)有更加深入的認(rèn)識(shí),從而應(yīng)用到實(shí)際場(chǎng)景中。
作者從2008年開始學(xué)習(xí)Windows API程序設(shè)計(jì),精通匯編語(yǔ)言、C/C++和Windows API程序設(shè)計(jì),精通Windows環(huán)境下的桌面軟件開發(fā)和加密解密。曾在tb網(wǎng)專門為客戶定制開發(fā)32/64位Windows桌面軟件;對(duì)加密解密情有獨(dú)鐘,經(jīng)常逆向分析各類商業(yè)軟件,對(duì)VMProtect、Safengine等高強(qiáng)加密保護(hù)軟件的脫殼或內(nèi)存補(bǔ)丁有深入研究和獨(dú)到見解;喜歡分析軟件安全漏洞,曾在金山和360等網(wǎng)站發(fā)表過(guò)多篇?dú)⒍拒浖┒捶治鑫恼隆?
第 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 事件對(duì)象 15
1.4.4 手動(dòng)和自動(dòng)重置事件對(duì)象 22
1.5 線程間的同步 25
1.5.1 用戶模式線程同步 28
1.5.2 內(nèi)核模式線程同步 36
第 2章 內(nèi)存管理 48
2.1 保護(hù)模式的分段與分頁(yè)管理機(jī)制 50
2.2 獲取系統(tǒng)信息與內(nèi)存狀態(tài) 53
2.3 虛擬地址空間管理函數(shù) 56
2.3.1 虛擬地址空間的分配與釋放 57
2.3.2 改變頁(yè)面保護(hù)屬性 60
2.3.3 查詢頁(yè)面信息 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ū)動(dòng)器和目錄操作 72
3.1 基本概念 73
3.1.1 與硬盤存儲(chǔ)有關(guān)的幾個(gè)重要概念 73
3.1.2 分區(qū)、邏輯驅(qū)動(dòng)器、文件系統(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 移動(dòng)文件(目錄)、刪除文件 90
3.2.7 無(wú)緩沖I/O 93
3.3 邏輯驅(qū)動(dòng)器和目錄 94
3.3.1 邏輯驅(qū)動(dòng)器操作 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 獲取硬盤序列號(hào) 112
3.3.7 可移動(dòng)硬盤和U盤監(jiān)控 118
3.3.8 獲取主板和BIOS序列號(hào) 121
3.4 內(nèi)存映射文件 127
3.4.1 內(nèi)存映射文件相關(guān)函數(shù) 128
3.4.2 通過(guò)內(nèi)存映射文件在多個(gè)進(jìn)程間共享數(shù)據(jù) 134
3.4.3 使用內(nèi)存映射文件來(lái)處理大型文件 136
3.5 APC異步過(guò)程調(diào)用 137
第4章 進(jìn)程 143
4.1 創(chuàng)建進(jìn)程 143
4.2 多個(gè)進(jìn)程間共享內(nèi)核對(duì)象 150
4.3 進(jìn)程終止 153
4.4 進(jìn)程間通信 154
4.4.1 WM_COPYDATA 154
4.4.2 管道 159
4.4.3 郵件槽 164
4.5 進(jìn)程枚舉 165
4.5.1 TlHelp32系列函數(shù) 165
4.5.2 EnumProcesses函數(shù) 177
4.5.3 進(jìn)程環(huán)境塊PEB 181
4.6 進(jìn)程調(diào)試 185
4.6.1 讀寫其他進(jìn)程的地址空間 185
4.6.2 獲取一個(gè)以暫停模式啟動(dòng)的進(jìn)程模塊基地址 189
4.6.3 調(diào)試API 193
4.6.4 內(nèi)存補(bǔ)丁 199
4.6.5 線程環(huán)境 204
4.7 窗口間諜 207
4.8 示例:一個(gè)程序退出時(shí)刪除自身 213
第5章 剪貼板 215
5.1 剪貼板常用函數(shù)與消息 215
5.1.1 基本剪貼板函數(shù) 215
5.1.2 剪貼板相關(guān)的消息 218
5.2 使用剪貼板進(jìn)行進(jìn)程間通信 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章 動(dòng)態(tài)鏈接庫(kù) 236
6.1 靜態(tài)鏈接庫(kù) 236
6.2 動(dòng)態(tài)鏈接庫(kù) 237
6.2.1 創(chuàng)建DLL項(xiàng)目 238
6.2.2 在可執(zhí)行模塊中使用DLL 244
6.2.3 入口點(diǎn)函數(shù)DllMain 246
6.2.4 延遲加載DLL 248
6.3 線程局部存儲(chǔ) 252
6.3.1 動(dòng)態(tài)TLS 253
6.3.2 靜態(tài)TLS 256
6.4 Windows鉤子 258
6.5 在同一個(gè)可執(zhí)行文件的多個(gè)實(shí)例間共享變量 265
6.6 注入DLL 267
6.6.1 通過(guò)Windows鉤子注入DLL 267
6.6.2 通過(guò)創(chuàng)建遠(yuǎn)程線程注入DLL 276
6.6.3 通過(guò)函數(shù)轉(zhuǎn)發(fā)器機(jī)制注入DLL 283
6.6.4 通過(guò)CreateProcess函數(shù)寫入ShellCode注入DLL 290
6.6.5 通過(guò)調(diào)試器寫入ShellCode注入DLL 293
6.6.6 通過(guò)APC機(jī)制注入DLL 293
6.6.7 通過(guò)輸入法機(jī)制注入DLL 293
6.7 Shadow API技術(shù) 299
6.8 Hook API技術(shù) 304
6.8.1 隨機(jī)數(shù) 304
6.8.2 通過(guò)遠(yuǎn)程線程注入DLL實(shí)現(xiàn)API Hook 306
6.8.3 通過(guò)全局消息鉤子注入DLL實(shí)現(xiàn)進(jìn)程隱藏 322
第7章 INI配置文件和注冊(cè)表操作 328
7.1 INI配置文件 329
7.1.1 鍵值對(duì)的創(chuàng)建、更新與刪除 329
7.1.2 獲取鍵值 330
7.1.3 管理小節(jié) 331
7.2 注冊(cè)表操作 335
7.2.1 子鍵的打開、關(guān)閉、創(chuàng)建和刪除 337
7.2.2 鍵值項(xiàng)的創(chuàng)建或設(shè)置、查詢和刪除 340
7.2.3 子鍵、鍵值項(xiàng)的枚舉 344
7.2.4 注冊(cè)表應(yīng)用:程序開機(jī)自動(dòng)運(yùn)行設(shè)置文件關(guān)聯(lián) 347
第8章 Windows異常處理 349
8.1 結(jié)構(gòu)化異常處理 349
8.1.1 try-except語(yǔ)句 349
8.1.2 GetExceptionCode和GetExceptionInformation 354
8.1.3 利用結(jié)構(gòu)化異常處理進(jìn)行反調(diào)試 358
8.1.4 軟件異常 360
8.2 向量化異常處理(全局) 361
8.2.1 向量化異常處理簡(jiǎn)介 361
8.2.2 利用向量化異常處理實(shí)現(xiàn)基于斷點(diǎn)的API Hook 362
8.3 頂層未處理異常過(guò)濾(全局) 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 獲取本地計(jì)算機(jī)的網(wǎng)絡(luò)適配器信息 475
9.5.2 其他函數(shù) 478
9.5.3 校對(duì)時(shí)間程序 480
9.6 系統(tǒng)網(wǎng)絡(luò)連接的啟用和禁用 482
第 10章 其他常用Windows API編程知識(shí) 489
10.1 快捷方式 489
10.2 程序開機(jī)自動(dòng)啟動(dòng) 491
10.2.1 將程序的快捷方式寫入開機(jī)自動(dòng)啟動(dòng)程序目錄 491
10.2.2 創(chuàng)建任務(wù)計(jì)劃實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng) 493
10.2.3 創(chuàng)建系統(tǒng)服務(wù)實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng) 493
10.3 用戶賬戶控制 508
10.3.1 自動(dòng)提示用戶提升權(quán)限 510
10.3.2 利用ShellExecuteEx函數(shù)以管理員權(quán)限啟動(dòng)程序 512
10.3.3 繞過(guò)UAC提權(quán)提示以管理員權(quán)限運(yùn)行 513
10.4 用戶界面特權(quán)隔離 514
10.5 窗口的查找與枚舉 515
10.6 實(shí)現(xiàn)任務(wù)欄通知區(qū)域圖標(biāo)與氣泡通知 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í)行文件到進(jìn)程內(nèi)存中執(zhí)行 555
11.9 線程局部存儲(chǔ)表 563
11.10 加載配置信息表 568
11.11 資源表 569
11.12 延遲加載導(dǎo)入表 577
11.13 校驗(yàn)和與CRC 577
11.14 64位程序中如何書寫匯編代碼(以獲取CPUID為例) 580
11.15 Detours-master庫(kù) 583
11.15.1 注入DLL的編寫 583
11.15.2 將注入DLL加載到目標(biāo)進(jìn)程中 586
11.15.3 編輯可執(zhí)行文件 591
11.16 通過(guò)修改模塊導(dǎo)入表中的IAT項(xiàng)來(lái)Hook API 592