《逆向工程權威指南》是2019年3月人民郵電出版社出版的圖書,作者是[烏克蘭]Dennis Yurichev。
基本介紹
- 中文名:逆向工程權威指南
- 作者:[烏克蘭]Dennis Yurichev
- 出版時間:2019年3月
- 出版社:人民郵電出版社
- 頁數:954 頁
- ISBN:9787115434456
- 定價:168 元
- 開本:16 開
- 裝幀:平裝
內容簡介,圖書目錄,
內容簡介
逆向工程是一種分析目標系統的過程,旨在於識別系統的各組件以及組件間關係,以便於通過其它形式、或在較高的抽象層次上,重建系統的表征。
本書專注於軟體的逆向工程,是寫給初學者的一本經典指南。全書共分為12個部分,共102章,涉及X86/X64、ARM/ARM-64、MIPS、Java/JVM等重要話題,詳細解析了Oracle RDBMS、Itanium、軟體狗、LD_PRELOAD、棧溢出、ELF、Win32 PE檔案格式、x86-64(第、critical sections、syscalls、執行緒本地存儲TLS、地址無關代碼)(PIC)、以配置檔案為導向的最佳化、C++ STL、OpenMP、SHE等眾多技術話題,堪稱是逆向工程技術百科全書。除了詳細講解,本書來給出了很多習題來幫助讀者鞏固所學的知識,附錄部分給出了習題的解答。
本書適合對逆向工程技術、作業系統底層技術、程式分析技術感興趣的讀者閱讀,也適合專業的程式開發人員參考。
圖書目錄
第 一部分 編碼模式
第1章 CPU簡介 3
1.1 指令集的作用 3
第 2章 **簡函式 5
2.1 x86 5
2.2 ARM 5
2.3 MIPS 5
2.3.1 MIPS指令集與暫存器名稱 6
第3章 Hello,world! 7
3.1 x86 7
3.1.1 MSVC 7
3.1.2 GCC 9
3.1.3 GCC:AT&T語體 9
3.2 x86-64 11
3.2.1 MSVC-x86-64 11
3.2.2 GCC-x86-64 12
3.3 GCC的其他特性 12
3.4 ARM 13
3.4.1 Keil 6/2013——未啟用最佳化功能的ARM模式 14
3.4.2 Thumb模式下、未開啟最佳化選項的Keil 15
3.4.3 ARM模式下、開啟最佳化選項的Xcode 15
3.4.4 Thumb-2模式下、開啟最佳化選項的Xcode(LLVM) 16
3.4.5 ARM64 18
3.5 MIPS 19
3.5.1 全局指針Global pointer 19
3.5.2 Optimizing GCC 19
3.5.3 Non-optimizing GCC 21
3.5.4 棧幀 23
3.5.5 Optimizing GCC: GDB的分析方法 23
3.6 總結 24
3.7 練習 24
3.7.1 題目1 24
3.7.2 題目2 24
第4章 函式序言和函式尾聲 25
4.1 遞歸調用 25
第5章 棧 26
5.1 為什麼棧會逆增長? 26
5.2 棧的用途 27
5.2.1 保存函式結束時的返回地址 27
5.2.2 參數傳遞 28
5.2.3 存儲局部變數 29
5.2.4 x86:alloca()函式 29
5.2.5 (Windows)SEH結構化
異常處理 31
5.2.6 緩衝區溢出保護 31
5.3 典型的棧的記憶體存儲格式 31
5.4 棧的噪音 31
5.5 練習題 34
5.5.1 題目1 34
5.5.2 題目2 34
第6章 printf()函式與參數調用 36
6.1 x86 36
6.1.1 x86:傳遞3個參數 36
6.1.2 x64:傳遞9個參數 41
6.2 ARM 44
6.2.1 ARM模式下傳遞3個參數 44
6.2.2 ARM模式下傳遞8個參數 46
6.3 MIPS 50
6.3.1 傳遞3個參數 50
6.3.2 傳遞9個參數 52
6.4 總結 56
6.5 其他 57
第7章 scanf() 58
7.1 演示案例 58
7.1.1 指針簡介 58
7.1.2 x86 58
7.1.3 MSVC+OllyDbg 60
7.1.4 x64 62
7.1.5 ARM 63
7.1.6 MIPS 64
7.2 全局變數 65
7.2.1 MSVC:x86 66
7.2.2 MSVC:x86+OllyDbg 67
7.2.3 GCC:x86 68
7.2.4 MSVC:x64 68
7.2.5 ARM: Optimizing Keil 6/2013
(Thumb模式) 69
7.2.6 ARM64 70
7.2.7 MIPS 70
7.3 scanf()函式的狀態監測 74
7.3.1 MSVC:x86 74
7.3.2 MSVC:x86:IDA 75
7.3.3 MSVC:x86+OllyDbg 77
7.3.4 MSVC:x86+Hiew 78
7.3.5 MSVC:x64 79
7.3.6 ARM 80
7.3.7 MIPS 81
7.3.8 練習題 82
第8章 參數獲取 83
8.1 x86 83
8.1.1 MSVC 83
8.1.2 MSVC+OllyDbg 84
8.1.3 GCC 84
8.2 x64 85
8.2.1 MSVC 85
8.2.2 GCC 86
8.2.3 GCC: uint64_t型參數 87
8.3 ARM 88
8.3.1 Non-optimizing Keil 6/2013
(ARM mode) 88
8.3.2 Optimizing Keil 6/2013
(ARM mode) 89
8.3.3 Optimizing Keil 6/2013
(Thumb mode) 89
8.3.4 ARM64 89
8.4 MIPS 91
第9章 返回值 93
9.1 void型函式的返回值 93
9.2 函式返回值不被調用的情況 94
9.3 返回值為結構體型數據 94
第 10章 指針 96
10.1 全局變數 96
10.2 局部變數 98
10.3 總結 100
第 11章 GOTO語句 101
11.1 無用代碼Dead Code 102
11.2 練習題 102
第 12章 條件轉移指令 103
12.1 數值比較 103
12.1.1 x86 103
12.1.2 ARM 109
12.1.3 MIPS 112
12.2 計算絕 對值 115
12.2.1 Optimizing MSVC 115
12.2.2 Optimizing Keil 6/2013: Thumb
mode 116
12.2.3 Optimizing Keil 6/2013: ARM
mode 116
12.2.4 Non-optimizng GCC 4.9
(ARM64) 116
12.2.5 MIPS 117
12.2.6 不使用轉移指令 117
12.3 條件運算符 117
12.3.1 x86 117
12.3.2 ARM 118
12.3.3 ARM64 119
12.3.4 MIPS 119
12.3.5 使用if/else替代條件運算符 120
12.3.6 總結 120
12.3.7 練習題 120
12.4 比較**大值和**小值 120
12.4.1 32位 120
12.4.2 64位 123
12.4.3 MIPS 125
12.5 總結 125
12.5.1 x86 125
12.5.2 ARM 125
12.5.3 MIPS 126
12.5.4 不使用轉移指令 126
第 13章 switch()/case/default 128
13.1 case陳述式較少的情況 128
13.1.1 x86 128
13.1.2 ARM: Optimizing Keil 6/2013
(ARM mode) 133
13.1.3 ARM: Optimizing Keil 6/2013
(Thumb mode) 133
13.1.4 ARM64: Non-optimizing GCC
(Linaro) 4.9 134
13.1.5 ARM64: Optimizing GCC
(Linaro) 4.9 134
13.1.6 MIPS 135
13.1.7 總結 136
13.2 多個case從句 136
13.2.1 x86 136
13.2.2 ARM: Optimizing Keil 6/2013
(ARM mode) 140
13.2.3 ARM: Optimizing Keil 6/2013
(Thumb mode) 141
13.2.4 MIPS 143
13.2.5 總結 144
13.3 case從句多對一的情況 145
13.3.1 MSVC 145
13.3.2 GCC 147
13.3.3 ARM64: Optimizing
GCC 4.9.1 147
13.4 Fall-through 149
13.4.1 MSVC x86 149
13.4.2 ARM64 150
13.5 練習題 151
13.5.1 題目1 151
第 14章 循環 152
14.1 舉例說明 152
14.1.1 x86 152
14.1.2 x86:OllyDbg 155
14.1.3 x86:跟蹤調試工具tracer 156
14.1.4 ARM 157
14.1.5 MIPS 160
14.1.6 其他 161
14.2 記憶體塊複製 161
14.2.1 編譯結果 161
14.2.2 編譯為ARM模式的
程式 162
14.2.3 MIPS 163
14.2.4 矢量化技術 164
14.3 總結 164
14.4 練習題 165
14.4.1 題目1 165
14.4.2 題目2 165
14.4.3 題目3 166
14.4.4 題目4 167
第 15章 C語言字元串的函式 170
15.1 strlen() 170
15.1.1 x86 170
15.1.2 ARM 174
15.1.3 MIPS 177
15.2 練習題 178
15.2.1 練習題1 178
第 16章 數學計算指令的替換 181
16.1 乘法 181
16.1.1 替換為加法運算 181
16.1.2 替換為位移運算 181
16.1.3 替換為位移、加減法的
混合運算 182
16.2 除法運算 186
16.2.1 替換為位移運算 186
16.3 練習題 186
16.3.1 題目2 186
第 17章 FPU 188
17.1 IEEE 754 188
17.2 x86 188
17.3 ARM、MIPD、x86/x64 SIMD 188
17.4 C/C++ 188
17.5 舉例說明 189
17.5.1 x86 189
17.5.2 ARM: Optimizing Xcode
4.6.3 (LLVM) (ARM mode) 193
17.5.3 ARM: Optimizing Keil 6/2013
(Thumb mode) 193
17.5.4 ARM64: Optimizing GCC
(Linaro) 4.9 194
17.5.5 ARM64: Non-optimizing GCC
(Linaro) 4.9 195
17.5.6 MIPS 195
17.6 利用參數傳遞浮點型數據 196
17.6.1 x86 196
17.6.2 ARM + Non-optimizing
Xcode 4.6.3 (LLVM)
(Thumb-2 mode) 197
17.6.3 ARM + Non-optimizing Keil
6/2013 (ARM mode) 198
17.6.4 ARM64 + Optimizing GCC
(Linaro) 4.9 198
17.6.5 MIPS 199
17.7 比較說明 200
17.7.1 x86 200
17.7.2 ARM 216
17.7.3 ARM64 219
Optimizing GCC (Linaro) 4.9—float 220
17.7.4 MIPS 220
17.8 棧、計算器及逆波蘭表示法 221
17.9 x64 221
17.10 練習題 221
17.10.1 題目1 221
17.10.2 題目2 221
第 18章 數組 223
18.1 簡介 223
18.1.1 x86 223
18.1.2 ARM 225
18.1.3 MIPS 228
18.2 緩衝區溢出 229
18.2.1 讀取數組邊界以外的內容 229
18.2.2 向數組邊界之外的地址賦值 231
18.3 緩衝區溢出的保護方法 234
18.3.1 Optimizing Xcode 4.6.3 (LLVM)
(Thumb-2 mode) 236
18.4 其他 238
18.5 字元串指針 238
18.5.1 x64 239
18.5.2 32位ARM 240
18.5.3 ARM64 241
18.5.4 MIPS 242
18.5.5 數組溢出 242
18.6 多維數組 245
18.6.1 二維數組舉例 246
18.6.2 以一維數組的方式訪問
二維數組 247
18.6.3 三維數組 248
18.6.4 更多案例 251
18.7 二維字元串數組的封裝格式 251
18.7.1 32位ARM 253
18.7.2 ARM64 254
18.7.3 MIPS 254
18.7.4 總結 255
18.8 本章小結 255
18.9 練習題 255
18.9.1 題目1 255
18.9.2 題目2 258
18.9.3 題目3 263
18.9.4 題目4 264
18.9.5 題目5 265
第 19章 位操作 270
19.1 特定位 270
19.1.1 x86 270
19.1.2 ARM 272
19.2 設定/清除特定位 274
19.2.1 x86 274
19.2.2 ARM + Optimizing Keil 6/2013
(ARM mode) 277
19.2.3 ARM + Optimizing Keil 6/2013
(Thumb mode) 278
19.2.4 ARM + Optimizing Xcode (LLVM)
+ ARM mode 278
19.2.5 ARM:BIC指令詳解 278
19.2.6 ARM64: Optimizing GCC(Linaro)
4.9 278
19.2.7 ARM64: Non-optimizing GCC (Linaro) 4.9 279
19.2.8 MIPS 279
19.3 位移 279
19.4 在FPU上設定特定位 279
19.4.1 XOR操作詳解 280
19.4.2 x86 280
19.4.3 MIPS 282
19.4.4 ARM 282
19.5 位校驗 284
19.5.1 x86 286
19.5.2 x64 289
19.5.3 ARM + Optimizing Xcode 4.6.3
(LLVM) + ARM mode 291
19.5.4 ARM + Optimizing Xcode 4.6.3
(LLVM)+ Thumb-2 mode 292
19.5.5 ARM64 + Optimizing GCC 4.9 292
19.5.6 ARM64 + Non-optimizing
GCC 4.9 292
19.5.7 MIPS 293
19.6 本章小結 295
19.6.1 檢測特定位(編譯階段) 295
19.6.2 檢測特定位(runtime階段) 295
19.6.3 設定特定位(編譯階段) 296
19.6.4 設定特定位(runtime階段) 296
19.6.5 清除特定位(編譯階段) 296
19.6.6 清除特定位(runtime階段) 297
19.7 練習題 297
19.7.1 題目1 297
19.7.2 題目2 298
19.7.3 題目3 301
19.7.4 題目4 301
第 20章 線性同餘法與偽隨機函式 304
20.1 x86 304
20.2 x64 305
20.3 32位ARM 306
20.4 MIPS 306
20.4.1 MIPS的重新定位 307
20.5 本例的執行緒安全改進版 309
第 21章 結 構 體 310
21.1 MSVC: systemtime 310
21.1.1 OllyDbg 311
21.1.2 以數組替代結構體 312
21.2 用malloc()分配結構體的空間 313
21.3 UNIX: struct tm 315
21.3.1 Linux 315
21.3.2 ARM 317
21.3.3 MIPS 319
21.3.4 數組替代法 320
21.3.5 替換為32位words 322
21.3.6 替換為位元組型數組 323
21.4 結構體的欄位封裝 325
21.4.1 x86 325
21.4.2 ARM 329
21.4.3 MIPS 330
21.4.4 其他 331
21.5 結構體的嵌套 331
21.5.1 OllyDbg 332
21.6 結構體中的位操作 333
21.6.1 CPUID 333
21.6.2 用結構體構建浮點數 337
21.7 練習題 339
21.7.1 題目1 339
21.7.2 題目2 340
第 22章 共用體(union)類型 345
22.1 偽隨機數生成程式 345
22.1.1 x86 346
22.1.2 MIPS 347
22.1.3 ARM (ARM mode) 348
22.2 計算機器精度 349
22.2.1 x86 350
22.2.2 ARM64 350
22.2.3 MIPS 351
22.2.4 本章小結 351
第 二部分 硬體基礎
第 23章 函式指針 352
23.1 MSVC 353
23.1.1 MSVC+OllyDbg 354
23.1.2 MSVC+tracer 355
23.1.3 MSVC + tracer (code coverage) 356
23.2 GCC 357
23.2.1 GCC + GDB
(有原始碼的情況) 358
23.2.2 GCC+GDB
(沒有原始碼的情況) 359
第 24章 32位系統處理64位數據 362
24.1 64位返回值 362
24.1.1 x86 362
24.1.2 ARM 362
24.1.3 MIPS 362
24.2 參數傳遞及加減運算 363
24.2.1 x86 363
24.2.2 ARM 365
24.2.3 MIPS 365
24.3 乘法和除法運算 366
24.3.1 x86 367
24.3.2 ARM 368
24.3.3 MIPS 369
24.4 右移 370
24.4.1 x86 370
24.4.2 ARM 371
24.4.3 MIPS 371
24.5 32位數據轉換為64位數據 371
24.5.1 x86 372
24.5.2 ARM 372
24.5.3 MIPS 372
第 25章 SIMD 373
25.1 並行矢量化 373
25.1.1 用於加法計算 374
25.1.2 用於記憶體複製 379
25.2 SIMD實現strlen() 383
第 26章 64位平台 387
26.1 x86-64 387
26.2 ARM 394
26.3 浮點數 394
第 27章 SIMD與浮點數的並行運算 395
27.1 樣板程式 395
27.1.1 x64 395
27.1.2 x86 396
27.2 傳遞浮點型參數 399
27.3 浮點數之間的比較 400
27.3.1 x64 400
27.3.2 x86 401
27.4 計算機器精 確度 402
27.5 偽隨機數生成程式(續) 402
27.6 總結 403
第 28章 ARM指令詳解 404
28.1 立即數標識(#) 404
28.2 變址定址 404
28.3 常量賦值 405
28.3.1 32位ARM 405
28.3.2 ARM64 405
28.4 重定位 406
第 29章 MIPS的特點 409
29.1 載入常量 409
29.2 閱讀推薦 409
第30章 有符號數的表示方法 413
第31章 位元組序 414
31.1 大端位元組序 414
31.2 小端位元組序 414
31.3 舉例說明 414
31.4 雙模二元數據格式 415
31.5 轉換位元組序 415
第32章 記憶體布局 416
第33章 CPU 417
33.1 分支預測 417
33.2 數據相關性 417
第34章 哈希函式 418
34.1 單向函式與不可逆算法 418
第三部分 一些高 級的例子
第35章 溫度轉換 421
35.1 整數值 421
35.1.1 x86構架下MSVC 2012
最佳化 421
35.1.2 x64構架下的MSVC 2012
最佳化 423
35.2 浮點數運算 423
第36章 Fibonacci數列
(斐波拉契數列) 426
36.1 例子1 426
36.2 例子2 428
36.3 總結 431
第37章 CRC32計算的例子 432
第38章 網路地址計算實例 435
38.1 計算網路地址函式
calc_network_address() 436
38.2 函式form_IP() 437
38.3 函式print_as_IP() 438
38.4 form_netmask()函式和set_bit()
函式 440
38.5 總結 440
第39章 循環:幾個疊代 441
39.1 三個疊代 441
39.2 兩個疊代 442
39.3 Intel C++ 2011實例 443
第40章 Duff的裝置 446
第41章 除以9 449
41.1 x86 449
41.2 ARM 450
41.2.1 ARM模式下,採用Xcode 4.6.3
(LLVM)最佳化 450
41.2.2 Thumb-2模式下的Xcode 4.6.3
最佳化(LLVM) 451
41.2.3 非最佳化的Xcode 4.6.3(LLVM)
以及Keil 6/2013 451
41.3 MIPS 451
41.4 它是如何工作的 452
41.4.1 更多的理論 453
41.5 除法運算 453
41.5.1 變數#1 453
41.5.2 變數#2 454
41.6 練習題 455
第42章 字元串轉換成數字,
函式atoi() 456
42.1 一個簡單的例子 456
42.1.1 64位下的MSVC 2013最佳化 456
42.1.2 64位下的GCC 4.9.1最佳化 457
42.1.3 ARM模式下Keil 6/2013最佳化 457
42.1.4 Thumb模式下Keil 6/2013
最佳化 458
42.1.5 ARM64下的GCC 4.9.1最佳化 458
42.2 一個略微高 級的例子 459
42.2.1 64位下的GCC 4.9.1最佳化 460
42.2.2 ARM模式下的Keil6/2013
最佳化 461
42.3 練習 462
第43章 Inline函式(在線上函式) 463
43.1 字元串和記憶體操作函式 464
43.1.1 字元串比較函式strcmp() 464
43.1.2 字元串長度函式strlen() 466
43.1.3 字元串複製函式strcpy() 466
43.1.4 記憶體設定函式memset() 467
43.1.5 記憶體複製函式memcpy() 468
43.1.6 記憶體對比函式 memcmp() 470
43.1.7 IDA腳本 471
第44章 C99限制 472
第45章 無分支函式abs() 475
45.1 x64下的GCC 4.9.1最佳化 475
45.2 ARM64下的GCC 4.9最佳化 475
第46章 參數個數可變函式 477
46.1 計算算術平均值 477
46.1.1 cdecl調用規範 477
46.1.2 基於暫存器的調用規範 478
46.2 vprintf()函式例子 480
第47章 字元串剪下 482
47.1 x64下的MSVC 2013最佳化 483
47.2 x64下採用編輯器GCC 4.9.1進行
非最佳化操作 484
47.3 x64下的GCC 4.9.1最佳化 485
47.4 ARM64:非最佳化的
GCC(Linaro)4.9 486
47.5 ARM64:最佳化GCC(Linaro)4.9 487
47.6 ARM: Keil 6/2013最佳化
(ARM模式) 488
47.7 ARM:Keil 6/2013
(Thumb模式)最佳化 489
47.8 MIPS 489
第48章 toupper()函式 491
48.1 x64 491
48.1.1 兩個比較操作 491
48.1.2 一個比較操作 492
48.2 ARM 493
48.2.1 ARM64下的GCC 493
48.3 總結 494
第49章 不正確的反彙編代碼 495
49.1 x86環境下的,從一開始錯誤的
反彙編 495
49.2 一些隨機數,怎么看起來像
反彙編指令? 496
第50章 混淆 501
50.1 字元串 501
50.2 可執行代碼 501
50.2.1 插入垃圾代碼 501
50.2.2 用多個指令組合代替原來的
一個指令 502
50.2.3 始終執行或者從來不會執行的
代碼 502
50.2.4 把指令序列搞亂 502
50.2.5 使用間接指針 503
50.3 虛擬機以及偽代碼 503
50.4 一些其他的事情 503
50.5 練習 503
50.5.1 練習1 503
第51章 C++ 504
51.1 類 504
51.1.1 一個簡單的例子 504
51.1.2 類繼承 510
51.1.3 封裝 513
51.1.4 多重繼承 515
51.1.5 虛擬方法 518
51.2 ostream流 521
51.3 引用 522
51.4 STL(standard language file system)標準
語言檔案系統 522
51.4.1 std::string(字元串) 523
51.4.2 std::list函式 529
51.4.3 std::vector標準向量 539
51.4.4 std::map()和std::set() 547
第52章 數組的負數偏移 558
第53章 16位的Windows程式 561
53.1 例子#1 561
53.2 例子#2 561
53.3 例子#3 562
53.4 例子#4 563
53.5 例子#5 566
53.6 例子#6 569
53.6.1 全局變數 571
第四部分 Java
第54章 JAVA 575
54.1 簡介 575
54.2 返回一個值 575
54.3 簡單的計算函式 579
54.4 JVM的記憶體模型 582
54.5 簡單的函式調用 582
54.6 調用函式beep()(蜂鳴器) 584
54.7 線性同餘隨機數產生器(PRNG) 584
54.8 條件跳轉 586
54.9 傳遞參數 588
54.10 位操作 589
54.11 循環 590
54.12 開關函式switch() 592
54.13 數組 593
54.13.1 簡單的例子 593
54.13.2 數組元素求和 594
54.13.3 單一變數的主函式main()依然
是一個數組 595
54.13.4 預設初始值的的數組 596
54.13.5 可變參數函式 597
54.13.6 二維數組 599
54.13.7 三維數組 600
54.13.8 小結 601
54.14 字元串 601
54.14.1 第 一個例子 601
54.14.2 第 二個例子 602
54.15 例外 603
54.16 類 606
54.17 簡單的補丁 608
54.17.1 第 一個例子 608
54.17.2 第 二個例子 610
54.18 總結 612
第五部分 在代碼中發現重要而有趣的內容
第55章 執行檔的識別 615
55.1 Microsoft Visual C++ 615
55.1.1 命名規則 615
55.2 GCC編譯器 615
55.2.1 命名規則 615
55.2.2 Cygwin 615
55.2.3 MinGW 615
55.3 Intel FORTRAN 615
55.4 Watcom以及OpenWatcom 616
55.4.1 命名規則 616
55.5 Borland編譯器 616
55.5.1 Dephi程式語言 616
55.6 其他的已知DLL檔案 617
第56章 Win32環境下與外部通信 618
56.1 在Windows API中**經常使用的函式 618
56.2 tracer:解析指定模組的所有函式 618
第57章 字元串 620
57.1 字元串 620
57.1.1 C/C++中的字元串 620
57.1.2 Borland Delphi 620
57.1.3 Unicode編碼 620
57.1.4 Base64 623
57.2 錯誤/調試信息 623
57.3 可疑的魔數字元串 623
第58章 調用宏assert()
(中文稱為斷言) 624
第59章 常數 625
59.1 魔數 625
59.1.1 動態主機配置協定(Dynamic Host Configuration Protocol,
DHCP) 626
59.2 尋找常數 626
第60章 發現正確的指令 627
第61章 可疑的代碼模型 629
61.1 XOR異或指令 629
61.2 手寫彙編代碼 629
第62章 在跟蹤程式的過程中使用魔數 631
第63章 其他的事情 632
63.1 一般的觀點 632
63.2 C++ 632
63.3 一些二進制檔案模型 632
63.4 記憶體“快照”對比 633
63.4.1 Windows註冊表 633
63.4.2 瞬變比較器Blink-comparator 633
第六部分 作業系統相關
第64章 參數的傳遞方法(調用規範) 637
64.1 cdecl [C Declaration的縮寫] 637
64.2 stdcall [Standard Call的縮寫] 637
64.2.1 有可變參數個數的函式 638
64.3 fastcall 638
64.3.1 GCC regparm 639
64.3.2 Watcom/OpenWatcom 639
64.4 thiscall 639
64.5 64位下的x86 639
64.5.1 Windows x64 639
64.5.2 64位下的Linux 642
64.6 浮點數float和雙精度數double兩種
類型的返回值 642
64.7 修改參數 643
64.8 將指針作為一個函式的參數 643
第65章 執行緒本地存儲TLS 646
65.1 重新審視線性同餘發生器 646
65.1.1 Win32系統 646
65.1.2 Linux系統 650
第66章 系統調用(syscall-s) 652
66.1 Linux 652
66.2 Windows 653
第67章 Linux 654
67.1 與位置無關的代碼 654
67.1.1 Windows 656
67.2 在Linux下的LD_PRELOAD 656
第68章 Windows NT 660
68.1 CRT (Win32) 660
68.2 Win32 PE檔案 663
68.2.1 術語 664
68.2.2 基地址 664
68.2.3 子系統 664
68.2.4 作業系統版本 665
68.2.5 段 665
68.2.6 再分配Relocations(relocs) 666
68.2.7 輸出和輸入 666
68.2.8 資源 669
68.2.9 .NET 669
68.2.10 執行緒本地存儲(Thread Local
Storage,TLS) 669
68.2.11 工具 669
68.2.12 更進一步 669
68.3 Windows SEH 669
68.3.1 讓我們暫時把MSVC
放在一邊 669
68.3.2 讓我們重新回到MSVC 674
68.3.3 Windows x64 687
68.3.4 關於SEH的更多信息 691
68.4 Windows NT:關鍵段 691
第七部分 常用工具
第69章 反彙編工具 697
69.1 IDA 697
第70章 調試工具 698
70.1 tracer 698
70.2 OllyDbg 698
70.3 GDB 698
第71章 系統調用的跟蹤工具 699
71.1 strace/dtruss 699
第72章 反編譯工具 700
第73章 其他工具 701
第八部分 更多範例
第74章 修改任務管理器(Vista) 705
74.1 使用LEA指令賦值 707
第75章 修改彩球遊戲 709
第76章 掃雷(Windows XP) 711
76.1 練習題 715
第77章 人工反編譯與Z3 SMT
求解法 716
77.1 人工反編譯 716
77.2 Z3 SMT求解法 719
第78章 加密狗 724
78.1 例1:PowerPC平台的MacOS Classic
程式 724
78.2 例2: SCO OpenServer 731
78.2.1 解密錯誤信息 739
78.3 例3: MS-DOS 741
第79章 “QR9”:魔方態加密模型 747
第80章 SAP 776
80.1 關閉客戶端的網路數據包壓縮功能 776
80.2 SAP 6.0的密碼驗證函式 787
第81章 Oracle RDBMS 791
81.1 V$VERSION表 791
81.2 X$KSMLRU表 799
81.3 V$TIMER表 800
第82章 彙編指令與屏顯字元 805
82.1 EICAR 805
第83章 實例演示 807
83.110 PRINT CHR$(205.5+RND(1));:
GOTO 10 807
83.1.1 Trixter的42位元組程式 807
83.1.2 筆者對Trixter算法的改進:
27位元組 808
83.1.3 從隨機地址讀取隨機數 808
83.1.4 其他 809
83.2 曼德博集合 809
83.2.1 理論 810
83.2.2 demo程式 814
83.2.3 筆者的改進版 816
第九部分 檔案分析
第84章 基於XOR的檔案加密 821
84.1 Norton Guide:單位元組XOR
加密實例 821
84.1.1 信息熵 822
84.2 4位元組XOR加密實例 822
84.2.1 練習題 824
第85章 Millenium遊戲的存檔檔案 825
第86章 Oracle的.SYM檔案 829
第87章 Oracle的.MSDB檔案 836
87.1 本章總結 839
第十部分 其他
第88章 npad 843
第89章 修改執行檔 845
89.1 文本字元串 845
89.2 x86指令 845
第90章 編譯器內部函式 846
第91章 編譯器的智慧型短板 847
第92章 OpenMP 848
92.1 MSVC 850
92.2 GCC 852
第93章 安騰指令 854
第94章 8086的定址方式 857
第95章 基本塊重排 858
95.1 PGO的最佳化方式 858
第十一部分 推薦閱讀
第96章 參考書籍 863
96.1 Windows 863
96.2 C/C++ 863
96.3 x86/x86-64 863
96.4 ARM 863
96.5 加密學 863
第97章 部落格 864
97.1 Windows平台 864
第98章 其他內容 865
第十二部分 練習題
第99章 初等難度練習 869
99.1 練習題1.4 869
第 100章 中等難度練習 870
100.1 練習題2.1 870
100.1.1 Optimizing MSVC 2010 x86 870
100.1.2 Optimizing MSVC 2012 x64 871
100.2 練習題2.4 871
100.2.1 Optimizing MSVC 2010 871
100.2.2 GCC 4.4.1 872
100.2.3 Optimizing Keil
(ARM mode) 873
100.2.4 Optimizing Keil
(Thumb mode) 874
100.2.5 Optimizing GCC 4.9.1
(ARM64) 874
100.2.6 Optimizing GCC 4.4.5
(MIPS) 875
100.3 練習題2.6 876
100.3.1 Optimizing MSVC 2010 876
100.3.2 Optimizing Keil
(ARM mode) 877
100.3.3 Optimizing Keil
(Thumb mode) 878
100.3.4 Optimizing GCC 4.9.1
(ARM64) 878
100.3.5 Optimizing GCC 4.4.5 (MIPS) 879
100.4 練習題2.13 879
100.4.1 Optimizing MSVC 2012 880
100.4.2 Keil(ARM mode) 880
100.4.3 Keil(Thumb mode) 880
100.4.4 Optimizing GCC 4.9.1
(ARM64) 880
100.4.5 Optimizing GCC 4.4.5
(MIPS) 881
100.5 練習題2.14 881
100.5.1 MSVC 2012 881
100.5.2 Keil(ARM mode) 882
100.5.3 GCC 4.6.3 for Raspberry Pi
(ARM mode) 882
100.5.4 Optimizing GCC 4.9.1
(ARM64) 883
100.5.5 Optimizing GCC 4.4.5
(MIPS) 884
100.6 練習題2.15 885
100.6.1 Optimizing MSVC 2012 x64 886
100.6.2 Optimizing GCC 4.4.6 x64 888
100.6.3 Optimizing GCC 4.8.1 x86 889
100.6.4 Keil(ARM模式):面向
Cortex-R4F CPU的代碼 890
100.6.5 Optimizing GCC 4.9.1
(ARM64) 891
100.6.6 Optimizing GCC 4.4.5
(MIPS) 892
100.7 練習題2.16 893
100.7.1 Optimizing MSVC 2012 x64 893
100.7.2 Optimizing Keil
(ARM mode) 893
100.7.3 Optimizing Keil
(Thumb mode) 894
100.7.4 Non-optimizing GCC 4.9.1
(ARM64) 894
100.7.5 Optimizing GCC 4.9.1
(ARM64) 895
100.7.6 Non-optimizing GCC
4.4.5(MIPS) 898
100.8 練習題2.17 899
100.9 練習題2.18 899
100.10 練習題2.19 899
100.11 練習題2.20 899
第 101章 高難度練習 900
101.1 練習題3.2 900
101.2 練習題3.3 900
101.3 練習題3.4 900
101.4 練習題3.5 900
101.5 練習題3.6 901
101.6 練習題3.8 901
第 102章 Crackme/Keygenme 902
附錄A x86 903
A.1 數據類型 903
A.2 通用暫存器 903
A.2.1 RAX/EAX/AX/AL 903
A.2.2 RBX/EBX/BX/BL 904
A.2.3 RCX/ECX/CX/CL 904
A.2.4 RDX/EDX/DX/DL 904
A.2.5 RSI/ESI/SI/SIL 904
A.2.6 RDI/EDI/DI/DIL 904
A.2.7 R8/R8D/R8W/R8L 905
A.2.8 R9/R9D/R9W/R9L 905
A.2.9 R10/R10D/R10W/R10L 905
A.2.10 R11/R11D/R11W/R11L 905
A.2.11 R12/R12D/R12W/R12L 905
A.2.12 R13/R13D/R13W/R13L 905
A.2.13 R14/R14D/R14W/R14L 906
A.2.14 R15/R15D/R15W/R15L 906
A.2.15 RSP/ESP/SP/SPL 906
A.2.16 RBP/EBP/BP/BPL 906
A.2.17 RIP/EIP/IP 906
A.2.18 段地址暫存器
CS/DS/ES/SS/FS/GS 907
A.2.19 標識暫存器 907
A.3 FPU暫存器 907
A.3.1 控制字暫存器(16位) 908
A.3.2 狀態字暫存器(16位) 908
A.3.3 標記字暫存器(16位) 909
A.4 SIMD暫存器 909
A.4.1 MMX暫存器 909
A.4.2 SSE與AVX暫存器 909
A.5 FPU調試暫存器 909
A.5.1 DR6規格 910
A.5.2 DR7規格 910
A.6 指令 911
A.6.1 指令前綴 911
A.6.2 常見指令 911
A.6.3 不常用的彙編指令 916
A.6.4 FPU指令 921
A.6.5 可屏顯的彙編指令(32位) 922
附錄B ARM 925
B.1 術語 925
B.2 版本差異 925
B.3 32位ARM(AArch32) 925
B.3.1 通用暫存器 925
B.3.2 程式狀態暫存器/CPSR 925
B.3.3 VFP(浮點)和NEON暫存器 926
B.4 64位ARM(AArch64) 926
B.4.1 通用暫存器 926
B.5 指令 927
B.5.1 Conditional codes速查表 927
附錄C MIPS 928
C.1 暫存器 928
C.1.1 通用暫存器GPR 928
C.1.2 浮點暫存器FPR 928
C.2 指令 928
C.2.1 轉移指令 929
附錄D 部分GCC庫函式 930
附錄E 部分MSVC庫函式 931
附錄E 部分MSVC庫函式 931
附錄G 練習題答案 935
G.1 各章練習 935
G.1.1 “棧” 935
G.1.2 “switch()/case/default”語句 935
G.1.3 練習題#1 935
G.1.4 “Loop”語句 935
G.1.5 練習題#3 935
G.1.6 練習題#4 935
G.1.7 C語言字元串處理練習題 936
G.1.8 算術指令替代 936
G.1.9 FPU練習題 936
G.1.10 數組練習題 936
G.1.11 位操作練習題 937
G.1.12 結構體練習題 939
G.1.13 混淆技術練習題 940
G.1.14 除9練習題 940
G.2 初級練習題 940
G.2.1 練習題1.1 940
G.2.2 練習題1.4 940
G.3 中級練習題 941
G.3.1 練習題2.1 941
G.3.2 練習題2.4 941
G.3.3 練習題2.6 942
G.3.4 練習題2.13 942
G.3.5 練習題2.14 943
G.3.6 練習題2.15 943
G.3.7 練習題2.16 943
G.3.8 練習題2.17 943
G.3.9 練習題2.18 943
G.3.10 練習題2.19 943
G.3.11 練習題2.20 943
G.4 高難度練習題 943
G.4.1 練習題3.2 943
G.4.2 練習題3.3 943
G.4.3 練習題3.4 944
G.4.4 練習題3.5 944
G.4.5 練習題3.6 944
G.4.6 練習題3.8 944
G.5 其他練習題 944
G.5.1 “掃雷(Windows XP)” 944
參考文獻 947