逆嚮工程權威指南

逆嚮工程權威指南 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
隱秘代碼的解析:軟件安全與係統深層探索 書籍名稱: 隱秘代碼的解析:軟件安全與係統深層探索 本書簡介: 在這部深刻剖析現代計算核心的著作中,我們將帶領讀者穿越數字世界的錶層,直抵二進製的深處,探索那些驅動我們日常技術生活的復雜機製。本書並非一部操作手冊,而是一次對軟件構建哲學、安全邊界以及係統級交互的深度考察。我們關注的焦點在於理解“黑盒”是如何被設計、如何運作,以及在何種情況下它們可能會失效或被惡意利用。 本書的基石建立在對計算原理的嚴謹理解之上。我們將從底層硬件架構的視角齣發,詳細闡述處理器的工作模式、內存的組織結構以及操作係統內核如何扮演著資源仲裁者的角色。這不僅僅是理論的堆砌,而是與實際係統行為緊密結閤的分析。我們將深入研究指令集架構(ISA)的細微差彆,探討不同CPU傢族(如x86-64、ARM)在執行效率和安全特性上的權衡,為後續的深入分析打下堅實的基礎。 在軟件層麵,本書將目光投嚮編譯器的奧秘。我們將揭示源代碼如何被一步步轉化為可執行的機器碼。這包括對匯編語言的精煉學習——不僅是語法層麵的認知,更是理解其背後的邏輯流和數據操作模式。重點將放在異常處理機製、函數調用約定(Calling Conventions)以及編譯器優化策略如何影響最終二進製文件的行為。理解這些轉換過程,是洞察程序執行路徑的關鍵。 安全是貫穿全書的核心主題。我們不再滿足於僅僅使用安全工具,而是探究這些工具賴以運作的底層原理。本書將係統地剖析各類常見的軟件漏洞,例如棧溢齣、堆溢齣、格式化字符串漏洞以及競爭條件。對於每一種漏洞,我們都會進行細緻的入微分析,首先展示其在源代碼層麵的潛在成因,然後追蹤它如何在編譯和鏈接階段轉化為可被利用的機器碼序列。更重要的是,我們將探討現代防禦機製的運作方式:地址空間布局隨機化(ASLR)、數據執行保護(DEP/NX位)、堆棧保護(Stack Canaries)以及沙箱隔離技術。我們將深入研究這些防禦層是如何在底層硬件和操作係統內核的協同作用下實現的,並討論當前繞過這些保護的先進技術思路。 此外,本書將拓展到對復雜軟件係統的動態分析方法論。我們摒棄瞭單純的“打斷點、看寄存器”的淺層調試,轉而關注如何構建一套有效的、針對特定目標的分析框架。這涉及到對程序執行流的重構、識彆關鍵的控製流轉移點、以及如何高效地處理加密、混淆或反調試保護的代碼段。我們將詳細闡述狀態機分析、符號執行(Symbolic Execution)的基本概念及其在自動化漏洞發現中的應用潛力,討論符號執行引擎(如Angr或Triton)在處理現實世界復雜程序時的挑戰與優化策略。 對固件和嵌入式係統的分析是本書的另一重要組成部分。隨著物聯網(IoT)設備的普及,理解非傳統計算環境下的安全挑戰變得尤為重要。我們將探討如何獲取和解析嵌入式係統的固件映像,如何識彆其中包含的引導加載程序(Bootloaders)和定製化的操作係統內核。針對資源受限的環境,我們將分析其特有的內存布局、定製化的編譯器選項,以及由此産生的特定安全漏洞模式。 本書的敘事結構旨在培養一種“逆嚮思維”——一種不僅能識彆現象,更能追溯其根源的能力。我們鼓勵讀者將每一次對未知代碼的探索視為一次科學實驗,通過假設、驗證和迭代,逐步還原設計者的意圖。對於係統級編程人員、安全研究人員,以及任何對軟件世界深層構造充滿好奇心的技術人員而言,本書提供瞭一條清晰的路徑,幫助他們超越API的錶象,真正掌握數字世界的底層語言。這是一本關於理解、挑戰和重塑軟件本質的深度指南。 --- 預期讀者: 具有中級C/C++編程基礎,並希望深入理解程序如何被執行的軟件工程師。 專注於漏洞研究、滲透測試或安全審計的專業人員。 操作係統、編譯器設計或計算機體係結構的學生和研究人員。 對固件分析、硬件/軟件接口安全感興趣的技術愛好者。 全書核心理念: 真正的理解來源於對抽象層剝離的勇氣。我們不接受“它就是這樣工作”的解釋,而是緻力於探究“它為何必須這樣工作”的底層邏輯。本書旨在培養一種批判性思維,使讀者能夠獨立分析任何陌生的二進製程序結構。

用戶評價

評分

這本書實在是太齣乎我的意料瞭!我本來以為這會是一本枯燥的技術手冊,結果卻像是一場深入淺齣的智力探險。作者的敘述方式非常流暢,仿佛在和我進行一場私密的、高手對決前的戰前沙盤推演。他沒有直接堆砌晦澀難懂的術語,而是通過一係列引人入勝的案例分析,將那些看似遙不可及的底層原理,一點點地剖開,展現齣其精妙的結構。特彆是關於軟件保護機製的章節,作者的洞察力令人嘆服,他不僅展示瞭如何繞過這些屏障,更重要的是,他解釋瞭設計這些保護機製的初衷和背後的安全哲學。閱讀過程中,我好幾次停下來,對著屏幕沉思良久,那種“原來如此”的頓悟感,是其他同類書籍從未帶給我的。這本書的價值,絕非僅在於技術實現,更在於它塑造瞭一種批判性思維,教會我如何跳齣既定框架,用質疑的眼光去看待一切既成的係統。對於任何想要真正理解軟件內部運作邏輯的工程師來說,這本書簡直是開啓新世界大門的鑰匙。

評分

這本書的排版和圖示設計,簡直是業界良心。對於這種高度依賴視覺化理解的技術書籍來說,這一點太重要瞭。以往我讀過的相關書籍,圖錶總是密密麻麻,邏輯綫索完全被淹沒在信息洪流中。但在這本《指南》裏,每一張流程圖、每一個內存布局示意圖,都經過瞭精心的設計,它們的作用不是簡單地復述文字,而是作為一種獨立的、更直觀的解釋媒介。例如,在講解棧幀結構和函數調用約定那一章,作者用極其簡潔的圖形,將寄存器的變化和內存地址的偏移量清晰地勾勒齣來,即便是初學者也能一目瞭然。這種對用戶體驗的極緻追求,讓我感受到瞭作者對讀者群體的尊重。毫不誇張地說,僅僅是研究那些精美的圖錶,就已經讓我對一些復雜的底層交互有瞭更深刻的理解,這使得學習過程的挫敗感大大降低,代之以持續的探索樂趣。

評分

說實話,我拿到這本書的時候,心裏是抱著一種功利性的期待的,希望它能快速解決我手上那個棘手的遺留係統分析難題。但讀完前幾章後,我發現自己完全被作者對“係統本質”的探討所吸引住瞭。這本書的深度,已經超越瞭單純的“如何做”(How-to),而深入到瞭“為何如此”(Why)的哲學層麵。它沒有給我那種即插即用的“秘籍”,反而提供瞭一種更高級的武器——思維模型。作者對於不同架構風格的優劣勢對比分析得極其透徹,他不僅對比瞭編譯型和解釋型語言在逆嚮環境下的不同錶現,還細緻地闡述瞭不同操作係統內核設計對二進製程序結構的影響。我尤其欣賞他對“模糊測試”和“符號執行”這兩個前沿領域的介紹,其講解的邏輯清晰度,遠勝於我之前閱讀過的任何專業論文。這本書更像是一位資深架構師,在你耳邊低語,引導你看到代碼背後的架構師的意圖,這對於提升我的架構設計能力都有極大的幫助。

評分

我必須承認,這本書的閱讀門檻比我想象的要高一些,但隻要你願意投入時間,它的迴報率是驚人的。它更像是一部需要反復研讀的經典,而不是一次性消費的快餐讀物。作者在行文間偶爾會引用一些曆史上的經典安全漏洞案例,並結閤現代的技術背景進行重新審視,這種跨越時間維度的對比分析,展現瞭作者深厚的知識儲備和極高的學術素養。我特彆喜歡他對於“元數據丟失”對分析工作造成影響的論述,這方麵的內容在很多入門教材中是被一筆帶過的。他深入探討瞭鏈接器和加載器在信息丟失過程中的角色,這讓我重新思考瞭我們在構建軟件時,無意中丟棄瞭多少可供分析的寶貴信息。這本書的真正價值在於,它培養瞭一種對“細節的偏執”,鼓勵讀者去追問每一個被默認接受的“常識”。

評分

這本書的氣質是沉穩而厚重的,它不像市場上那些追逐熱點的新書那樣浮躁,而是沉下心來,構建瞭一個完整而自洽的知識體係。作者在討論高級調試技巧時,並沒有拘泥於某一個特定工具的使用說明,而是從調試器內部的工作原理齣發,闡釋瞭斷點、觀察點、指令追蹤等操作背後的CPU級事件。這使得即使未來工具更新換代,書中的核心原理依然是適用的。我感受最深的是作者對於“安全邊界”的理解,他清晰地界定瞭硬件、操作係統、編譯器和應用程序層之間的職責劃分,並展示瞭當這些邊界被模糊或侵犯時,係統會發生什麼。這本書不僅僅是教你如何解構一個已有的程序,更是教你如何從設計之初就構建一個難以被逆嚮分析的健壯係統。對於所有嚴肅對待軟件安全和底層優化的專業人士而言,這本書是不可或缺的案頭參考。

評分

很不錯的一本書,包裝也很不錯,沒有破損,京東買的很便宜,喜歡

評分

心血來潮想到就買瞭。買來當枕頭書瞭。需要花很多時間纔能懂。

評分

京東購物送貨就是快,省心省力!

評分

這次300-200買的,十分劃算,希望京東多多做這樣的活動!

評分

書質量很好,內容還在看

評分

每年京東活動買書,推薦給大傢

評分

這幾周買瞭好多書,價格十分實惠,有時間慢慢看看

評分

京東購物送貨就是快,省心省力!

評分

書挺厚,同時紙張也挺厚,比其他兩本要厚。內容是韓國人寫的,這方麵的書比較少,先買來一本看看。

相關圖書

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.tinynews.org All Rights Reserved. 静思书屋 版权所有