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