IDA 的資料的很少, 而且深入的講解的更是少之又少.
這本書并不是IDA的用戶手冊, 但卻可以從中學(xué)習(xí)到很多IDA的應(yīng)用以及IDA的高級技術(shù). 本書一共分為六個(gè)部分,以反匯編與逆向工程的基本信息和IDA Pro 的背景知識開篇,為讀者奠定基礎(chǔ),緊接著循序漸進(jìn)地講解IDA Pro 的基本使用、高級使用、擴(kuò)展功能和它在安全領(lǐng)域的實(shí)際應(yīng)用,最后介紹IDA 調(diào)試器,黑客級暴力破解商業(yè)軟件的好工具:可以靜態(tài)、動(dòng)態(tài)分析程序,新的版本IDAPro 5.5甚至可以將可執(zhí)行代碼翻譯成標(biāo)準(zhǔn)C代碼,雖有些弱智,但已經(jīng)非常好用了;從2000年前就在用IDA,那是還是字符界面的;好東西----算法研究或程序外掛的好工具; 一方面讓用戶對IDA Pro 有全面深入的了解,另一方面讓讀者掌握IDA Pro 在現(xiàn)實(shí)中的應(yīng)用。
目錄
第一部分 IDA簡介
第1章 反匯編簡介 2
1.1 反匯編理論2
1.2 何為反匯編3
1.3 為何反匯編3
1.3.1 分析惡意軟件 4
1.3.2 漏洞分析4
1.3.3 軟件互操作性 4
1.3.4 編譯器驗(yàn)證 4
1.3.5 顯示調(diào)試信息 5
1.4 如何反匯編5
1.4.1 基本的反匯編算法5
1.4.2 線性掃描反匯編6
1.4.3 遞歸下降反匯編7
1.5 小結(jié) 10
第2章 逆向與反匯編工具 11
2.1 分類工具 11
2.1.1 file 11
2.1.2 PE Tools 13
2.1.3 PEiD 14
2.2 摘要工具 14
2.2.1 nm 15
2.2.2 ldd 16
2.2.3 objdump 17
2.2.4 otool 18
2.2.5 dumpbin 18
2.2.6 c++filt 19
2.3 深度檢測工具 20
2.3.1 strings 20
2.3.2 反匯編器 21
2.4 小結(jié) 22
第3章 IDA Pro背景知識 23
3.1 Hex-Rays公司的反盜版策略 23
3.2 獲取IDA Pro 24
3.2.1 IDA版本 24
3.2.2 IDA許可證 24
3.2.3 購買IDA 25
3.2.4 升級IDA 25
3.3 IDA支持資源 25
3.4 安裝IDA 26
3.4.1 Windows安裝 26
3.4.2 OS X和Linux安裝 27
3.4.3 IDA目錄的結(jié)構(gòu) 28
3.5 IDA用戶界面 29
3.6 小結(jié) 29
第二部分 IDA基本用法
第4章 IDA入門 32
4.1 啟動(dòng)IDA 32
4.1.1 IDA文件加載 34
4.1.2 使用二進(jìn)制文件加載器 35
4.2 IDA數(shù)據(jù)庫文件 37
4.2.1 創(chuàng)建IDA數(shù)據(jù)庫 38
4.2.2 關(guān)閉IDA數(shù)據(jù)庫 38
4.2.3 重新打開數(shù)據(jù)庫 39
4.3 IDA桌面簡介 40
4.4 初始分析時(shí)的桌面行為 42
4.5 IDA桌面提示和技巧 43
4.6 報(bào)告bug 44
4.7 小結(jié) 44
第5章 IDA數(shù)據(jù)顯示窗口 45
5.1 IDA主要的數(shù)據(jù)顯示窗口 45
5.1.1 反匯編窗口 45
5.1.2 Names窗口 50
5.1.3 消息窗口 51
5.1.4 Strings窗口 52
5.2 次要的IDA顯示窗口 53
5.2.1 十六進(jìn)制窗口 53
5.2.2 導(dǎo)出窗口 54
5.2.3 導(dǎo)入窗口 54
5.2.4 函數(shù)窗口 55
5.2.5 結(jié)構(gòu)體窗口 55
5.2.6 枚舉窗口 56
5.3 其他IDA顯示窗口 56
5.3.1 段窗口 56
5.3.2 簽名窗口 57
5.3.3 類型庫窗口 58
5.3.4 函數(shù)調(diào)用窗口 58
5.3.5 問題窗口 59
5.4 小結(jié) 59
第6章 反匯編導(dǎo)航 60
6.1 基本IDA導(dǎo)航 60
6.1.1 雙擊導(dǎo)航60
6.1.2 跳轉(zhuǎn)到地址 62
6.1.3 導(dǎo)航歷史記錄 62
6.2 棧幀 63
6.2.1 調(diào)用約定64
6.2.2 局部變量布局 67
6.2.3 棧幀示例67
6.2.4 IDA棧視圖 70
6.3 搜索數(shù)據(jù)庫74
6.3.1 文本搜索75
6.3.2 二進(jìn)制搜索 75
6.4 小結(jié) 76
第7章 反匯編操作 77
7.1 名稱與命名77
7.1.1 參數(shù)和局部變量 77
7.1.2 已命名的位置 79
7.1.3 寄存器名稱 80
7.2 IDA中的注釋 80
7.2.1 常規(guī)注釋82
7.2.2 可重復(fù)注釋 82
7.2.3 在前注釋和在后注釋 82
7.2.4 函數(shù)注釋82
7.3 基本代碼轉(zhuǎn)換 83
7.3.1 代碼顯示選項(xiàng) 83
7.3.2 格式化指令操作數(shù) 85
7.3.3 操縱函數(shù)86
7.3.4 數(shù)據(jù)與代碼互相轉(zhuǎn)換 91
7.4 基本數(shù)據(jù)轉(zhuǎn)換 91
7.4.1 指定數(shù)據(jù)大小 92
7.4.2 處理字符串 93
7.4.3 指定數(shù)組 94
7.5 小結(jié) 96
第8章 數(shù)據(jù)類型與數(shù)據(jù)結(jié)構(gòu) 97
8.1 識別數(shù)據(jù)結(jié)構(gòu)的使用 98
8.1.1 數(shù)組成員訪問 98
8.1.2 結(jié)構(gòu)體成員訪問 102
8.2 創(chuàng)建IDA結(jié)構(gòu)體 107
8.3 使用結(jié)構(gòu)體模板 111
8.4 導(dǎo)入新的結(jié)構(gòu)體 114
8.4.1 解析C結(jié)構(gòu)體聲明 114
8.4.2 解析C頭文件 115
8.5 使用標(biāo)準(zhǔn)結(jié)構(gòu)體 115
8.6 IDA TIL文件 118
8.6.1 加載新的TIL文件 118
8.6.2 共享TIL文件 118
8.7 C++逆向工程基礎(chǔ) 119
8.7.1 this指針 119
8.7.2 虛函數(shù)和虛表 120
8.7.3 對象生命周期 122
8.7.4 名稱改編 124
8.7.5 運(yùn)行時(shí)類型識別 125
8.7.6 繼承關(guān)系 126
8.7.7 C++逆向工程參考文獻(xiàn) 127
8.8 小結(jié) 127
第9章 交叉引用與繪圖功能 128
9.1 交叉引用 128
9.1.1 代碼交叉引用 129
9.1.2 數(shù)據(jù)交叉引用 131
9.1.3 交叉引用列表 133
9.1.4 函數(shù)調(diào)用 134
9.2 IDA繪圖 135
9.2.1 IDA的遺留繪圖功能 135
9.2.2 IDA的集成圖形視圖 141
9.3 小結(jié) 143
第10章 IDA的多種面孔 144
10.1 控制臺模式IDA 144
10.1.1 控制臺模式的共同特性 144
10.1.2 Windows控制臺 145
10.1.3 Linux控制臺 146
10.1.4 OS X控制臺 148
10.2 使用IDA的批量模式 150
10.3 非Windows平臺上的GUI IDA 151
10.4 小結(jié) 152
第三部分 IDA高級應(yīng)用
第11章 定制IDA 154
11.1 配置文件 154
11.1.1 主配置文件:ida.cfg 154
11.1.2 GUI配置文件:idagui.cfg 155
11.1.3 控制臺配置文件:idatui.cfg 157
11.2 其他IDA配置選項(xiàng) 158
11.2.1 IDA顏色 159
11.2.2 定制IDA工具欄 159
11.3 小結(jié) 161
第12章 使用FLIRT簽名來識別庫 162
12.1 快速庫識別和鑒定技術(shù) 162
12.2 應(yīng)用FLIRT簽名 163
12.3 創(chuàng)建FLIRT簽名文件 166
12.3.1 創(chuàng)建簽名概述 166
12.3.2 識別和獲取靜態(tài)庫 167
12.3.3 創(chuàng)建模式文件 168
12.3.4 創(chuàng)建簽名文件 169
12.3.5 啟動(dòng)簽名 171
12.4 小結(jié) 172
第13章 擴(kuò)展IDA的知識 173
13.1 擴(kuò)充函數(shù)信息 173
13.1.1 IDS文件 175
13.1.2 創(chuàng)建IDS文件 176
13.2 使用loadint擴(kuò)充預(yù)定義注釋 178
13.3 小結(jié) 179
第14章 修補(bǔ)二進(jìn)制文件及其他IDA
限制 180
14.1 隱藏的補(bǔ)丁程序菜單 180
14.1.1 更改數(shù)據(jù)庫字節(jié) 181
14.1.2 更改數(shù)據(jù)庫中的字 181
14.1.3 使用“匯編”對話框 182
14.2 IDA輸出文件與補(bǔ)丁生成 183
14.2.1 IDA生成的MAP文件 183
14.2.2 IDA生成的ASM文件 184
14.2.3 IDA生成的INC文件 184
14.2.4 IDA生成的LST文件 185
14.2.5 IDA生成的EXE文件 185
14.2.6 IDA生成的DIF文件 185
14.2.7 IDA生成的HTML文件 186
14.3 小結(jié) 186
第四部分 擴(kuò)展IDA的功能
第15章 編寫IDC腳本 188
15.1 執(zhí)行腳本的基礎(chǔ)知識 188
15.2 IDC語言 189
15.2.1 IDC變量 190
15.2.2 IDC表達(dá)式 190
15.2.3 IDC語句 190
15.2.4 IDC函數(shù) 191
15.2.5 IDC程序 192
15.2.6 IDC錯(cuò)誤處理 192
15.2.7 IDC永久數(shù)據(jù)存儲(chǔ) 193
15.3 關(guān)聯(lián)IDC腳本與熱鍵 194
15.4 有用的IDC函數(shù) 195
15.4.1 讀取和修改數(shù)據(jù)的函數(shù) 196
15.4.2 用戶交互函數(shù) 196
15.4.3 字符串操縱函數(shù) 197
15.4.4 文件輸入/輸出函數(shù) 197
15.4.5 操縱數(shù)據(jù)庫名稱 198
15.4.6 處理函數(shù)的函數(shù) 199
15.4.7 代碼交叉引用函數(shù) 199
15.4.8 數(shù)據(jù)交叉引用函數(shù) 200
15.4.9 數(shù)據(jù)庫操縱函數(shù) 200
15.4.10 數(shù)據(jù)庫搜索函數(shù) 201
15.4.11 反匯編行組件 201
15.5 IDC腳本示例 202
15.5.1 枚舉函數(shù) 202
15.5.2 枚舉指令 202
15.5.3 枚舉交叉引用 203
15.5.4 枚舉導(dǎo)出的函數(shù) 205
15.5.5 查找和標(biāo)記函數(shù)參數(shù) 206
15.5.6 模擬匯編語言行為 208
15.6 小結(jié) 209
第16章 IDA軟件開發(fā)工具包 211
16.1 SDK簡介 212
16.1.1 安裝SDK 212
16.1.2 SDK的布局 212
16.1.3 配置構(gòu)建環(huán)境 213
16.2 IDA應(yīng)用編程接口 214
16.2.1 頭文件概述 214
16.2.2 網(wǎng)絡(luò)節(jié)點(diǎn) 217
16.2.3 有用的SDK數(shù)據(jù)類型 223
16.2.4 常用的SDK函數(shù) 224
16.2.5 IDA API迭代技巧 229
16.3 小結(jié) 232
第17章 IDA插件體系結(jié)構(gòu) 233
17.1 編寫插件 233
17.1.1 插件生命周期 235
17.1.2 插件初始化 236
17.1.3 事件通知 237
17.1.4 插件執(zhí)行 238
17.2 構(gòu)建插件 239
17.3 插件安裝 243
17.4 插件配置 244
17.5 擴(kuò)展IDC 244
17.6 插件用戶界面選項(xiàng) 247
17.7 小結(jié) 254
第18章 二進(jìn)制文件與IDA加載器模塊 255
18.1 未知文件分析 256
18.2 手動(dòng)加載一個(gè)Windows PE文件 256
18.3 IDA加載器模塊 263
18.4 編寫IDA加載器 263
18.4.1 “傻瓜式”加載器 265
18.4.2 構(gòu)建IDA加載器模塊 269
18.4.3 IDA pcap加載器 269
18.5 其他加載器策略 274
18.6 小結(jié) 275
第19章 IDA處理器模塊 276
19.1 Python字節(jié)碼 277
19.2 Python解釋器 277
19.3 編寫處理器模塊 277
19.3.1 processor_t結(jié)構(gòu)體 278
19.3.2 LPH結(jié)構(gòu)體的基本初始化 278
19.3.3 分析器 282
19.3.4 模擬器 286
19.3.5 輸出器 288
19.3.6 處理器通知 293
19.3.7 其他processor_t成員 294
19.4 構(gòu)建處理器模塊 296
19.5 定制現(xiàn)有的處理器 299
19.6 處理器模塊體系結(jié)構(gòu) 301
19.7 小結(jié) 302
第五部分 實(shí)際應(yīng)用
第20章 編譯器變體 304
20.1 跳轉(zhuǎn)表與分支語句 304
20.2 RTTI實(shí)現(xiàn) 308
20.3 定位main函數(shù) 308
20.4 調(diào)試版與發(fā)行版二進(jìn)制文件 315
20.5 其他調(diào)用約定 317
20.6 小結(jié) 317
第21章 模糊代碼分析 319
21.1 反靜態(tài)分析技巧 319
21.1.1 反匯編去同步 319
21.1.2 動(dòng)態(tài)計(jì)算目標(biāo)地址 322
21.1.3 導(dǎo)入的函數(shù)模糊 327
21.1.4 有針對性地攻擊分析工具 331
21.2 反動(dòng)態(tài)分析技巧 331
21.2.1 檢測虛擬化 331
21.2.2 檢測“檢測工具” 333
21.2.3 檢測調(diào)試器 333
21.2.4 防止調(diào)試 334
21.3 使用IDA對二進(jìn)制文件進(jìn)行“靜態(tài)去模糊” 335
21.3.1 面向腳本的去模糊 335
21.3.2 面向模擬的去模糊 339
21.4 小結(jié) 349
第22章 漏洞分析 350
22.1 使用IDA發(fā)現(xiàn)新的漏洞 351
22.2 使用IDA在事后發(fā)現(xiàn)漏洞 356
22.3 IDA與破解程序開發(fā)過程 359
22.3.1 棧幀細(xì)目 360
22.3.2 定位指令序列 362
22.3.3 查找有用的虛擬地址 363
22.4 分析shellcode 364
22.5 小結(jié) 366
第23章 實(shí)用IDA插件 367
23.1 Hex-Rays 367
23.2 IDAPython 368
23.3 IDARub 371
23.4 IDA Sync 371
23.5 collabREate 374
23.6 ida-x86emu 377
23.7 mIDA 377
23.8 小結(jié) 379
第六部分 IDA調(diào)試器
第24章 IDA調(diào)試器 382
24.1 啟動(dòng)調(diào)試器 382
24.2 調(diào)試器的基本顯示 384
24.3 進(jìn)程控制 387
24.3.1 斷點(diǎn) 388
24.3.2 跟蹤 390
24.3.3 棧跟蹤 393
24.3.4 監(jiān)視 393
24.4 調(diào)試器任務(wù)自動(dòng)化 393
24.4.1 使用IDC為調(diào)試器操作編寫
腳本 394
24.4.2 使用IDA插件實(shí)現(xiàn)調(diào)試器操
作自動(dòng)化 398
24.5 小結(jié) 400
第25章 反匯編器/調(diào)試器集成 401
25.1 背景知識 401
25.2 IDA數(shù)據(jù)庫與IDA調(diào)試器 402
25.3 調(diào)試模糊代碼 404
25.3.1 簡單的解密和解壓循環(huán) 404
25.3.2 導(dǎo)入表重建 407
25.3.3 隱藏調(diào)試器 410
25.3.4 處理異常 414
25.4 小結(jié) 418
第26章 Linux、OS X平臺的IDA和
遠(yuǎn)程調(diào)試 419
26.1 控制臺模式的調(diào)試 419
26.2 使用IDA進(jìn)行遠(yuǎn)程調(diào)試 420
26.2.1 遠(yuǎn)程調(diào)試中的異常處理 422
26.2.2 在遠(yuǎn)程調(diào)試中使用腳本和
插件 423
26.3 小結(jié) 423
附錄A 使用IDA 4.9免費(fèi)版 424
附錄B IDC/SDK交叉引用 426
附錄C IDA 5.3的新功能 444