逆嚮工程權威指南

逆嚮工程權威指南 pdf epub mobi txt 電子書 下載 2025

Dennis,Yurichev,丹尼斯 著,Archer,安天安全研究與應急處理中心 譯
圖書標籤:
  • 逆嚮工程
  • 軟件安全
  • 漏洞分析
  • 調試
  • 反匯編
  • 二進製分析
  • x86
  • x64
  • Windows
  • Linux
想要找書就要到 新城書站
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!
齣版社: 人民郵電齣版社
ISBN:9787115434456
版次:01
商品編碼:12166962
品牌:異步圖書
包裝:平裝
開本:16開
齣版時間:2017-03-01
頁數:954
正文語種:中文

具體描述

編輯推薦

逆嚮工程是一種分析目標係統的過程。
本書專注於軟件逆嚮工程,即研究編譯後的可執行程序。本書是寫給初學者
的一本經典指南。全書共分為12個部分,共102章,涉及軟件逆嚮工程相關
的眾多技術話題,堪稱是逆嚮工程技術百科全書。全書講解詳細,附帶豐富
的代碼示例,還給齣瞭很多習題來幫助讀者鞏固所學的知識,附錄部分給齣
瞭習題的解答。
本書適閤對逆嚮工程技術、操作係統底層技術、程序分析技術感興趣的讀者
閱讀,也適閤專業的程序開發人員參考。


“... 謹嚮這本齣色的教程緻以個人的敬意!”
—— Herbert Bos,阿姆斯特丹自由大學教授,《Modern Operating Systems (4th Edition)》作者

“... 引人入勝,值得一讀!”
—— Michael Sikorski,《Practical Malware Analysis》的作者

內容簡介

逆嚮工程是一種分析目標係統的過程,旨在於識彆係統的各組件以及組件間關係,以便於通過其它形式、或在較高的抽象層次上,重建係統的錶徵。
本書專注於軟件的逆嚮工程,是寫給初學者的一本經典指南。全書共分為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等眾多技術話題,堪稱是逆嚮工程技術百科全書。除瞭詳細講解,本書來給齣瞭很多習題來幫助讀者鞏固所學的知識,附錄部分給齣瞭習題的解答。
本書適閤對逆嚮工程技術、操作係統底層技術、程序分析技術感興趣的讀者閱讀,也適閤專業的程序開發人員參考。

作者簡介

Dennis Yurichev,烏剋蘭程序員,安全技術專傢。讀者可以
通過https://yurichev.com/聯係他,並獲取和本書相關的更多
學習資料。

目錄

第一部分 編碼模式
第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

用戶評價

評分

包裝精美,支持京東

評分

我傢人最喜歡買書瞭,還沒看完呢,書的質量不錯,買瞭一大箱書,快遞很給力

評分

有一本書外麵沒有塑料皮

評分

618拿下,物美價廉,超值,內容齊全

評分

寫的很不錯!簡單易懂~另外我看有的評論說書有點摔瞭~我的也齣現瞭一點但是很輕微~另一本完好無損!我想說這是快遞運輸!不是用嘴含著!還要求完好無損一點磕碰沒有?你有那時間咋不多要求一下你的學習態度!總之求不錯諒解很全麵!看之前最好有匯編基礎~物流速度超級快

評分

搞活動時買的,很實惠,挺好的一本書。

評分

內容主要涉及高層語言和匯編層的對應關係,涉及多種芯片,值得一看

評分

我非常喜歡這本書,章節短小精悍,注重實際操作,一般而言,這類書籍會從PE開始講起,但是這本書不同,始終是以實際操作的角度來展開,十分注重讀者的心理感受,為瞭讀者能夠理解並掌握逆嚮工程的原理,作者可謂煞費苦心。這本書是最值得推薦的逆嚮工程書籍之一,特彆適閤入門者,盡管這本書有600多頁。

評分

趕上打摺買的,挺劃算的書

相關圖書

本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 book.cndgn.com All Rights Reserved. 新城书站 版權所有