軟件逆向分析技術及應用
魯宏偉 陳凱 鄧賢君 許雷永
相關主題
商品描述
本書根據本科生和研究生軟件逆向分析相關課程的教學需要,以實例為導引,面向攻防實踐,將逆向分析基礎和工具融入實例的剖析過程中,使學生能夠在解決實際問題的過程中掌握相關基礎和常用工具的使用方法。通過對軟件逆向基礎、常見文件格式解析、常用反匯編算法及缺陷分析、Android程序逆向基礎和相關工具的介紹,讀者能夠掌握基本的逆向分析方法。隨著逆向分析技術的不斷演進,一些新的理論和技術不斷涌現,本書圍繞代碼混淆和反混淆、漏洞挖掘及協議逆向分析技術的相關方法和研究進展做了詳細的介紹,以幫助從事相關研究的讀者瞭解這些內容。
本書既可作為高等院校相關課程的教材,也可以供從事逆向分析應用研究與開發的工程技術人員參考。
作者簡介
鲁宏伟,博士,华中科技大学网络空间安全学院教授,博士生导师。校工会第五届经费审查委员会委员,第五届提案工作委员会委员;担任网络空间安全学院教学指导委员会主任、学术委员会委员;网络空间安全学院工会主席。
2018年获得校工会华中科技大学“师德先进个人”称号,入选2019年华中科技大学“华中卓学学者”。
主要从事网络安全、网络应用与多媒体技术等领域的研究,在国内外学术刊物和会议上发表论文50余篇。曾三次赴美国硅谷公司进行多媒体应用软件合作开发;2005年起,主要从事互联网协议分析软件的开发,其中包括广东省公安厅金盾工程项目;2009年起,主要与南京某单位合作开展互联网协议分析软件的开发。
承担了物联网工程和信息安全相关专业的本科和研究生教学工作。近年来出版教材多部,包括“多媒体计算机技术”(电子工业出版社)、“物联网应用系统设计”(清华大学出版社)、“物联网系统安全与应用”(电子工业出版社),其中“多媒体计算机技术”为国家“十一五”规划教材。
陈凯,副教授,硕士生导师。担任华中科技大学网络空间安全学院副院长,担任湖北网络空间安全学会理事、本科教学工作组主任。
致力人才培养,独立承担多门门本科课程和硕士研究生课程教学,发表多篇有一定影响力的教改论文,出版教材一部,主持多项校级和省级教改项目。潜心做科研,从事计算机网络应用及安全、物联网安全、工业互联网安全研究,发表多篇高水平文章,主持和参与多项科研项目,申请专利和软著多项。
邓贤君,华中科技大学网络空间安全学院教授,博士生导师,华中科技大学网络空间安全学院院长助理,分管学院学术交流和国际化工作,IEEE TCSC“优秀青年科学家”、湖北省“百人计划”学者、武汉市“武汉英才”、湖南省芙蓉学者,担任IEEE 加拿大大西洋区通信学会副主席、湖北省网络空间安全学会学术委员会主任、“华中科技大学-湖北楚天智能交通股份有限公司人工智能与智能交通技术中心”技术中心执行主任、华中科技大学网络空间安全学院“人机物系统与安全”科研团队负责人,担任多个国际学术会议的程序委员会主席和指导委员会主席。主要从事物联网安全、物联网可靠性等方面的研究工作。
目錄大綱
目錄
第 1章 軟件逆向分析基礎 1
1.1 初識軟件逆向分析 2
1.2 軟件逆向分析的目的 7
1.2.1 與安全相關的應用 7
1.2.2 軟件開發中的逆向分析 9
1.3 軟件逆向分析的合法性 11
1.3.1 可以規避的例外 11
1.3.2 軟件逆向分析與版權之爭 12
1.3.3 漏洞利用 14
1.4 如何掌握軟件逆向分析方法 14
1.4.1 目標要明確 15
1.4.2 擁有積極的心態 15
1.4.3 感受逆向分析的樂趣 15
1.4.4 學會檢索 16
1.4.5 實踐 實踐 再實踐 16
1.4.6 保持平和的心態 17
1.5 軟件逆向分析過程 17
1.5.1 靜態分析 17
1.5.2 動態分析 32
思考題 37
第 2章 文件格式解析 38
2.1 PE文件 38
2.1.1 基本概念 38
2.1.2 頭部信息 40
2.1.3 區塊信息 45
2.1.4 導入表和導出表 48
2.2 ELF文件 51
2.2.1 ELF文件的基本格式 51
2.2.2 ELF文件頭部信息 52
2.2.3 ELF文件的節區 56
2.2.4 ELF文件的段 61
2.2.5 ELF文件的“.dynamic”節區 65
2.3 “.dex”文件 69
2.3.1 “.dex”文件簡介 70
2.3.2 “.dex”文件結構 71
2.4 “.odex”文件結構 81
思考題 83
第3章 理解程序邏輯和算術運算 84
3.1 數據的存儲和訪問 84
3.1.1 常量和變量 84
3.1.2 基本數據類型 88
3.1.3 指針、數組和字符串 94
3.1.4 結構體、聯合體 98
3.1.5 函數 100
3.2 基本程序邏輯 104
3.2.1 無條件分支指令 104
3.2.2 條件分支指令 106
3.2.3 循環指令 109
3.3 算術運算 112
3.3.1 算術標志位 112
3.3.2 整數運算 113
思考題 118
第4章 常用反匯編算法與分析 119
4.1 反匯編算法概述 119
4.2 線性掃描反匯編算法 121
4.3 遞歸下降反匯編算法 124
4.4 反匯編算法缺陷分析 128
4.4.1 線性掃描反匯編算法缺陷示例 129
4.4.2 遞歸下降反匯編算法缺陷示例 132
4.5 反匯編案例 137
思考題 138
第5章 反匯編算法優化 139
5.1 基於超集的反匯編算法——Multiverse 139
5.1.1 存在的挑戰 140
5.1.2 解決思路 144
5.1.3 映射 146
5.1.4 重寫 150
5.1.5 實現 151
5.2 基於概率提示的反匯編算法——PD 152
5.2.1 概述 153
5.2.2 X86指令的概率特徵 155
5.2.3 概率提示反匯編算法 158
5.2.4 算法實現 163
5.3 基於多路徑探索的動態反匯編算法 167
5.3.1 指令執行軌跡 168
5.3.2 多路徑探索 169
思考題 170
第6章 Android程序逆向分析基礎 171
6.1 Android程序的代碼結構 171
6.1.1 壓縮文件結構 173
6.1.2 反編譯文件 179
6.2 Android虛擬機:Dalvik和ART 181
6.2.1 Dalvik虛擬機 181
6.2.2 ART虛擬機 182
6.2.3 “.apk”程序的執行流程 183
6.3 smali語言和基本語法 183
6.3.1 smali代碼格式 185
6.3.2 smali語言的數據類型 187
6.3.3 寄存器 187
6.3.4 方法定義 189
6.3.5 常見Dalvik指令集 189
6.4 JNI 197
6.4.1 Java中調用Native函數 197
6.4.2 C/C++中調用Java函數 200
思考題 200
第7章 Android逆向分析工具及應用 201
7.1 反編譯工具 201
7.1.1 smali/baksmali 201
7.1.2 apktool 202
7.1.3 ShakaApktool 204
7.1.4 Android Killer 204
7.1.5 Jeb 208
7.1.6 Jadx 213
7.1.7 GDA 216
7.2 動態分析工具 217
7.2.1 Xposed框架 218
7.2.2 Frida 224
7.2.3 Objection 230
7.3 協議分析工具 230
7.3.1 Wireshark 230
7.3.2 Fiddler 231
7.3.3 Burp Suite 231
思考題 232
第8章 軟件保護與反保護的基本方法 233
8.1 軟件保護技術概述 233
8.1.1 軟件加密技術 234
8.1.2 防篡改技術 234
8.1.3 反調試技術 234
8.1.4 殼保護技術 235
8.2 移動終端軟件保護技術概述 235
8.2.1 靜態篡改防護技術 236
8.2.2 動態篡改防護技術 237
8.3 對ELF文件加殼 238
8.3.1 ELF文件的加載過程 238
8.3.2 常見ELF文件的加殼原理 239
8.3.3 包含式ELF文件加殼方法 241
8.4 Android應用加固 243
8.4.1 “.dex”文件加固方法概述 243
8.4.2 通用加殼技術 244
8.4.3 動態脫殼方法 247
8.5 Android應用脫殼分析實例 249
8.5.1 Android中“.so”文件的加載流程分析 249
8.5.2 Android動態調試過程 249
8.5.3 加固方式分析 251
8.5.4 “.so”文件分析 252
8.5.5 還原JNI_OnLoad 255
8.5.6 動態分析 260
思考題 270
第9章 代碼混淆與反混淆 271
9.1 代碼混淆技術基本概念 271
9.1.1 代碼混淆技術的定義 272
9.1.2 代碼混淆技術的分類 273
9.1.3 代碼混淆技術與逆向分析的關系 273
9.2 常見的基於源代碼的代碼混淆技術 274
9.2.1 符號混淆 274
9.2.2 結構混淆 276
9.2.3 控制流混淆 278
9.2.4 數據混淆 280
9.3 二進制代碼混淆技術 281
9.3.1 插入花指令 281
9.3.2 代碼亂序 283
9.3.3 常量展開 283
9.3.4 調用地址隱藏 284
9.3.5 指令移動 284
9.3.6 數據混淆 285
9.4 OLLVM原理 285
9.4.1 LLVM原理介紹 285
9.4.2 OLLVM簡介 286
9.5 反混淆技術 291
9.5.1 反混淆技術研究概況 291
9.5.2 常用的反混淆技術 295
9.5.3 基於IAT的反混淆技術 296
9.5.4 控制流平坦化反混淆技術 300
思考題 306
第 10章 基於二進制代碼的漏洞挖掘技術 307
10.1 漏洞概述 307
10.1.1 bug與漏洞 307
10.1.2 漏洞挖掘、漏洞分析、漏洞利用 307
10.2 漏洞挖掘技術概述 308
10.2.1 人工分析技術 309
10.2.2 Fuzzing 309
10.2.3 補丁比對技術 310
10.2.4 靜態分析技術 311
10.2.5 動態分析技術 313
10.2.6 基於機器學習方法 315
10.3 漏洞分析常用工具 316
10.3.1 靜態分析工具CodeSonar 316
10.3.2 用於滲透測試的幾種漏洞掃描工具 317
10.3.3 Fuzzing工具 318
10.4 可感知應用的進化模糊測試工具—— VUzzer 320
10.4.1 基礎知識 320
10.4.2 問題分析 321
10.4.3 方法分析 325
10.4.4 設計與實現 328
10.5 固件漏洞分析及實例 332
10.5.1 典型固件漏洞分析方法梳理 333
10.5.2 固件漏洞分析實例 336
思考題 342
第 11章 協議逆向分析技術 343
11.1 協議分析概述 343
11.1.1 網絡協議分析的發展歷程 343
11.1.2 協議分析技術的分類 344
11.2 協議逆向分析基礎 345
11.2.1 協議逆向分析模型 345
11.2.2 消息格式提取方法 348
11.2.3 狀態機推斷算法 354
11.3 網絡協議分析技術 356
11.3.1 基於網絡流量的協議逆向分析 356
11.3.2 基於程序分析的協議逆向分析 358
11.4 工業控制協議分析 359
11.4.1 工業控制協議安全現狀 359
11.4.2 工業控制協議安全分析 360
11.4.3 工業控制協議的特點 362
11.4.4 工業控制協議規範解析 363
11.4.5 動態污點分析技術在協議逆向分析中的應用 363
11.4.6 基本塊粒度工業控制協議字段邊界逆向分析算法 365
思考題 369
附錄A 一個簡單程序的逆向分析 370
A.1 觀察程序的行為 370
A.2 靜態分析 371
A.2.1 尋找main函數 372
A.2.2 main()函數分析 377
A.2.3 dword_5F3088分析 381
A.2.4 a1分析 383
A.2.5 獲取Flag 383
A.2.6 編寫腳本 384
A.2.7 解決反編譯失敗問題 385
A.3 動態分析 388
A.3.1 選擇調試器 389
A.3.2 跟蹤程序 389
A.4 後記 391
思考題 393
附錄B 惡意程序逆向分析示例 394
B.1 靜態分析 394
B.1.1 查殼 394
B.1.2 查看導入函數 395
B.1.3 查看關鍵字符串 395
B.1.4 查找程序入口 396
B.2 動態分析 396
B.2.1 觀察程序行為 396
B.2.2 分析程序行為 397
B.3 程序修復 405
思考題 408
附錄C Android程序逆向分析示例 409
C.1 靜態分析 409
C.1.1 定位程序入口 409
C.1.2 定位錯誤提示 410
C.1.3 函數securityCheck分析 411
C.2 動態分析 412
C.2.1 “.so”文件的加載過程 413
C.2.2 init_array分析 413
C.2.3 JNI_OnLoad分析 415
C.2.4 在JNI_OnLoad中設置斷點 418
C.2.5 在securityCheck中設置斷點 424
思考題 424