逆向工程是一種分析目標系統(tǒng)的過程,旨在于識別系統(tǒng)的各組件以及組件間關(guān)系,以便于通過其它形式、或在較高的抽象層次上,重建系統(tǒng)的表征。
本書專注于軟件的逆向工程,是寫給初學者的一本經(jīng)典指南。全書共分為12個部分,共102章,涉及X86/X64、ARM/ARM-64、MIPS、Java/JVM等重要話題,詳細解析了Oracle RDBMS、Itanium、軟件狗、LD_PRELOAD、棧溢出、ELF、Win32 PE文件格式、x86-64(第、critical sections、syscalls、線程本地存儲TLS、地址無關(guān)代碼(PIC)、以配置文件為導向的優(yōu)化、C STL、OpenMP、SHE等眾多技術(shù)話題,堪稱是逆向工程技術(shù)百科全書。除了詳細講解,本書來給出了很多習題來幫助讀者鞏固所學的知識,附錄部分給出了習題的解答。
本書適合對逆向工程技術(shù)、操作系統(tǒng)底層技術(shù)、程序分析技術(shù)感興趣的讀者閱讀,也適合專業(yè)的程序開發(fā)人員參考。
第 一部分 編碼模式
第1章 CPU簡介 3
1.1 指令集的作用 3
第 2章 **簡函數(shù) 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——未啟用優(yōu)化功能的ARM模式 14
3.4.2 Thumb模式下、未開啟優(yōu)化選項的Keil 15
3.4.3 ARM模式下、開啟優(yōu)化選項的Xcode 15
3.4.4 Thumb-2模式下、開啟優(yōu)化選項的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 總結(jié) 24
3.7 練習 24
3.7.1 題目1 24
3.7.2 題目2 24
第4章 函數(shù)序言和函數(shù)尾聲 25
4.1 遞歸調(diào)用 25
第5章 ?!?6
5.1 為什么棧會逆增長? 26
5.2 棧的用途 27
5.2.1 保存函數(shù)結(jié)束時的返回地址 27
5.2.2 參數(shù)傳遞 28
5.2.3 存儲局部變量 29
5.2.4 x86:alloca()函數(shù) 29
5.2.5?。╓indows)SEH結(jié)構(gòu)化
異常處理 31
5.2.6 緩沖區(qū)溢出保護 31
5.3 典型的棧的內(nèi)存存儲格式 31
5.4 棧的噪音 31
5.5 練習題 34
5.5.1 題目1 34
5.5.2 題目2 34
第6章 printf()函數(shù)與參數(shù)調(diào)用 36
6.1 x86 36
6.1.1 x86:傳遞3個參數(shù) 36
6.1.2 x64:傳遞9個參數(shù) 41
6.2 ARM 44
6.2.1 ARM模式下傳遞3個參數(shù) 44
6.2.2 ARM模式下傳遞8個參數(shù) 46
6.3 MIPS 50
6.3.1 傳遞3個參數(shù) 50
6.3.2 傳遞9個參數(shù) 52
6.4 總結(jié) 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()函數(shù)的狀態(tài)監(jiān)測 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章 參數(shù)獲取 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型參數(shù) 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型函數(shù)的返回值 93
9.2 函數(shù)返回值不被調(diào)用的情況 94
9.3 返回值為結(jié)構(gòu)體型數(shù)據(jù) 94
第 10章 指針 96
10.1 全局變量 96
10.2 局部變量 98
10.3 總結(jié) 100
第 11章 GOTO語句 101
11.1 無用代碼Dead Code 102
11.2 練習題 102
第 12章 條件轉(zhuǎn)移指令 103
12.1 數(shù)值比較 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 不使用轉(zhuǎn)移指令 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 總結(jié) 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 總結(jié) 125
12.5.1 x86 125
12.5.2 ARM 125
12.5.3 MIPS 126
12.5.4 不使用轉(zhuǎn)移指令 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 總結(jié) 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 總結(jié) 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章 循環(huán) 152
14.1 舉例說明 152
14.1.1 x86 152
14.1.2 x86:OllyDbg 155
14.1.3 x86:跟蹤調(diào)試工具tracer 156
14.1.4 ARM 157
14.1.5 MIPS 160
14.1.6 其他 161
14.2 內(nèi)存塊復制 161
14.2.1 編譯結(jié)果 161
14.2.2 編譯為ARM模式的
程序 162
14.2.3 MIPS 163
14.2.4 矢量化技術(shù) 164
14.3 總結(jié) 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語言字符串的函數(shù) 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章 數(shù)學計算指令的替換 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 利用參數(shù)傳遞浮點型數(shù)據(jù) 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章 數(shù)組 223
18.1 簡介 223
18.1.1 x86 223
18.1.2 ARM 225
18.1.3 MIPS 228
18.2 緩沖區(qū)溢出 229
18.2.1 讀取數(shù)組邊界以外的內(nèi)容 229
18.2.2 向數(shù)組邊界之外的地址賦值 231
18.3 緩沖區(qū)溢出的保護方法 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 數(shù)組溢出 242
18.6 多維數(shù)組 245
18.6.1 二維數(shù)組舉例 246
18.6.2 以一維數(shù)組的方式訪問
二維數(shù)組 247
18.6.3 三維數(shù)組 248
18.6.4 更多案例 251
18.7 二維字符串數(shù)組的封裝格式 251
18.7.1 32位ARM 253
18.7.2 ARM64 254
18.7.3 MIPS 254
18.7.4 總結(jié) 255
18.8 本章小結(jié) 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 設(shè)置/清除特定位 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上設(shè)置特定位 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 本章小結(jié) 295
19.6.1 檢測特定位(編譯階段) 295
19.6.2 檢測特定位(runtime階段) 295
19.6.3 設(shè)置特定位(編譯階段) 296
19.6.4 設(shè)置特定位(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章 線性同馀法與偽隨機函數(shù) 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章 結(jié) 構(gòu) 體 310
21.1 MSVC: systemtime 310
21.1.1 OllyDbg 311
21.1.2 以數(shù)組替代結(jié)構(gòu)體 312
21.2 用malloc()分配結(jié)構(gòu)體的空間 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 數(shù)組替代法 320
21.3.5 替換為32位words 322
21.3.6 替換為字節(jié)型數(shù)組 323
21.4 結(jié)構(gòu)體的字段封裝 325
21.4.1 x86 325
21.4.2 ARM 329
21.4.3 MIPS 330
21.4.4 其他 331
21.5 結(jié)構(gòu)體的嵌套 331
21.5.1 OllyDbg 332
21.6 結(jié)構(gòu)體中的位操作 333
21.6.1 CPUID 333
21.6.2 用結(jié)構(gòu)體構(gòu)建浮點數(shù) 337
21.7 練習題 339
21.7.1 題目1 339
21.7.2 題目2 340
第 22章 共用體(union)類型 345
22.1 偽隨機數(shù)生成程序 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 本章小結(jié) 351
第 二部分 硬件基礎(chǔ)
第 23章 函數(shù)指針 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位系統(tǒng)處理64位數(shù)據(jù) 362
24.1 64位返回值 362
24.1.1 x86 362
24.1.2 ARM 362
24.1.3 MIPS 362
24.2 參數(shù)傳遞及加減運算 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位數(shù)據(jù)轉(zhuǎn)換為64位數(shù)據(jù) 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 用于內(nèi)存復制 379
25.2 SIMD實現(xiàn)strlen() 383
第 26章 64位平臺 387
26.1 x86-64 387
26.2 ARM 394
26.3 浮點數(shù) 394
第 27章 SIMD與浮點數(shù)的并行運算 395
27.1 樣板程序 395
27.1.1 x64 395
27.1.2 x86 396
27.2 傳遞浮點型參數(shù) 399
27.3 浮點數(shù)之間的比較 400
27.3.1 x64 400
27.3.2 x86 401
27.4 計算機器精 確度 402
27.5 偽隨機數(shù)生成程序(續(xù)) 402
27.6 總結(jié) 403
第 28章 ARM指令詳解 404
28.1 立即數(shù)標識(#) 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章 有符號數(shù)的表示方法 413
第31章 字節(jié)序 414
31.1 大端字節(jié)序 414
31.2 小端字節(jié)序 414
31.3 舉例說明 414
31.4 雙模二元數(shù)據(jù)格式 415
31.5 轉(zhuǎn)換字節(jié)序 415
第32章 內(nèi)存布局 416
第33章 CPU 417
33.1 分支預測 417
33.2 數(shù)據(jù)相關(guān)性 417
第34章 哈希函數(shù) 418
34.1 單向函數(shù)與不可逆算法 418
第三部分 一些高 級的例子
第35章 溫度轉(zhuǎn)換 421
35.1 整數(shù)值 421
35.1.1 x86構(gòu)架下MSVC 2012
優(yōu)化 421
35.1.2 x64構(gòu)架下的MSVC 2012
優(yōu)化 423
35.2 浮點數(shù)運算 423
第36章 Fibonacci數(shù)列
(斐波拉契數(shù)列) 426
36.1 例子1 426
36.2 例子2 428
36.3 總結(jié) 431
第37章 CRC32計算的例子 432
第38章 網(wǎng)絡(luò)地址計算實例 435
38.1 計算網(wǎng)絡(luò)地址函數(shù)
calc_network_address() 436
38.2 函數(shù)form_IP() 437
38.3 函數(shù)print_as_IP() 438
38.4 form_netmask()函數(shù)和set_bit()
函數(shù) 440
38.5 總結(jié) 440
第39章 循環(huán):幾個迭代 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)優(yōu)化 450
41.2.2 Thumb-2模式下的Xcode 4.6.3
優(yōu)化(LLVM) 451
41.2.3 非優(yōu)化的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章 字符串轉(zhuǎn)換成數(shù)字,
函數(shù)atoi() 456
42.1 一個簡單的例子 456
42.1.1 64位下的MSVC 2013優(yōu)化 456
42.1.2 64位下的GCC 4.9.1優(yōu)化 457
42.1.3 ARM模式下Keil 6/2013優(yōu)化 457
42.1.4 Thumb模式下Keil 6/2013
優(yōu)化 458
42.1.5 ARM64下的GCC 4.9.1優(yōu)化 458
42.2 一個略微高 級的例子 459
42.2.1 64位下的GCC 4.9.1優(yōu)化 460
42.2.2 ARM模式下的Keil6/2013
優(yōu)化 461
42.3 練習 462
第43章 Inline函數(shù)(聯(lián)機函數(shù)) 463
43.1 字符串和內(nèi)存操作函數(shù) 464
43.1.1 字符串比較函數(shù)strcmp() 464
43.1.2 字符串長度函數(shù)strlen() 466
43.1.3 字符串復制函數(shù)strcpy() 466
43.1.4 內(nèi)存設(shè)置函數(shù)memset() 467
43.1.5 內(nèi)存復制函數(shù)memcpy() 468
43.1.6 內(nèi)存對比函數(shù) memcmp() 470
43.1.7 IDA腳本 471
第44章 C99限制 472
第45章 無分支函數(shù)abs() 475
45.1 x64下的GCC 4.9.1優(yōu)化 475
45.2 ARM64下的GCC 4.9優(yōu)化 475
第46章 參數(shù)個數(shù)可變函數(shù) 477
46.1 計算算術(shù)平均值 477
46.1.1 cdecl調(diào)用規(guī)范 477
46.1.2 基于寄存器的調(diào)用規(guī)范 478
46.2 vprintf()函數(shù)例子 480
第47章 字符串剪切 482
47.1 x64下的MSVC 2013優(yōu)化 483
47.2 x64下采用編輯器GCC 4.9.1進行
非優(yōu)化操作 484
47.3 x64下的GCC 4.9.1優(yōu)化 485
47.4 ARM64:非優(yōu)化的
GCC(Linaro)4.9 486
47.5 ARM64:優(yōu)化GCC(Linaro)4.9 487
47.6 ARM: Keil 6/2013優(yōu)化
(ARM模式) 488
47.7 ARM:Keil 6/2013
(Thumb模式)優(yōu)化 489
47.8 MIPS 489
第48章 toupper()函數(shù) 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 總結(jié) 494
第49章 不正確的反匯編代碼 495
49.1 x86環(huán)境下的,從一開始錯誤的
反匯編 495
49.2 一些隨機數(shù),怎么看起來像
反匯編指令? 496
第50章 混淆 501
50.1 字符串 501
50.2 可執(zhí)行代碼 501
50.2.1 插入垃圾代碼 501
50.2.2 用多個指令組合代替原來的
一個指令 502
50.2.3 始終執(zhí)行或者從來不會執(zhí)行的
代碼 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)標準
語言文件系統(tǒng) 522
51.4.1 std::string(字符串) 523
51.4.2 std::list函數(shù) 529
51.4.3 std::vector標準向量 539
51.4.4 std::map()和std::set() 547
第52章 數(shù)組的負數(shù)偏移 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 簡單的計算函數(shù) 579
54.4 JVM的內(nèi)存模型 582
54.5 簡單的函數(shù)調(diào)用 582
54.6 調(diào)用函數(shù)beep()(蜂鳴器) 584
54.7 線性同余隨機數(shù)產(chǎn)生器(PRNG) 584
54.8 條件跳轉(zhuǎn) 586
54.9 傳遞參數(shù) 588
54.10 位操作 589
54.11 循環(huán) 590
54.12 開關(guān)函數(shù)switch() 592
54.13 數(shù)組 593
54.13.1 簡單的例子 593
54.13.2 數(shù)組元素求和 594
54.13.3 單一變量的主函數(shù)main()依然
是一個數(shù)組 595
54.13.4 預設(shè)初始值的的數(shù)組 596
54.13.5 可變參數(shù)函數(shù) 597
54.13.6 二維數(shù)組 599
54.13.7 三維數(shù)組 600
54.13.8 小結(jié) 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 總結(jié) 612
第五部分 在代碼中發(fā)現(xiàn)重要而有趣的內(nèi)容
第55章 可執(zhí)行文件的識別 615
55.1 Microsoft Visual C 615
55.1.1 命名規(guī)則 615
55.2 GCC編譯器 615
55.2.1 命名規(guī)則 615
55.2.2 Cygwin 615
55.2.3 MinGW 615
55.3 Intel FORTRAN 615
55.4 Watcom以及OpenWatcom 616
55.4.1 命名規(guī)則 616
55.5 Borland編譯器 616
55.5.1 Dephi編程語言 616
55.6 其他的已知DLL文件 617
第56章 Win32環(huán)境下與外部通信 618
56.1 在Windows API中**經(jīng)常使用的函數(shù) 618
56.2 tracer:解析指定模塊的所有函數(shù) 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 錯誤/調(diào)試信息 623
57.3 可疑的魔數(shù)字符串 623
第58章 調(diào)用宏assert()
(中文稱為斷言) 624
第59章 常數(shù) 625
59.1 魔數(shù) 625
59.1.1 動態(tài)主機配置協(xié)議(Dynamic Host Configuration Protocol,
DHCP) 626
59.2 尋找常數(shù) 626
第60章 發(fā)現(xiàn)正確的指令 627
第61章 可疑的代碼模型 629
61.1 XOR異或指令 629
61.2 手寫匯編代碼 629
第62章 在跟蹤程序的過程中使用魔數(shù) 631
第63章 其他的事情 632
63.1 一般的觀點 632
63.2 C 632
63.3 一些二進制文件模型 632
63.4 內(nèi)存“快照”對比 633
63.4.1 Windows注冊表 633
63.4.2 瞬變比較器Blink-comparator 633
第六部分 操作系統(tǒng)相關(guān)
第64章 參數(shù)的傳遞方法(調(diào)用規(guī)范) 637
64.1 cdecl [C Declaration的縮寫] 637
64.2 stdcall [Standard Call的縮寫] 637
64.2.1 有可變參數(shù)個數(shù)的函數(shù) 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 浮點數(shù)float和雙精度數(shù)double兩種
類型的返回值 642
64.7 修改參數(shù) 643
64.8 將指針作為一個函數(shù)的參數(shù) 643
第65章 線程本地存儲TLS 646
65.1 重新審視線性同余發(fā)生器 646
65.1.1 Win32系統(tǒng) 646
65.1.2 Linux系統(tǒng) 650
第66章 系統(tǒng)調(diào)用(syscall-s) 652
66.1 Linux 652
66.2 Windows 653
第67章 Linux 654
67.1 與位置無關(guān)的代碼 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 術(shù)語 664
68.2.2 基地址 664
68.2.3 子系統(tǒng) 664
68.2.4 操作系統(tǒng)版本 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 關(guān)于SEH的更多信息 691
68.4 Windows NT:關(guān)鍵段 691
第七部分 常用工具
第69章 反匯編工具 697
69.1 IDA 697
第70章 調(diào)試工具 698
70.1 tracer 698
70.2 OllyDbg 698
70.3 GDB 698
第71章 系統(tǒng)調(diào)用的跟蹤工具 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”:魔方態(tài)加密模型 747
第80章 SAP 776
80.1 關(guān)閉客戶端的網(wǎng)絡(luò)數(shù)據(jù)包壓縮功能 776
80.2 SAP 6.0的密碼驗證函數(shù) 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字節(jié)程序 807
83.1.2 筆者對Trixter算法的改進:
27字節(jié) 808
83.1.3 從隨機地址讀取隨機數(shù) 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:單字節(jié)XOR
加密實例 821
84.1.1 信息熵 822
84.2 4字節(jié)XOR加密實例 822
84.2.1 練習題 824
第85章 Millenium游戲的存檔文件 825
第86章 Oracle的.SYM文件 829
第87章 Oracle的.MSDB文件 836
87.1 本章總結(jié) 839
第十部分 其他
第88章 npad 843
第89章 修改可執(zhí)行文件 845
89.1 文本字符串 845
89.2 x86指令 845
第90章 編譯器內(nèi)部函數(shù) 846
第91章 編譯器的智能短板 847
第92章 OpenMP 848
92.1 MSVC 850
92.2 GCC 852
第93章 安騰指令 854
第94章 8086的尋址方式 857
第95章 基本塊重排 858
95.1 PGO的優(yōu)化方式 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章 其他內(nèi)容 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 數(shù)據(jù)類型 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 狀態(tài)字寄存器(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調(diào)試寄存器 909
A.5.1 DR6規(guī)格 910
A.5.2 DR7規(guī)格 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 術(shù)語 925
B.2 版本差異 925
B.3 32位ARM(AArch32) 925
B.3.1 通用寄存器 925
B.3.2 程序狀態(tài)寄存器/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 轉(zhuǎn)移指令 929
附錄D 部分GCC庫函數(shù) 930
附錄E 部分MSVC庫函數(shù) 931
附錄E 部分MSVC庫函數(shù) 931
附錄G 練習題答案 935
G.1 各章練習 935
G.1.1 “?!薄?35
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 算術(shù)指令替代 936
G.1.9 FPU練習題 936
G.1.10 數(shù)組練習題 936
G.1.11 位操作練習題 937
G.1.12 結(jié)構(gòu)體練習題 939
G.1.13 混淆技術(shù)練習題 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
參考文獻 9472100433B
逆向工程 逆向工程,有的人也叫反求工程,英文是reverse engineering。 是指從實物上大量的三維坐標點,并由此建立該物體的幾何模型,進而開發(fā)出同類產(chǎn)品的先進技術(shù)。逆向工程與一般的設(shè)計制造...
《大設(shè)計》無所不在。在會議室和戰(zhàn)場上;在工廠車間中也在超市貨架上;在自家的汽車和廚房中;在廣告牌和食品包裝上;甚至還出現(xiàn)在電影道具和電腦圖標中。然而,設(shè)計卻并非只是我們?nèi)粘I瞽h(huán)境中的一種常見現(xiàn)象,它...
本書分為上篇“平面構(gòu)成”和下篇“色彩構(gòu)成”兩個部分,每一部分的最后章節(jié)選編了一些本校歷年來學生的優(yōu)秀作品作為參考,圖文并茂、深入淺出。此外,本書最后部分附有構(gòu)成運用范例及題型練習,可供自考學生參考。本...
格式:pdf
大?。?span id="rrcjuiu" class="single-tag-height">137KB
頁數(shù): 1頁
評分: 4.7
本書結(jié)合作者多年教學、科研經(jīng)驗及工程實踐,較系統(tǒng)地介紹了地下工程測量的基本理論和基本方法,從理論和實踐兩個角度幫助讀者提高分析和解決地下工程領(lǐng)域測繪的能力。本修訂版在傳統(tǒng)測量技術(shù)的基礎(chǔ)上,新增測繪新技術(shù)元素,操作適用性更強,新的地鐵工程測量一章更具有針對性。全書內(nèi)容豐富,具有一定的深度和廣度,充分反映了地下工程測量最新技術(shù)及其應用。
逆向工程(又名反向工程,Reverse Engineering-RE)是對產(chǎn)品設(shè)計過程的一種描述。在2007年初,我國相關(guān)的法律為逆向工程正名,承認了逆向技術(shù)用于學習研究的合法性。
在工程技術(shù)人員的一般概念中,產(chǎn)品設(shè)計過程是一個從設(shè)計到產(chǎn)品的過程,即設(shè)計人員首先在大腦中構(gòu)思產(chǎn)品的外形、性能和大致的技術(shù)參數(shù)等,然后在詳細設(shè)計階段完成各類數(shù)據(jù)模型,最終將這個模型轉(zhuǎn)入到研發(fā)流程中,完成產(chǎn)品的整個設(shè)計研發(fā)周期。這樣的產(chǎn)品設(shè)計過程我們稱為“正向設(shè)計”過程。逆向工程產(chǎn)品設(shè)計可以認為是一個從產(chǎn)品到設(shè)計的過程。簡單地說,逆向工程產(chǎn)品設(shè)計就是根據(jù)已經(jīng)存在的產(chǎn)品,反向推出產(chǎn)品設(shè)計數(shù)據(jù)(包括各類設(shè)計圖或數(shù)據(jù)模型)的過程。從這個意義上說,逆向工程在工業(yè)設(shè)計中的應用已經(jīng)很久了。比如早期的船舶工業(yè)中常用的船體放樣設(shè)計就是逆向工程的很好實例。
隨著計算機技術(shù)在各個領(lǐng)域的廣泛應用,特別是軟件開發(fā)技術(shù)的迅猛發(fā)展,基于某個軟件,以反匯編閱讀源碼的方式去推斷其數(shù)據(jù)結(jié)構(gòu)、體系結(jié)構(gòu)和程序設(shè)計信息成為軟件逆向工程技術(shù)關(guān)注的主要對象。軟件逆向技術(shù)的目的是用來研究和學習先進的技術(shù),特別是當手里沒有合適的文檔資料,而你又很需要實現(xiàn)某個軟件的功能的時候。也正因為這樣,很多軟件為了壟斷技術(shù),在軟件安裝之前,要求用戶同意不去逆向研究。
逆向工程的實施過程是多領(lǐng)域、多學科的協(xié)同過程。
逆向工程能在擁有現(xiàn)有物理部件之上,利用激光掃描儀、結(jié)構(gòu)光源轉(zhuǎn)換儀或X射線斷層成像之類3D掃描儀技術(shù)進行尺寸測量,再通過CAD、CAM、CAE或其他軟件構(gòu)筑3D虛擬模型的方法。逆向工程經(jīng)常被用于軍事上,在二戰(zhàn)和冷戰(zhàn)中經(jīng)常被用到。
對設(shè)計師而言,有一項到關(guān)重要的技能是學校里學不到的,那就是與人打交道。然而,無論在哪個項目中,同他人合作往往都成為困難的部分。隨著設(shè)計項目的日益復雜化,人們會越來越依賴遠程辦公,設(shè)計領(lǐng)域技術(shù)的進步越來越需要善于合作的專業(yè)人士。