基礎篇
第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
· · · · · · (
收起)