全書共14章,第1章簡要介紹了本書所基于的環(huán)境與工具;第2~6章針對編譯的不同階段,展開實踐方面的相關闡述,并結合GCC和LLVM這兩款具體的編譯器進行論述;第7章介紹了多樣化編譯方面的實踐;第8~13章從反編譯的不同階段介紹與反編譯相關的可執(zhí)行程序格式、程序解碼和反匯編、中間表示生成、數據類型和控制流的恢復、過程定義恢復等內容;第14章簡要介紹了反編譯在信息安全方面的應用。
“編譯技術”是從事軟件開發(fā)和信息安全相關工作的技術人員必須掌握的基礎性技術,也是高等院校計算機科學與技術和軟件專業(yè)的一門必修專業(yè)課,這是理論與實踐結合非常強的領域,對提升開發(fā)人員的技術水平和大學生科學思維的養(yǎng)成、解決實際問題能力具有重要作用!胺淳幾g技術”則是近幾年發(fā)展起來的新興技術,許多計算機軟件或信息安全從業(yè)者非常關心該技術的發(fā)展,但目前這方面的書籍較少,與“編譯技術”結合起來講解的書也很少,從實踐角度來剖析的更是少見。本書就是在這種需求以及作者在這兩方面的科研實踐的驅動下誕生的,目的是為計算機軟件和信息安全從業(yè)者提供編譯與反編譯技術方面的知識和實戰(zhàn)技巧。
本書的編寫得到了解放軍信息工程大學和機械工業(yè)出版社的大力支持,在此表示誠摯的謝意。本書中的一些材料來自本書主編主持的國家自然科學基金(項目編號:61472447)、國家“863”(項目編號:2006AA01Z408)、國家重大專項某子課題等項目的研究成果,在此對這些課題的支持表示衷心的感謝!
本書是機械工業(yè)出版社2016年4月出版的《編譯與反編譯技術》(ISBN978-7-111-53412-9)一書的姊妹篇,配合學習和使用效果更佳。在本書中,作者著力闡述編譯與反編譯技術及實戰(zhàn)方面的相關知識和實戰(zhàn)技巧,力圖使用通用的語言講述抽象的原理、技術和實戰(zhàn)技能,但限于作者水平,書中難免有錯誤與欠妥之處,懇請讀者批評指正。
作者2017年3月
目 錄?Contents
前言
第1章 實踐的環(huán)境與工具 1
1.1 實踐環(huán)境概述 1
1.2 詞法分析生成器LEX 1
1.3 語法分析生成器YACC 3
1.4 編譯器GCC 4
1.5 編譯器LLVM 5
1.6 反匯編工具IDA 6
1.7 反匯編工具OllyICE 6
1.8 仿真與分析工具QEMU 6
1.9 動態(tài)分析工具TEMU 7
1.10 本章小結 8
第2章 編譯器實踐概述 9
2.1 編譯器、解釋器及其工作方式 9
2.2 編譯器的結構 10
2.3 編譯器的設計與實現概述 12
2.3.1 利用Flex和Bison實現詞法和語法分析 12
2.3.2 利用LLVM實現代碼優(yōu)化和代碼生成 12
2.4 本章小結 13
第3章 詞法分析器的設計與實現 14
3.1 詞法分析器的設計 14
3.1.1 詞法分析器的功能 14
3.1.2 輸入及其處理 15
3.2 詞法分析器的手工實現 16
3.3 詞法分析器的LEX實現 31
3.3.1 LEX源文件結構 32
3.3.2 LEX系統(tǒng)中的正規(guī)式 34
3.3.3 LEX 的使用方式 36
3.3.4 LEX 源文件示例——C語言詞法分析器 37
3.4 本章小結 41
第4章 語法分析器的設計與實現 42
4.1 自上而下的語法分析器的設計與實現 42
4.2 自下而上的語法分析器的設計與實現 61
4.3 語法分析器的生成器 72
4.3.1 YACC的源文件結構 72
4.3.2 YACC和LEX的接口 76
4.3.3 YACC源程序示例——簡單的臺式計算器 77
4.4 本章小結 78
第5章 GCC編譯器分析與實踐 79
5.1 GCC編譯器概述 79
5.2 GCC編譯器的系統(tǒng)結構 80
5.3 GCC編譯器的分析程序 81
5.4 GCC編譯器的中間語言及其生成 82
5.5 GCC編譯器的優(yōu)化 82
5.6 GCC編譯器的目標代碼生成 87
5.7 本章小結 88
第6章 LLVM編譯器分析與實踐 89
6.1 LLVM編譯器概述 89
6.1.1 起源 89
6.1.2 相關項目 90
6.2 經典編譯器概述 91
6.2.1 經典編譯器設計的啟示 91
6.2.2 現有編譯器的實現 92
6.3 LLVM的設計 93
6.3.1 LLVM中間表示 94
6.3.2 LLVM庫文件 95
6.4 LLVM前端 96
6.4.1 前端庫文件 97
6.4.2 詞法分析 97
6.4.3 語法分析 99
6.4.4 語義分析 100
6.4.5 LLVM IR代碼生成 100
6.5 LLVM的中間表示 100
6.5.1 LLVM IR語法 102
6.5.2 LLVM IR優(yōu)化實例 104
6.6 LLVM后端 106
6.6.1 后端庫文件 107
6.6.2 LLVM目標架構描述文件 108
6.7 應用實例 109
6.7.1 代碼插樁 110
6.7.2 代碼保護 110
6.8 本章小結 111
第7章 多樣化編譯實踐 112
7.1 軟件多樣化的機會 112
7.1.1 應用層的多樣化機會 112
7.1.2 Web服務層的多樣化機會 113
7.1.3 操作系統(tǒng)層的多樣化機會 115
7.1.4 組合后的多樣化機會 116
7.1.5 虛擬層的多樣化機會 116
7.2 多樣化帶來的管理復雜性 117
7.3 多樣化編譯技術 118
7.3.1 隨機化技術 118
7.3.2 代碼混淆技術 120
7.3.3 與堆棧相關的多樣化技術 123
7.4 多樣化編譯的應用 125
7.4.1 多樣化編譯在安全防御方面的應用 126
7.4.2 多樣化編譯工具的結構組成及原理 127
7.5 本章小結 128
第8章 反編譯的對象——可執(zhí)行文件格式分析 129
8.1 可執(zhí)行文件格式 129
8.1.1 PE可執(zhí)行文件格式 129
8.1.2 ELF可執(zhí)行文件格式 130
8.2 main函數的識別 133
8.2.1 程序啟動過程分析 136
8.2.2 startup函數解析 137
8.2.3 main()函數定位 140
8.3 本章小結 142
第9章 反編譯的基礎——指令系統(tǒng)和反匯編 143
9.1 指令系統(tǒng)概述 143
9.1.1 機器指令及格式 145
9.1.2 匯編指令及描述 147
9.2 指令解碼 149
9.2.1 SLED通用編解碼語言 149
9.2.2 x64的SLED描述 154
9.2.3 IA64的SLED描述 159
9.3 反匯編過程 161
9.3.1 線性掃描反匯編 161
9.3.2 行進遞歸反匯編 162
9.4 反匯編工具IDA與OllyICE實踐 163
9.4.1 IDA實踐 163
9.4.2 OllyICE實踐 166
9.5 本章小結 169
第10章 反編譯的中點——從匯編指令到中間表示 170
10.1 中間代碼生成在經典反編譯器中的實際應用 170
10.1.1 低級中間代碼 171
10.1.2 高級中間代碼 172
10.2 中間表示從設計到應用的具體實例 175
10.2.1 指令基本組件描述 176
10.2.2 用UMSDL描述指令語義 179
10.3 本章小結 184
第11章 反編譯的推進1——數據類型恢復 185
11.1 基本數據類型的分析和恢復 185
11.1.1 數據類型分析的相關概念 186
11.1.2 基于指令語義的基本數據類型分析 188
11.1.3 基于過程的數據類型分析技術 190
11.2 函數類型恢復 197
11.2.1 問題引入 198
11.2.2 函數類型的恢復 198
11.3 本章小結 203
第12章 反編譯的推進2——控制流恢復實例 205
12.1 基于關鍵語義子樹的間接跳轉目標解析 205
12.1.1 問題的提出 206
12.1.2 相關工作 207
12.1.3 跳轉表的語義特征 208
12.1.4 基于關鍵語義子樹的間接跳轉目標解析及翻譯 210
12.2 功能塊概念的引入 222
12.2.1 分析單位 222
12.2.2 基于基本塊的分析 223
12.2.3 功能塊 228
12.2.4