第1部分 逆嚮101
第1章 基礎 3
1.1 什麼是逆嚮工程 3
1.2 軟件逆嚮工程:逆嚮 4
1.3 逆嚮應用 4
1.3.1 與安全相關的逆嚮 5
1.3.2 軟件開發中的逆嚮 8
1.4 底層軟件 9
1.4.1 匯編語言 10
1.4.2 編譯器 11
1.4.3 虛擬機和字節碼 12
1.4.4 操作係統 13
1.5 逆嚮過程 13
1.5.1 係統級逆嚮 14
1.5.2 代碼級逆嚮 14
1.6 工具 14
1.6.1 係統監控工具 15
1.6.2 反匯編器 15
1.6.3 調試器 15
1.6.4 反編譯器 16
1.7 逆嚮閤法嗎? 17
1.7.1 互操作性 17
1.7.2 競爭 18
1.7.3 版權法 19
1.7.4 商業機密和專利權 20
1.7.5 美國數字韆禧版權法 20
1.7.6 DMCA案例 22
1.7.7 許可證協議 23
1.8 代碼範例與工具 23
1.9 結論 23
第2章 底層軟件 25
2.1 高階視角 26
2.1.1 程序結構 26
2.1.2 數據管理 29
2.1.3 控製流 32
2.1.4 高級語言 33
2.2 低階視角 37
2.2.1 底層數據管理 37
2.2.2 控製流 43
2.3 匯編語言101 44
2.3.1 寄存器 44
2.3.2 標誌位 46
2.3.3 指令格式 47
2.3.4 基本指令 48
2.3.5 範例 52
2.4 編譯器和編譯入門 53
2.4.1 定義編譯器 54
2.4.2 編譯器架構 55
2.4.3 列錶文件 58
2.4.4 專用編譯器 59
2.5 執行環境 60
2.5.1 軟件執行環境(虛擬機) 60
2.5.2 現代處理器的硬件執行環境 63
2.6 結論 68
第3章 Windows基礎知識 69
3.1 組件及基本架構 70
3.1.1 簡要迴顧 70
3.1.2 特徵 70
3.1.3 支持的硬件 71
3.2 內存管理 71
3.2.1 虛擬內存和分頁 72
3.2.2 工作集 74
3.2.3 內核內存和用戶內存 74
3.2.4 內核內存空間 75
3.2.5 區段對象 77
3.2.6 VAD樹 78
3.2.7 用戶模式的內存分配 78
3.2.8 內存管理API 79
3.3 對象與句柄 80
命名對象 81
3.4 進程與綫程 83
3.4.1 進程 84
3.4.2 綫程 84
3.4.3 運行狀態切換 85
3.4.4 同步對象 86
3.4.5 進程初始化順序 87
3.5 應用程序編程接口 88
3.5.1 Win32 API 88
3.5.2 本地API 90
3.5.3 係統調用機製 91
3.6 可執行文件格式 93
3.6.1 基本概念 93
3.6.2 映像區段(Image Sections) 95
3.6.3 區段對齊(Section Alignment) 95
3.6.4 動態鏈接庫 96
3.6.5 頭部 97
3.6.6 導入與導齣 99
3.6.7 目錄 99
3.7 輸入與輸齣 103
3.7.1 I/O係統 103
3.7.2 Win32子係統 104
3.8 結構化異常處理 105
3.9 結論 107
第4章 逆嚮工具 109
4.1 不同的逆嚮方法 110
4.1.1 離綫代碼分析 110
4.1.2 現場代碼分析 110
4.2 反匯編器——ILDasm 110
4.3 調試器 116
4.3.1 用戶模式調試器 118
4.3.2 內核模式調試器 122
4.4 反編譯器 129
4.5 係統監控工具 129
4.6 修補工具 131
Hex Workshop 131
4.7 其他類型的逆嚮工具 133
可執行程序轉儲工具 133
4.8 結論 138
第2部分 應用逆嚮
第5章 未公開的技術 141
5.1 逆嚮和互操作性 142
5.2 基本原則 142
5.3 定位未公開的API函數 143
我們要找什麼? 144
5.4 案例研究:NTDLL.DLL中的
5.4 Generic Table API 145
5.4.1 RtlInitializeGenericTable 146
5.4.2 RtlNumberGenericTableElements 151
5.4.3 RtlIsGenericTableEmpty 152
5.4.4 RtlGetElementGenericTable 153
5.4.5 RtlInsertElementGenericTable 168
5.4.6 RtlLookupElementGenericTable 188
5.4.7 RtlDeleteElementGenericTable 193
5.4.8 思路整理 194
5.5 結論 196
第6章 破譯文件格式 199
6.1 Cryptex 200
6.2 使用Cryptex 201
6.3 逆嚮Cryptex 202
6.4 口令校驗過程 207
6.4.1 捕獲“Bad Password”消息 207
6.4.2 口令變換算法 210
6.4.3 對口令作hash處理 213
6.5 目錄結構 218
6.5.1 分析目錄處理代碼 218
6.5.2 分析文件項 223
6.6 轉儲目錄結構 227
6.7 文件提取過程 228
6.7.1 掃描文件列錶 234
6.7.2 解密文件 235
6.7.3 浮點運算代碼 236
6.7.4 解密循環 238
6.7.5 驗證Hash值 239
6.8 要點總結 239
6.9 進一步討論 241
6.10 結論 242
第7章 審查程序的二進製碼 243
7.1 定義問題 243
7.2 漏洞 245
7.2.1 堆棧溢齣 245
7.2.2 堆溢齣 255
7.2.3 字符串過濾程序 256
7.2.4 整數溢齣 256
7.2.5 類型轉換錯誤 260
7.3 案例研究:IIS索引服務漏洞 262
7.3.1 CVariableSet::
7.3.1 AddExtensionControlBlock 263
7.3.2 DecodeURLEscapes 267
7.4 結論 271
第8章 逆嚮惡意軟件 273
8.1 惡意軟件的分類 274
8.1.1 病毒 274
8.1.2 蠕蟲 274
8.1.3 特洛伊木馬 275
8.1.4 後門 276
8.1.5 移動代碼 276
8.1.6 廣告軟件和間諜軟件 276
8.2 粘人的軟件(Sticky
8.2 Software) 277
8.3 未來的惡意軟件 278
8.3.1 盜取信息的蠕蟲 278
8.3.2 BIOS/固件惡意軟件 279
8.4 惡意軟件的使用 280
8.5 惡意軟件的弱點 281
8.6 多態 282
8.7 變形 283
8.8 建立安全的環境 285
8.9 Backdoor.Hacarmy.D 285
8.9.1 脫殼可執行文件 286
8.9.2 初次印象 290
8.9.3 初次安裝 291
8.9.4 初始化通信設置 294
8.9.5 連接到服務器 296
8.9.6 連接信道 298
8.9.7 與後門進行通信 299
8.9.8 運行SOCK4服務器 303
8.9.9 清理犯罪現場 303
8.10 The Backdoor.Hacarmy.D:
8.10 命令參考 304
8.11 結論 306
第3部分 破解
第9章 盜版與拷貝保護 309
9.1 世界中的版權 309
9.2 社會方麵 310
9.3 軟件盜版 310
9.3.1 明確問題 311
9.3.2 群破解 312
9.3.3 需求 313
9.3.4 理論上不可破解的模型 314
9.4 各種類型的保護 314
9.4.1 基於介質的保護 314
9.4.2 序列號 315
9.4.3 質詢響應和在綫激活 315
9.4.4 基於硬件的保護 316
9.4.5 軟件即服務 317
9.5 高級保護的概念 318
加密處理器 318
9.6 數字版權管理 319
數字版權管理模型 320
9.7 加水印 321
9.8 可信計算 322
9.9 破解拷貝保護技術 324
9.10 結論 324
第10章 反逆嚮技術 327
10.1 為什麼要反逆嚮? 327
10.2 反逆嚮的基本方法 328
10.3 消除符號信息 329
10.4 代碼加密 330
10.5 活躍的反調試器技術 331
10.5.1 調試器基礎 331
10.5.2 API函數IsDebuggerPresent 332
10.5.3 SystemKernelDebugger
10.5.3 Information 333
10.5.4 用單步中斷檢測SoftICE 334
10.5.5 陷阱標誌 335
10.5.6 代碼校驗和 335
10.6 迷惑反匯編器 336
10.6.1 綫性掃描反匯編器 337
10.6.2 遞歸遍曆反匯編器 338
10.6.3 應用 343
10.7 代碼混淆 344
10.8 控製流變換 346
10.8.1 暗晦謂詞 346
10.8.2 迷惑反編譯器 348
10.8.3 錶譯碼 348
10.8.4 內聯和外聯 353
10.8.5 交叉代碼 354
10.8.6 次序變換 355
10.9 數據變換 355
10.9.1 修改變量編碼 355
10.9.2 重構數組 356
10.10 結論 356
第11章 突破保護 357
11.1 修補程序(Patching) 358
11.2 生成密鑰 364
11.3 取密鑰生成算法 365
11.4 高級破解:Defender 370
11.4.1 逆嚮Defender的初始化程序 377
11.4.2 分析解密後的代碼 387
11.4.3 SoftICE的消失 396
11.4.4 逆嚮分析第二個綫程 396
11.4.5 擊敗“殺手(Killer)”綫程 399
11.4.6 加載KERNEL32.DLL 400
11.4.7 再加密函數 401
11.4.8 迴到入口點 402
11.4.9 解析程序的參數 404
11.4.10 處理用戶名 406
11.4.11 驗證用戶信息 407
11.4.12 解密代碼 409
11.4.13 暴力破解Defender 409
11.5 Defender中的保護技術 415
11.5.1 局部化的函數級加密 415
11.5.2 混淆應用程序與操作係統
11.5.2 之間的接口 416
11.5.3 處理器時間戳驗證綫程 417
11.5.4 在運行時生成解密密鑰 418
11.5.5 重度內聯 419
11.6 結論 419
第4部分 反匯編之外
第12章 逆嚮.NET 423
12.1 基本原則 424
12.2 .NET基礎 426
12.2.1 托管代碼 426
12.2.2 .NET程序設計語言 428
12.2.3 通用類型係統 428
12.3 中間語言 429
12.3.1 求值堆棧 430
12.3.2 活動記錄 430
12.3.3 IL指令 430
12.3.4 代碼實例 433
12.4 反編譯器 443
12.5 混淆器 444
12.5.1 重命名符號 444
12.5.2 控製流混淆 444
12.5.3 中斷反編譯與中斷反匯編 444
12.6 逆嚮混淆代碼 445
12.6.1 XenoCode混淆器 446
12.6.2 DotFuscator by Preemptive
12.6.2 Solutions 448
12.6.3 Remotesoft 混淆器與連接器 451
12.6.4 Remotesoft Protector 452
12.6.5 預編譯的匯編程序 453
12.6.6 加密的匯編程序 453
12.7 結論 455
第13章 反編譯 457
13.1 本地代碼的反編譯:是一個
13.1 解決不瞭的問題嗎? 457
13.2 典型的反編譯器架構 459
13.3 中間錶示 459
13.3.1 錶達式和錶達式樹 461
13.3.2 控製流圖 462
13.4 前端 463
13.4.1 語義分析 463
13.4.2 生成控製流圖 464
13.5 代碼分析 466
13.5.1 數據流分析 466
13.5.2 類型分析 472
13.5.3 控製流分析 475
13.5.4 查找庫函數 475
13.6 反編譯器後端 476
13.7 Real-World IA-32反編譯 477
13.8 結論 477
附錄A 揭密代碼結構 479
附錄B 理解編譯後的算術運算 519
附錄C 破譯程序數據 537
索引 561
· · · · · · (
收起)