編輯推薦
逆嚮工程是一種分析目標係統的過程。
本書專注於軟件逆嚮工程,即研究編譯後的可執行程序。本書是寫給初學者
的一本經典指南。全書共分為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 MI
逆嚮工程權威指南 下載 mobi epub pdf txt 電子書 格式