书籍详情
软件逆向分析技术及应用
作者:鲁宏伟 陈凯 邓贤君 许雷永
出版社:人民邮电出版社
出版时间:2024-01-01
ISBN:9787115622723
定价:¥149.80
购买这本书可以去
内容简介
本书根据本科生和研究生软件逆向分析相关课程的教学需要,以实例为导引,面向攻防实践,将逆向分析基础和工具融入实例的剖析过程中,使学生能够在解决实际问题的过程中掌握相关基础和常用工具的使用方法。通过对软件逆向基础、常见文件格式解析、常用反汇编算法及缺陷分析、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
第 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
猜您喜欢