第1部分 調試工具入門調試工具簡介 2
1.1 了解你的需求 4
1.2 理解調試器的工作原理 7
1.3 處理異常 8
第2章 在UNIX環(huán)境中進行調試的特性 10
2.1 Ptrace是GDB的基礎調試工具 12
2.1.1 Ptrace及其命令 14
2.1.2 GDB的多線程支持 15
2.1.3 GDB簡明指南 16
2.1.4 追蹤系統(tǒng)調用 20
2.1.5 相關鏈接 21
2.2 UNIX中的黑客工具 22
2.2.1 調試器 22
2.2.2 反匯編工具 26
2.2.3 偵查軟件 27
2.2.4 十六進制編輯器 28
2.2.5 內存轉儲程序 29
2.2.6 自動保護工具 29
第3章 模擬調試器和仿真器 31
3.1 最低系統(tǒng)要求 32
3.2 選擇一個仿真器 33
3.2.1 安全性 33
3.2.2 可擴展性 34
3.2.3 是否有源程序 34
3.2.4 仿真質量 34
3.2.5 一個內置的調試器 35
3.3 常見仿真器概述 36
3.3.1 DOSBox 36
3.3.2 Bochs 37
3.3.3 微軟Virtual PC 38
3.3.4 VMware 40
3.3.5 仿真器特性匯總表 41
3.4 注解 41
3.5 仿真器的應用領域 41
3.5.1 一般用戶使用的仿真器 42
3.5.2 管理員使用的仿真器 43
3.5.3 軟件開發(fā)人員使用的仿真器 43
3.5.4 黑客使用的仿真器 45
3.5.5 如何在VMware中配置SoftIce 46
3.56. 用于其他設備的仿真器 46
3.6 關于處理器仿真 47
第4章 用BoundsChecker進行應用程序分析 52
4.1 快速開始 54
4.2 裝載非標準的DLLs 56
4.3 菜單項 57
第2部分 調試工具入門
第5章 保護機制簡介 62
5.1 基于密鑰類型的保護機制分類 63
5.2 創(chuàng)建保護與試圖破解 65
5.3 從EXE到CRK 67
第6章 熟悉調試器 82
6.1 方法0:破解原始密碼 83
6.2 方法1:直接在內存中查找輸入的密碼 94
6.3 方法2:在密碼輸入函數中設置斷點 102
6.4 方法3:在消息中設置斷點 105
第7章 IDA嶄露頭角 108
7.1 與調試器一起使用反匯編器 134
7.2 關于IDA C語言 136
第8章 注冊保護機制之道 140
8.1 如何利用序數來發(fā)現(xiàn)函數名 144
8.2 如何使可執(zhí)行程序變小 165
8.3 設陷捕獲WM_GETTEXT 166
第9章 散列及其克服 169
第10章 常見的用于演示版的保護機制 184
10.1 限制功能 184
10.2 限制使用期限 201
10.3 限制啟動次數 205
10.4 干擾屏幕 207
10.5 密鑰文件 215
第3部分 反調試技術
第11章 反調試技術簡介 228
反調試技術概述 229
第12章 各種各樣的反調試技術 232
12.1 防御實模式調試器的技術 232
隱含地調用構造函數 245
12.2 防御保護模式調試器的技術 246
檢測SoftIce 258
12.3 如何防止追蹤 259
追蹤 263
12.4 如何抵御斷點 265
12.4.1 幾種骯臟的黑客手法 271
12.4.2 從中間調用API 272
12.4.3 通過“死亡”帶調用API 286
12.4.4 拷貝完整的API函數 289
12.4.5 Windows NT/2000裝載程序中的一個缺陷 290
12.4.6 Windows NT/2000裝載程序中的另一個缺陷 291
12.5 如何利用Windows工具來檢測調試 291
第13章 UNIX特有的反調試技術 293
13.1 寄生的文件描述符 293
13.2 命令行參數與環(huán)境變量 294
13.3 進程樹 295
13.4 信號、轉儲和異常 296
13.5 檢測軟件斷點 296
13.6 螳螂捕蟬,黃雀在后 297
13.7 直接在內存中查找調試器 298
13.8 測量執(zhí)行時間 299
第14章 可自我修改的代碼 300
14.1 可自我修改代碼的一個例子 309
14.2 通過因特網來修改代碼的問題 310
14.3 注解 312
第15章 使用隱含的自我控制來創(chuàng)建不可破解的保護 313
15.1 隱含的自我控制技術 314
15.2 實用的實現(xiàn) 316
15.3 如何破解 324
第16章 智力調試 333
16.1 反匯編 333
幾個小技巧 354
16.2 匯編 355
第17章 軟件保護 360
17.1 盒子方案的缺點 361
17.2 防止非法拷貝和共享序列號的保護方法 361
17.3 試用版的保護方法 362
17.4 防止算法重建的保護方法 362
17.5 防止在磁盤和內存中改寫的保護方法 363
17.6 抵御反匯編器 364
17.7 抵御調試器 365
17.8 抵御監(jiān)視程序 365
17.9 抵御轉儲 365
17.10 如何自我保護 367
17.11 關于保護機制的幾點想法 368
17.12 防止泄露源程序 369
17.13 防止分析二進制代碼 371
第18章 如何使你的應用程序更
第18章 可靠 374
18.1 溢出錯誤的原因和后果 374
18.2 移植到另一種語言 376
18.3 利用堆來創(chuàng)建數組 376
18.4 放棄使用結束標志 377
18.5 結構化異常處理 378
18.6 傳統(tǒng)與可靠 379
18.7 防止溢出錯誤 380
18.8 查找易受攻擊的程序 381
18.9 C語言中不正確的優(yōu)先級選擇 384
第19章 軟件測試 387
19.1 微觀層上的測試 388
19.2 把錯誤記錄在案 389
19.3 Beta測試 390
19.4 診斷信息的輸出 391
19.5 概要 393
19.6 C/C++語言檢驗程序 393
19.7 累計誤差的演示 394
19.8 幾點注解 396
第4部分 應用程序和操作系統(tǒng)的嚴重錯誤應用程序和操作系統(tǒng)的嚴重
第20章 錯誤簡介 400
20.1 應用程序、非法操作和其他 401
20.1.1 Doctor Watson 402
20.1.2 微軟Visual Studio Debug 409
第21章 戰(zhàn)兢茍活還是出死入生 411
21.1 強制退出函數 411
21.2 回繞堆棧 414
21.3 將控制傳給消息處理函數 417
第22章 如何利用內存轉儲 424
22.1 在出現(xiàn)嚴重錯誤后恢復系統(tǒng) 431
NT內核的符號名前綴 432
22.2 裝載死機轉儲 433
第5部分 PE文件
第23章 PE文件格式 440
23.1 簡介 440
23.2 各種實現(xiàn)系統(tǒng)的PE文件結構特征 441
23.3 PE文件的一般概念和要求 442
23.4 PE文件結構 444
23.5 可做的事與不可做的事 447
23.6 PE文件各主要字段描述 449
23.6.1 [old-exe] e_magic 449
23.6.2 [old-exe] e_cparhdr 449
23.6.3 [old-exe] e_lfanew 449
23.6.4 [IMAGE_FILE_HEADER] Machine 450
23.6.5 [IMAGE_FILE_HEADER] NumberOfSections 450
23.6.6 [image_file_header]PointerTo SymbolTable/NumberOf Symbols 451
23.6.7 [image_file_header] SizeOfOptionalHeader 451
23.6.8 [image_file_header] Characteristics 451
23.6.9 [image_opional_header] Magic 453
23.6.10 [image_opional_header]Size OfCode/SizeOfInitializedData/SizeOfUninitializedData 453
23.6.11 [image_opional_header] BaseOfCode/BaseOfData 454
23.6.12 [image_opional_header] AddressOfEntryPoint 454
23.6.13 [image_opional_header] ImageBase 454
23.6.14 [image_opional_header]File Alignment/SectionAlignment 455
23.6.15 [image_opional_header] SizeOfImage 456
23.6.16 [image_opional_header] SizeOfHeader 456
23.6.17 [image_opional_header] CheckSum 457
23.6.18 [image_opional_header] Subsystem 457
23.6.19 [image_opional_header] DllCharacteristics 458
23.6.20 [image_opional_header]SizeOf StackReserve/SizeOfStack Commit, SizeOfHeapReserve/SizeOfHeapCommit 458
23.6.21 [image_opional_header] NumberOfRvaAndSizes 458
23.6.22 DATA DIRECTORY 459
23.6.23 段表 461
23.6.24 輸出 465
23.6.25 輸入 468
23.6.26 可重定位元素 475
第24章 在PE文件中插入和刪除代碼的技術 479
24.1 簡介 479
24.2 X-Code和其他的常規(guī)表示法 480
24.3 X-Code的目標和任務 481
24.4 X-Code的要求 483
24.5 代碼插入 484
24.5.1 避免多次插入 485
24.5.2 插入機制的分類 486
24.5.3 類別A:插入到文件內的可用空閑空間中 487
24.5.4 類別A:依靠壓縮文件的某些部分來插入X-Code 500
24.5.5 類別A:在文件內創(chuàng)建一個新的NTFS流 502
24.5.6 類別B:改變文件頭的大小 503
24.5.7 類別B:將段的部分灌入到重疊段 506
24.5.8 類別B:創(chuàng)建自己的重疊段 508
24.5.9 類別C:擴展文件的最后一個段 509
24.5.10 類別C:創(chuàng)建一個新的段 512
24.5.11 類別C:擴展宿主文件的中間段 513
24.5.12 類別Z:通過自動裝載DLL來插入X-Code 516
24.6 小結 516
附盤說明 517