加密與解密, 4/e 加密与解密(第4版)

段鋼

買這商品的人也買了...

商品描述

本書以軟件逆向為切入點,講述了軟件安全領域相關的基礎知識和技能。

讀者閱讀本書後,很容易就能在逆向分析、漏洞分析、安全編程、病毒分析等領域進行擴展。

這些知識點的相互關聯,將促使讀者開闊思路,融會貫通,領悟更多的學習方法,提升自身的學習能力。

本書適合安全技術相關工作者、對逆向調試技術感興趣的人、對軟件保護感興趣的軟件開發人員、相關專業在校學生及關註個人信息安全、電腦安全技術並想瞭解技術內幕的讀者閱讀。

作者簡介

段鋼

國內信息安全領域具有廣泛影響力的安全網站看雪學院的創始人和運營管理者,長期致力於信息安全技術研究,對當前安全技術的發展有深入思考。

參與和組織專業人士推出的十多部技術專著和相關書籍,有不少入選為大學信息技術專業的教輔材料,如《加密與解密》等,影響廣泛。在盛大和眾人網絡的多年工作經歷,使得對安全防護有深刻的認識和理解。

在2016年創建上海看雪科技有限公司,項目以看雪學院為基礎,構建一個提供B2B、B2C信息安全服務的綜合平台。

目錄大綱

基礎篇
第1章 基礎知識 2
1.1 什麼是加密與解密 2
1.1.1 軟體的加密與解密 2
1.1.2 軟體逆向工程 2
1.1.3 逆向分析技術 3
1.2 文本字元 4
1.2.1 ASCII與Unicode字元集 4
1.2.2 位元組存儲順序 6
1.3 Windows作業系統 6
1.3.1 Win32 API函數 6
1.3.2 WOW64 9
1.3.3 Windows消息機制 9
1.3.4 虛擬記憶體 11

調試篇
第2章 動態分析技術 14
2.1 OllyDbg調試器 14
2.1.1 OllyDbg的介面 14
2.1.2 OllyDbg的配置 15
2.1.3 基本操作 16
2.1.4 常用中斷點 27
2.1.5 外掛程式 35
2.1.6 Run trace 36
2.1.7 Hit trace 37
2.1.8 調試符號 37
2.1.9 載入程式 39
2.1.10 OllyDbg的常見問題 40
2.2 x64dbg調試器 42
2.3 MDebug調試器 44
2.3.1 MDebug的介面 44
2.3.2 運算式 45
2.3.3 調試 45
2.3.4 中斷點 46
2.3.5 MDebug的其他功能 47
2.4 WinDbg調試器 47
2.4.1 WinDbg的安裝與配置 47
2.4.2 調試過程 51
2.4.3 中斷點命令 51
2.4.4 棧窗口 53
2.4.5 記憶體命令 55
2.4.6 腳本 56
2.4.7 調試功能擴展 58
2.4.8 小結 59
第3章 靜態分析技術 60
3.1 檔案類型分析 60
3.2 反彙編引擎 61
3.2.1 OllyDbg的ODDisasm 61
3.2.2 BeaEngine 61
3.2.3 Udis86 61
3.2.4 Capstone 62
3.2.5 AsmJit 63
3.2.6 Keystone 64
3.2.7 小結 64
3.3 靜態反彙編 65
3.3.1 IDA Pro簡介 65
3.3.2 IDA的配置 66
3.3.3 IDA主窗口 68
3.3.4 交叉參考 69
3.3.5 參考重命名 70
3.3.6 標籤的用法 71
3.3.7 格式化指令運算元 71
3.3.8 函數的操作 72
3.3.9 代碼和資料轉換 72
3.3.10 字串 73
3.3.11 陣列 74
3.3.12 結構體 75
3.3.13 枚舉類型 79
3.3.14 變數 80
3.3.15 FLIRT 81
3.3.16 IDC腳本 82
3.3.17 外掛程式 86
3.3.18 IDA調試器 87
3.3.19 遠程調試 90
3.3.20 其他功能 93
3.3.21 小結 94
3.4 十六進位工具 94
3.5 靜態分析技術應用實例 97
3.5.1 解密初步 97
3.5.2 逆向工程初步 99

解密篇
第4章 逆向分析技術 102
4.1 32位元軟體逆向技術 102
4.1.1 啟動函數 102
4.1.2 函數 103
4.1.3 資料結構 111
4.1.4 虛函數 115
4.1.5 控制語句 117
4.1.6 迴圈語句 124
4.1.7 數學運算子 125
4.1.8 文本字串 128
4.1.9 指令修改技巧 130
4.2 64位元軟體逆向技術 131
4.2.1 寄存器 131
4.2.2 函數 132
4.2.3 資料結構 142
4.2.4 控制語句 145
4.2.5 迴圈語句 154
4.2.6 數學運算子 158
4.2.7 虛函數 169
4.2.8 小結 193
第5章 展示版本保護技術 194
5.1 序號保護方式 194
5.1.1 序號保護機制 194
5.1.2 如何攻擊序號保護機制 195
5.1.3 字串比較形式 197
5.1.4 製作註冊機 198
5.2 警告窗口 203
5.3 時間限制 205
5.3.1 計時器 205
5.3.2 時間限制 205
5.3.3 拆解時間限制保護 206
5.4 功能表功能限制 207
5.4.1 相關函數 207
5.4.2 拆解菜單限制保護 208
5.5 KeyFile保護 208
5.5.1 相關API函數 208
5.5.2 拆解KeyFile保護 209
5.6 網路驗證 213
5.6.1 相關函數 214
5.6.2 破解網路驗證的一般思路 214
5.7 光碟檢測 219
5.7.1 相關函數 219
5.7.2 拆解光碟保護 220
5.8 只運行1個實例 221
5.8.1 實現方法 221
5.8.2 實例 222
5.9 常用中斷點設置技巧 222
第6章 加密演算法 223
6.1 單向散列演算法 223
6.1.1 MD5演算法 223
6.1.2 SHA演算法 227
6.1.3 SM3密碼雜湊演算法 231
6.1.4 小結 231
6.2 對稱加密演算法 231
6.2.1 RC4流密碼 231
6.2.2 TEA演算法 233
6.2.3 IDEA演算法 236
6.2.4 BlowFish演算法 243
6.2.5 AES演算法 246
6.2.6 SM4區塊編碼器演算法 259
6.2.7 小結 259
6.3 公開金鑰加密演算法 259
6.3.1 RSA演算法 260
6.3.2 ElGamal公開金鑰演算法 264
6.3.3 DSA數位簽章演算法 270
6.3.4 橢圓曲線密碼編碼學 272
6.3.5 SM2演算法 279
6.4 其他演算法 279
6.4.1 CRC32演算法 279
6.4.2 Base64編碼 280
6.5 常見的加密庫介面及其識別 281
6.5.1 Miracl大數運算庫 281
6.5.2 FGInt 283
6.5.3 其他加密演算法庫介紹 284
6.6 加密演算法在軟體保護中的應用 285

系統篇
第7章 Windows內核基礎 290
7.1 內核理論基礎 290
7.1.1 許可權級別 290
7.1.2 記憶體空間佈局 291
7.1.3 Windows與內核啟動過程 292
7.1.4 Windows R3與R0通信 294
7.1.5 內核函數 296
7.1.6 內核驅動模組 297
7.2 內核重要資料結構 298
7.2.1 內核對象 298
7.2.2 SSDT 300
7.2.3 TEB 302
7.2.4 PEB 304
7.3 內核調試基礎 306
7.3.1 使用WinDbg搭建雙機調試環境 306
7.3.2 載入內核驅動並設置符號表 308
7.3.3 SSDT與Shadow SSDT的查看 311
第8章 Windows下的異常處理 313
8.1 異常處理的基本概念 313
8.1.1 異常列表 313
8.1.2 異常處理的基本過程 314
8.2 SEH的概念及基本知識 319
8.2.1 SEH的相關資料結構 319
8.2.2 SEH處理常式的安裝和卸載 320
8.2.3 SEH實例跟蹤 321
8.3 SEH例外處理常式原理及設計 325
8.3.1 異常分發的詳細過程 325
8.3.2 執行緒異常處理 330
8.3.3 異常處理的棧展開 336
8.3.4 MSC編譯器對執行緒異常處理的增強 342
8.3.5 頂層異常處理 349
8.3.6 例外處理常式的安全性 357
8.4 向量化異常處理 361
8.4.1 向量化異常處理的使用 361
8.4.2 VEH與SEH的異同 362
8.4.3 向量化異常處理的新內容 363
8.5 x64平臺上的異常處理 363
8.5.1 原生x64程式的異常分發 364
8.5.2 WOW64下的異常分發 366
8.6 例外處理常式設計中的注意事項 367
8.7 異常處理的實際應用 368
8.7.1 使用SEH對用戶輸入進行驗證 368
8.7.2 SEH在加密與解密中的應用 369
8.7.3 用VEH實現API Hook 371
8.8 本章小結 371
第9章 Win32調試API 372
9.1 調試相關函數簡要說明 372
9.2 調試事件 375
9.3 創建並跟蹤進程 377
9.4 調試循環體 378
9.5 處理調試事件 379
9.6 執行緒環境 380
9.7 將代碼注入進程 382
第10章 VT技術 384
10.1 硬體虛擬化的基本概念 384
10.1.1 概述 384
10.1.2 相關結構和彙編指令 385
10.1.3 EPT機制 388
10.2 VT技術的應用 389
10.2.1 編譯運行ShadowWalker 389
10.2.2 分析Hypervisor 390
10.2.3 檢測VT支援情況 392
10.2.4 VMCS的配置 393
10.2.5 EPT的配置 396
10.2.6 開啟VT 399
10.2.7 記憶體隱藏的實現 399
10.3 VT調試方法 401
第11章 PE檔案格式 404
11.1 PE的基本概念 405
11.1.1 基底位址 405
11.1.2 虛擬位址 406
11.1.3 相對虛擬位址 406
11.1.4 文件偏移位址 407
11.2 MS-DOS頭部 407
11.3 PE文件頭 408
11.3.1 Signature欄位 408
11.3.2 IMAGE_FILE_HEADER結構 409
11.3.3 IMAGE_OPTIONAL_HEADER結構 410
11.4 區塊 415
11.4.1 區塊表 415
11.4.2 常見區塊與區塊合併 417
11.4.3 區塊的對齊值 419
11.4.4 檔偏移與虛擬位址的轉換 419
11.5 輸入表 421
11.5.1 輸入函數的調用 421
11.5.2 輸入表的結構 422
11.5.3 輸入位址表 424
11.5.4 輸入表實例分析 424
11.6 綁定輸入 428
11.7 輸出表 429
11.7.1 輸出表的結構 430
11.7.2 輸出表實例分析 431
11.8 基址重定位 432
11.8.1 基址重定位的概念 432
11.8.2 基址重定位表的結構 433
11.8.3 基址重定位表實例分析 434
11.9 資源 435
11.9.1 資源結構 435
11.9.2 資源結構實例分析 438
11.9.3 資源編輯工具 440
11.10 TLS初始化 440
11.11 調試目錄 441
11.12 延遲載入資料 441
11.13 程式異常資料 442
11.14 .NET頭部 442
11.15 編寫PE分析工具 443
11.15.1 檢查檔案格式 443
11.15.2 讀取FileHeader和OptionalHeader的內容 444
11.15.3 得到資料目錄表資訊 445
11.15.4 得到區塊表資訊 446
11.15.5 得到輸出表資訊 447
11.15.6 得到輸入表資訊 448
第12章 注入技術 450
12.1 DLL注入方法 450
12.1.1 通過干預輸入表處理過程載入目標DLL 450
12.1.2 改變程式運行流程使其主動載入目標DLL 466
12.1.3 利用系統機制載入DLL 484
12.2 DLL注入的應用 491
12.3 DLL注入的防範 491
12.3.1 驅動層防範 491
12.3.2 應用層防範 493
第13章 Hook技術 497
13.1 Hook概述 497
13.1.1 IAT Hook篡改MessageBox消息 497
13.1.2 Inline Hook篡改指定MessageBox消息 499
13.2 Hook的分類 500
13.2.1 Address Hook 501
13.2.2 Inline Hook 511
13.2.3 基於異常處理的Hook 513
13.2.4 不是Hook的Hook 514
13.3 Hook位置的挑選 515
13.4 Hook的典型過程 519
13.4.1 Address Hook的實施過程 519
13.4.2 Inline Hook的實施過程 526
13.4.3 基於異常處理的Hook實施過程 529
13.4.4 二次Hook的注意事項 532
13.4.5 通用Hook引擎的實現 533
13.5 Detour函數的典型用法 533
13.6 Hook中的注意事項 536
13.7 Hook在x64平臺上的新問題 541
13.8 Hook技術的應用 543
13.9 Hook的檢測、恢復與對抗 544
13.9.1 Hook的檢測與恢復 544
13.9.2 Hook的對抗 545
13.10 本章小結 546

漏洞篇
第14章 漏洞分析技術 548
14.1 軟體漏洞原理 548
14.1.1 緩衝區溢位漏洞 548
14.1.2 整型溢出漏洞 553
14.1.3 UAF漏洞 555
14.2 Shellcode 555
14.2.1 Shellcode的結構 556
14.2.2 Shellcode通用技術 559
14.2.3 實戰Shellcode編寫 560
14.3 漏洞利用 566
14.3.1 漏洞利用基本技術 567
14.3.2 漏洞利用高級技術 570
14.4 漏洞樣本 572
14.5 樣本分析 573
14.5.1 準備工作 573
14.5.2 靜態分析 574
14.5.3 動態調試 576
14.5.4 追根溯源 581
14.5.5 小結 585

脫殼篇
第15章 專用加密軟體 588
15.1 認識殼 588
15.1.1 殼的概念 588
15.1.2 壓縮引擎 589
15.2 壓縮殼 589
15.2.1 UPX 589
15.2.2 ASPack 590
15.3 加密殼 590
15.3.1 ASProtect 590
15.3.2 Armadillo 590
15.3.3 EXECryptor 591
15.3.4 Themida 591
15.4 虛擬機器保護軟體 592
15.4.1 虛擬機器介紹 592
15.4.2 VMProtect簡介 592
第16章 脫殼技術 594
16.1 基礎知識 594
16.1.1 殼的載入過程 594
16.1.2 脫殼機 595
16.1.3 手動脫殼 596
16.2 尋找OEP 596
16.2.1 根據跨段指令尋找OEP 596
16.2.2 用記憶體訪問中斷點尋找OEP 600
16.2.3 根據棧平衡原理尋找OEP 601
16.2.4 根據編譯語言特點尋找OEP 602
16.3 抓取記憶體映射 603
16.3.1 Dump原理 603
16.3.2 反Dump技術 604
16.4 重建輸入表 606
16.4.1 輸入表重建的原理 606
16.4.2 確定IAT的位址和大小 607
16.4.3 根據IAT重建輸入表 608
16.4.4 用Import REC重建輸入表 611
16.4.5 輸入表加密概括 614
16.5 DLL文件脫殼 615
16.5.1 尋找OEP 615
16.5.2 Dump映射檔 617
16.5.3 重建DLL的輸入表 618
16.5.4 構造重定位表 619
16.6 附加數據 621
16.7 PE文件的優化 623
16.8 壓縮殼 626
16.8.1 UPX外殼 626
16.8.2 ASPack外殼 629
16.9 加密殼 633
16.10 靜態脫殼 637
16.10.1 外殼Loader分析 637
16.10.2 編寫靜態脫殼器 641

保護篇
第17章 軟體保護技術 644
17.1 防範演算法求逆 644
17.1.1 基本概念 644
17.1.2 堡壘戰術 645
17.1.3 遊擊戰術 646
17.2 抵禦靜態分析 647
17.2.1 花指令 647
17.2.2 SMC技術實現 649
17.2.3 信息隱藏 653
17.2.4 簡單的多態變形技術 654
17.3 檔完整性檢驗 655
17.3.1 磁片檔校驗的實現 655
17.3.2 校驗和 657
17.3.3 記憶體映射校驗 657
17.4 代碼與資料結合 659
17.4.1 準備工作 660
17.4.2 加密演算法的選用 661
17.4.3 手動加密代碼 661
17.4.4 使 .text區塊可寫 662
17.5 關於軟體保護的若干忠告 663
第18章 反跟蹤技術 665
18.1 由BeingDebugged引發的蝴蝶效應 665
18.1.1 BeingDebugged 665
18.1.2 NtGlobalFlag 669
18.1.3 Heap Magic 671
18.1.4 從源頭消滅BeingDebugged 676
18.2 回歸Native:用戶態的夢魘 676
18.2.1 CheckRemoteDebuggerPresent 677
18.2.2 ProcessDebugPort 677
18.2.3 ThreadHideFromDebugger 680
18.2.4 DebugObject 682
18.2.5 SystemKernelDebuggerInformation 686
18.2.6 Native API 688
18.2.7 Hook和AntiHook 693
18.3 真正的奧秘:小技巧一覽 696
18.3.1 SoftICE檢測方法 696
18.3.2 OllyDbg檢測方法 698
18.3.3 調試器漏洞 700
18.3.4 防止調試器附加 701
18.3.5 父進程檢測 703
18.3.6 時間差 703
18.3.7 通過Trap Flag檢測 704
18.3.8 雙進程保護 704
第19章 外殼編寫基礎 705
19.1 外殼的結構 705
19.2 加殼主程序 706
19.2.1 判斷檔是否為PE格式 706
19.2.2 檔基本資料讀入 706
19.2.3 附加數據的讀取 708
19.2.4 輸入表的處理 708
19.2.5 重定位表的處理 711
19.2.6 檔的壓縮 713
19.2.7 資來源資料的處理 716
19.2.8 區塊的融合 720
19.3 用彙編寫外殼部分 721
19.3.1 外殼的載入過程 721
19.3.2 自建輸入表 722
19.3.3 外殼引導段 723
19.3.4 外殼第2部分 726
19.3.5 將外殼部分添加至原程式 731
19.4 用C++編寫外殼部分 734
第20章 虛擬機器的設計 739
20.1 虛擬機器保護技術原理 739
20.1.1 反彙編引擎 739
20.1.2 指令分類 739
20.2 啟動框架和調用約定 740
20.2.1 調度器 740
20.2.2 虛擬環境 741
20.2.3 平衡棧vBegin和vCheckESP 742
20.3 Handler的設計 743
20.3.1 輔助Handler 743
20.3.2 普通Handler和指令拆解 744
20.3.3 標誌位元問題 745
20.3.4 相同作用的指令 745
20.3.5 轉移指令 746
20.3.6 轉移跳轉指令的另一種實現 747
20.3.7 call指令 748
20.3.8 retn指令 748
20.3.9 不可類比指令 749
20.4 託管代碼的異常處理 749
20.4.1 VC++的異常處理 749
20.4.2 Delphi的異常處理 754
20.5 本章小結 757
第21章 VMProtect逆向和還原淺析 758
21.1 VMProtect逆向分析 758
21.1.1 VMProtect虛擬執行引擎的全景圖 758
21.1.2 VMProtect虛擬引擎的基本架構 763
21.1.3 指令分類 763
21.2 VMProtect的還原 765
21.2.1 虛擬執行系統 766
21.2.2 生成完整的位元組碼流程圖 767
21.2.3 給Handler命名並添加語義動作 774
21.2.4 將位元組碼的低級描述轉換為中級描述 775
21.2.5 清除無用的位元組碼 776
21.2.6 用真值表化簡邏輯指令 776
21.2.7 從特徵中建立部分寄存器映射資訊 779
21.2.8 其他無法確定的寄存器的圖著色演算法 785
21.2.9 使用DAG匹配生成指令 788
21.2.10 其他問題 791

軟體重構篇
第22章 補丁技術 794
22.1 文件補丁 794
22.2 記憶體補丁 795
22.2.1 跨進程記憶體存取機制 795
22.2.2 Debug API機制 797
22.2.3 利用調試寄存器機制 800
22.2.4 利用DLL注入技術 803
22.2.5 利用Hook技術 807
22.2.6 利用VT技術 810
22.3 SMC補丁技術 813
22.3.1 單層SMC補丁技術 813
22.3.2 多層SMC補丁技術 814
22.4 補丁工具 816
第23章 代碼的二次開發 818
23.1 數據對齊 818
23.2 增加空間 818
23.2.1 區塊間隙 818
23.2.2 手動構造區塊 819
23.2.3 工具輔助構造區塊 820
23.3 獲得函數的調用資訊 820
23.3.1 增加輸入函數 820
23.3.2 顯式連結調用DLL 821
23.4 代碼的重定位 822
23.4.1 修復重定位表 822
23.4.2 代碼的自定位技術 824
23.5 增加輸出函數 825
23.6 消息迴圈 826
23.6.1 WndProc函數 826
23.6.2 尋找消息迴圈 827
23.6.3 WndProc彙編形式 828
23.7 菜單擴展 829
23.7.1 擴充WndProc 829
23.7.2 擴充Exit功能表的功能 830
23.7.3 擴充Open功能表的功能 830
23.8 DLL擴展 833
23.8.1 擴展介面 833
23.8.2 擴展消息迴圈 834

語言和平臺篇
第24章 .NET平臺加解密 838
24.1 .NET概述 838
24.1.1 什麼是 .NET 838
24.1.2 基本概念 839
24.1.3 第1個 .NET程式 840
24.2 MSIL與中繼資料 841
24.2.1 PE結構的擴展 841
24.2.2 .NET下的彙編MSIL 847
24.2.3 MSIL與中繼資料的結合 849
24.3 代碼分析與修改技術 851
24.3.1 靜態分析 851
24.3.2 動態調試 853
24.3.3 代碼修改 855
24.4 .NET代碼保護技術及其逆向 857
24.4.1 強式名稱 857
24.4.2 名稱混淆 859
24.4.3 流程混淆 863
24.4.4 壓縮 865
24.4.5 加密 869
24.4.6 其他保護手段 875
24.5 本章小結 876

取證篇
第25章 資料取證技術 878
25.1 硬碟資料的獲取和固定 878
25.1.1 硬碟資料的獲取 878
25.1.2 電子資料的固定 882
25.2 硬碟的分區和資料恢復 882
25.2.1 分區的解析 884
25.2.2 基於檔案系統的資料恢復原理 886
25.3 記憶體分析 890
25.3.1 記憶體鏡像的獲取 891
25.3.2 記憶體鏡像的分析 894
25.4 動態模擬技術 897
25.4.1 模擬專用硬體 897
25.4.2 軟體模擬 898
25.5 註冊表 900
25.5.1 Hive文件 900
25.5.2 註冊表中的時間 901
25.5.3 USB移動存放裝置 902
25.6 檔案格式 903
25.6.1 檔修復和特徵碼 903
25.6.2 基於檔的資料恢復技術 904
25.6.3 資料隱藏的分析 906

術語表 909
參考文獻 911