Ghidra权威指南
第一部分 简介
第1章 反汇编简介 1
1.1 反汇编理论 1
1.2 何为反汇编 2
1.3 为何反汇编 2
1.3.1 恶意软件分析 3
1.3.2 漏洞分析 3
1.3.3 软件互操作性 3
1.3.4 编译器验证 3
1.3.5 显示调试信息 4
查看完整
第1章 反汇编简介 1
1.1 反汇编理论 1
1.2 何为反汇编 2
1.3 为何反汇编 2
1.3.1 恶意软件分析 3
1.3.2 漏洞分析 3
1.3.3 软件互操作性 3
1.3.4 编译器验证 3
1.3.5 显示调试信息 4
查看完整
Chris Eagle从事逆向工程工作已有40年。他是《IDA Pro权威指南》的作者,以及非常受欢迎的逆向工程培训专家。他开发了许多逆向工程工具,并在Blackhat、Defcon和Shmoocon等会议上发表演讲。Kara Nance是一名私人安全顾问。多年来一直是计算机科学教授。她曾在Honeynet Project董事会任职,并在世界各地的会议上发表过多次演讲。她喜欢构建Ghidra扩展并定期提供Ghidra培训。
杨超,毕业于西安电子科技大学,L-Team成员,CISP,CISSP,《CTF竞赛权威指南(Pwn篇)》作者。目前就职于某头部造车新势力,从事车联网安全研究和攻防测试工作,拥有多个CVE。活跃在开源社区,项目star数6000+,https://github.com/firmianay。
杨超,毕业于西安电子科技大学,L-Team成员,CISP,CISSP,《CTF竞赛权威指南(Pwn篇)》作者。目前就职于某头部造车新势力,从事车联网安全研究和攻防测试工作,拥有多个CVE。活跃在开源社区,项目star数6000+,https://github.com/firmianay。
Ghidra是美国国家安全局(NSA)开发的免费和开源的逆向工程工具,已于2019年的RSA正式发布,包含了一整套功能齐全的高级软件分析工具,可以帮助广大研究人员在Windows、macOS和Linux各大常见系统平台上进行源代码分析。目前已在技术安全社区掀起一股学习热潮。
第一部分 简介
第1章 反汇编简介 1
1.1 反汇编理论 1
1.2 何为反汇编 2
1.3 为何反汇编 2
1.3.1 恶意软件分析 3
1.3.2 漏洞分析 3
1.3.3 软件互操作性 3
1.3.4 编译器验证 3
1.3.5 显示调试信息 4
1.4 如何反汇编 4
1.4.1 基础反汇编算法 4
1.4.2 线性扫描反汇编 5
1.4.3 递归下降反汇编 6
1.5 小结 9
第2章 逆向与反汇编工具 10
2.1 分类工具 10
2.1.1 file 10
2.1.2 PE Tools 12
2.1.3 PEiD 13
2.2 摘要工具 14
2.2.1 nm 14
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 小结 23
第3章 初识Ghidra 24
3.1 Ghidra许可证 24
3.2 Ghidra版本 24
3.3 Ghidra支持资源 24
3.4 下载Ghidra 25
3.5 安装Ghidra 25
3.5.1 Ghidra的目录结构 26
3.5.2 启动Ghidra 27
3.6 小结 27
第二部分 Ghidra的基本用法
第4章 开始使用Ghidra 28
4.1 启动Ghidra 28
4.2 创建新项目 29
4.2.1 Ghidra文件加载 30
4.2.2 使用原始二进制加载器 32
4.3 使用Ghidra分析文件 33
4.4 初始分析期间的桌面行为 36
4.5 Ghidra桌面提示和技巧 37
4.6 小结 38
第5章 Ghidra数据显示 39
5.1 CodeBrowser 39
5.2 CodeBrowser窗口 41
5.2.1 清单窗口 42
5.2.2 创建额外的反汇编窗口 45
5.2.3 函数图形化视图 46
5.2.4 程序树窗口 49
5.2.5 符号树窗口 50
5.2.6 数据类型管理器窗口 53
5.2.7 控制台窗口 53
5.2.8 反编译器窗口 53
5.3 其他窗口 55
5.3.1 字节窗口 55
5.3.2 数据定义窗口 56
5.3.3 字符串定义窗口 58
5.3.4 符号表和符号引用窗口 58
5.3.5 内存映射窗口 60
5.3.6 函数调用图窗口 61
5.4 小结 62
第6章 理解Ghidra反汇编 63
6.1 反汇编导航 63
6.1.1 名称和标签 63
6.1.2 在Ghidra中导航 64
6.1.3 Go To对话框 65
6.1.4 导航历史 65
6.2 栈帧 66
6.2.1 函数调用机制 66
6.2.2 调用约定 68
6.2.3 栈帧的其他思考 71
6.2.4 局部变量布局 72
6.2.5 栈帧示例 72
6.3 Ghidra栈视图 75
6.3.1 Ghidra栈帧分析 75
6.3.2 清单视图中的栈帧 76
6.3.3 反编译辅助栈帧分析 78
6.3.4 局部变量作为操作数 79
6.3.5 Ghidra栈编辑器 80
6.4 搜索 82
6.4.1 搜索程序文本 82
6.4.2 搜索内存 83
6.5 小结 84
第7章 反汇编操作 85
7.1 操作名称和标签 85
7.1.1 重命名参数和局部变量 86
7.1.2 重命名标签 89
7.1.3 添加新标签 89
7.1.4 编辑标签 90
7.1.5 删除标签 91
7.1.6 导航标签 91
7.2 注释 91
7.2.1 行末注释 92
7.2.2 前注释与后注释 92
7.2.3 块注释 93
7.2.4 可重复注释 94
7.2.5 参数和局部变量注释 94
7.2.6 注解 95
7.3 基本的代码转换 95
7.3.1 更改代码显示选项 95
7.3.2 格式化指令操作数 96
7.3.3 操纵函数 98
7.3.4 数据与代码的转换 100
7.4 基本的数据转换 100
7.4.1 指定数据类型 101
7.4.2 处理字符串 102
7.4.3 定义数组 103
7.5 小结 104
第8章 数据类型和数据结构 105
8.1 理解数据 105
8.2 识别数据结构的使用 106
8.2.1 数组成员访问 107
8.2.2 结构体成员访问 114
8.3 用Ghidra创建结构体 120
8.3.1 创建结构体 120
8.3.2 编辑结构体成员 122
8.3.3 应用结构体布局 124
8.4 C++逆向入门 125
8.4.1 this指针 125
8.4.2 虚函数和虚表 126
8.4.3 对象生命周期 129
8.4.4 名称改编 130
8.4.5 运行时类型识别 131
8.4.6 继承关系 132
8.4.7 C++逆向参考资料 133
8.5 小结 133
第9章 交叉引用 134
9.1 引用基础 134
9.1.1 交叉引用(反向引用) 135
9.1.2 引用示例 137
9.2 引用管理窗口 141
9.2.1 XRefs窗口 142
9.2.2 References To窗口 142
9.2.3 符号引用窗口 143
9.2.4 高级引用操作 143
9.3 小结 144
第10章 图形 145
10.1 基本块 145
10.2 函数图 146
10.3 函数调用图 152
10.4 树 157
10.5 小结 157
第三部分 让Ghidra为您工作
第11章 协作逆向工程 158
11.1 团队协作 158
11.2 Ghidra Server设置 158
11.3 共享项目 161
11.3.1 创建共享项目 161
11.3.2 项目管理 162
11.4 项目窗口菜单 163
11.4.1 文件菜单 163
11.4.2 编辑菜单 165
11.4.3 项目菜单 166
11.5 项目仓库 169
11.5.1 版本控制 169
11.5.2 示例场景 171
11.6 小结 175
第12章 自定义Ghidra 176
12.1 CodeBrowser窗口 176
12.1.1 重新排列窗口 177
12.1.2 编辑工具选项 177
12.1.3 编辑工具 179
12.1.4 特殊工具编辑功能 180
12.1.5 保存CodeBrowser布局 181
12.2 Ghidra项目窗口 182
12.3 工具菜单 185
12.4 工作区 189
12.5 小结 189
第13章 Ghidra功能扩展 190
13.1 导入文件 190
13.2 分析器 192
13.3 词模型 193
13.4 数据类型 195
13.5 Function ID分析器 198
13.6 Function ID插件 199
13.6.1 插件示例:UPX 200
13.6.2 插件示例:分析静态库 204
13.7 小结 207
第14章 Ghidra脚本开发 208
14.1 脚本管理器 208
14.1.1 脚本管理器窗口 209
14.1.2 脚本管理器工具栏 210
14.2 脚本开发 210
14.2.1 编写Java脚本 210
14.2.2 编辑脚本示例:正则搜索 212
14.2.3 编写Python脚本 215
14.2.4 支持其他语言 217
14.3 Ghidra API简介 217
14.3.1 地址接口 218
14.3.2 符号接口 218
14.3.3 引用接口 218
14.3.4 GhidraScript类 218
14.3.5 Program类 224
14.3.6 函数接口 225
14.3.7 指令接口 225
14.4 Ghidra脚本开发示例 226
14.4.1 示例1:枚举函数 226
14.4.2 示例2:枚举指令 226
14.4.3 示例3:枚举交叉引用 227
14.4.4 示例4:寻找函数调用 228
14.4.5 示例5:模拟汇编语言行为 229
14.5 小结 231
第15章 Eclipse和GhidraDev 232
15.1 Eclipse 232
15.1.1 Eclipse集成 232
15.1.2 启动Eclipse 233
15.1.3 使用Eclipse编辑脚本 233
15.2 GhidraDev菜单 234
15.2.1 GhidraDev→New 234
15.2.2 浏览包资源管理器 238
15.3 示例:Ghidra分析器模块项目 243
15.3.1 步骤1:定义问题 243
15.3.2 步骤2:创建Eclipse模块 244
15.3.3 步骤3:构建分析器 244
15.3.4 步骤4:使用Eclipse测试
分析器 249
15.3.5 步骤5:添加分析器到Ghidra
安装中 250
15.3.6 步骤6:使用Ghidra测试
分析器 250
15.4 小结 252
第16章 Ghidra无头模式 253
16.1 入门 253
16.1.1 步骤1:启动Ghidra 254
16.1.2 步骤2和3:在指定位新建
Ghidra项目 254
16.1.3 步骤4:将文件导入项目 255
16.1.4 步骤5和6:自动分析文件、
保存并退出 255
16.1.5 选项和参数 257
16.2 编写脚本 263
16.2.1 HeadlessSimpleROP 263
16.2.2 自动创建FidDb 267
16.3 小结 268
第四部分 深入探索
第17章 Ghidra加载器 269
17.1 未知文件分析 270
17.2 手动加载 Windows PE 文件 271
17.3 示例一:简易Shellcode加载器 279
17.3.1 步骤0:准备工作 280
17.3.2 步骤1:定义问题 282
17.3.3 步骤2:创建Eclipse模块 282
17.3.4 步骤3:构建加载器 283
17.3.5 步骤4:添加加载器到
Ghidra中 287
17.3.6 步骤5:在Ghidra中测试
加载器 288
17.4 示例二:简易Shellcode源代码
加载器 289
17.4.1 更新1:修改导入查询的
响应 289
17.4.2 更新2:在源代码中定位
Shellcode 290
17.4.3 更新3:将Shellcode转化为
二进制数组 290
17.4.4 更新4:导入二进制数组 291
17.4.5 生成结果 291
17.5 示例三:简易ELF加载器 292
17.5.1 统一代码规范 293
17.5.2 ELF头部格式 293
17.5.3 明确支持的加载规格 294
17.5.4 将文件内容加载到Ghidra中 295
17.5.5 数据格式化与添加入口点 296
17.5.6 语言定义文件 297
17.5.7 选项文件 297
17.5.8 结果 298
17.6 小结 300
第18章 Ghidra处理器 301
18.1 理解Ghidra处理器模块 302
18.1.1 Eclipse处理器模块 302
18.1.2 SLEIGH 303
18.1.3 处理器手册 304
18.2 修改Ghidra处理器模块 305
18.2.1 问题陈述 306
18.2.2 示例1:在处理器模块中添加
指令 306
18.2.3 示例2:修改处理器模块中的
指令 312
18.2.4 示例3:在处理器模块中添加
寄存器 319
18.3 小结 321
第19章 Ghidra反编译器 322
19.1 反编译器分析 322
19.2 反编译器窗口 324
19.2.1 示例1:在反编译器窗口中
编辑 325
19.2.2 示例2:无返回值函数 329
19.2.3 示例3:自动创建结构体 331
19.3 小结 334
第20章 编译器变体 336
20.1 高级结构 336
20.1.1 switch语句 336
20.1.2 示例:比较gcc与Microsoft C/
C++编译器 341
20.2 编译器构建选项 342
20.2.1 示例1:模运算符 343
20.2.2 示例2:三元运算符 345
20.2.3 示例3:函数内联 347
20.3 编译器特定的C++实现 348
20.3.1 函数重载 348
20.3.2 RTTI实现 349
20.4 定位main函数 352
20.4.1 示例1:gcc Linux x86-64从
_start到main 352
20.4.2 示例2:clang FreeBSD x86-64
从_start到main 353
20.4.3 示例3:Microsoft C/C++从
_start到main 354
20.5 小结 354
第五部分 实际应用
第21章 混淆代码分析 356
21.1 反逆向工程 356
21.1.1 混淆 356
21.1.2 反静态分析技术 357
21.1.3 导入函数混淆 366
21.1.4 反动态分析技术 370
21.2 使用Ghidra静态去混淆二进制文件 372
21.2.1 基于脚本的去混淆 373
21.2.2 基于模拟的去混淆 377
21.2.3 步骤1:定义问题 379
21.2.4 步骤2:创建Eclipse脚本
项目 379
21.2.5 步骤3:构建模拟器 379
21.2.6 步骤4:添加脚本到Ghidra
安装中 382
21.2.7 步骤5:使用Ghidra测试
脚本 382
21.3 小结 383
第22章 修补二进制文件 384
22.1 规划你的补丁 384
22.2 寻找需要修改的东西 385
22.2.1 搜索内存 385
22.2.2 搜索直接引用 386
22.2.3 搜索指令模式 386
22.2.4 寻找特定行为 389
22.3 应用你的补丁 390
22.3.1 做基本的修改 390
22.3.2 做重要的修改 394
22.4 导出文件 397
22.4.1 Ghidra导出格式 398
22.4.2 二进制导出格式 398
22.4.3 脚本辅助的导出 398
22.5 示例:修补二进制文件 400
22.6 小结 403
第23章 二进制差分和版本跟踪 404
23.1 二进制差分 404
23.1.1 程序差分工具 406
23.1.2 示例:合并两个已分析的
文件 408
23.2 比较函数 411
23.2.1 函数比较窗口 412
23.2.2 示例:比较加密例程 413
23.3 版本跟踪 417
23.4 小结 419
附录A IDA用户的Ghidra使用指南 420
^ 收 起
第1章 反汇编简介 1
1.1 反汇编理论 1
1.2 何为反汇编 2
1.3 为何反汇编 2
1.3.1 恶意软件分析 3
1.3.2 漏洞分析 3
1.3.3 软件互操作性 3
1.3.4 编译器验证 3
1.3.5 显示调试信息 4
1.4 如何反汇编 4
1.4.1 基础反汇编算法 4
1.4.2 线性扫描反汇编 5
1.4.3 递归下降反汇编 6
1.5 小结 9
第2章 逆向与反汇编工具 10
2.1 分类工具 10
2.1.1 file 10
2.1.2 PE Tools 12
2.1.3 PEiD 13
2.2 摘要工具 14
2.2.1 nm 14
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 小结 23
第3章 初识Ghidra 24
3.1 Ghidra许可证 24
3.2 Ghidra版本 24
3.3 Ghidra支持资源 24
3.4 下载Ghidra 25
3.5 安装Ghidra 25
3.5.1 Ghidra的目录结构 26
3.5.2 启动Ghidra 27
3.6 小结 27
第二部分 Ghidra的基本用法
第4章 开始使用Ghidra 28
4.1 启动Ghidra 28
4.2 创建新项目 29
4.2.1 Ghidra文件加载 30
4.2.2 使用原始二进制加载器 32
4.3 使用Ghidra分析文件 33
4.4 初始分析期间的桌面行为 36
4.5 Ghidra桌面提示和技巧 37
4.6 小结 38
第5章 Ghidra数据显示 39
5.1 CodeBrowser 39
5.2 CodeBrowser窗口 41
5.2.1 清单窗口 42
5.2.2 创建额外的反汇编窗口 45
5.2.3 函数图形化视图 46
5.2.4 程序树窗口 49
5.2.5 符号树窗口 50
5.2.6 数据类型管理器窗口 53
5.2.7 控制台窗口 53
5.2.8 反编译器窗口 53
5.3 其他窗口 55
5.3.1 字节窗口 55
5.3.2 数据定义窗口 56
5.3.3 字符串定义窗口 58
5.3.4 符号表和符号引用窗口 58
5.3.5 内存映射窗口 60
5.3.6 函数调用图窗口 61
5.4 小结 62
第6章 理解Ghidra反汇编 63
6.1 反汇编导航 63
6.1.1 名称和标签 63
6.1.2 在Ghidra中导航 64
6.1.3 Go To对话框 65
6.1.4 导航历史 65
6.2 栈帧 66
6.2.1 函数调用机制 66
6.2.2 调用约定 68
6.2.3 栈帧的其他思考 71
6.2.4 局部变量布局 72
6.2.5 栈帧示例 72
6.3 Ghidra栈视图 75
6.3.1 Ghidra栈帧分析 75
6.3.2 清单视图中的栈帧 76
6.3.3 反编译辅助栈帧分析 78
6.3.4 局部变量作为操作数 79
6.3.5 Ghidra栈编辑器 80
6.4 搜索 82
6.4.1 搜索程序文本 82
6.4.2 搜索内存 83
6.5 小结 84
第7章 反汇编操作 85
7.1 操作名称和标签 85
7.1.1 重命名参数和局部变量 86
7.1.2 重命名标签 89
7.1.3 添加新标签 89
7.1.4 编辑标签 90
7.1.5 删除标签 91
7.1.6 导航标签 91
7.2 注释 91
7.2.1 行末注释 92
7.2.2 前注释与后注释 92
7.2.3 块注释 93
7.2.4 可重复注释 94
7.2.5 参数和局部变量注释 94
7.2.6 注解 95
7.3 基本的代码转换 95
7.3.1 更改代码显示选项 95
7.3.2 格式化指令操作数 96
7.3.3 操纵函数 98
7.3.4 数据与代码的转换 100
7.4 基本的数据转换 100
7.4.1 指定数据类型 101
7.4.2 处理字符串 102
7.4.3 定义数组 103
7.5 小结 104
第8章 数据类型和数据结构 105
8.1 理解数据 105
8.2 识别数据结构的使用 106
8.2.1 数组成员访问 107
8.2.2 结构体成员访问 114
8.3 用Ghidra创建结构体 120
8.3.1 创建结构体 120
8.3.2 编辑结构体成员 122
8.3.3 应用结构体布局 124
8.4 C++逆向入门 125
8.4.1 this指针 125
8.4.2 虚函数和虚表 126
8.4.3 对象生命周期 129
8.4.4 名称改编 130
8.4.5 运行时类型识别 131
8.4.6 继承关系 132
8.4.7 C++逆向参考资料 133
8.5 小结 133
第9章 交叉引用 134
9.1 引用基础 134
9.1.1 交叉引用(反向引用) 135
9.1.2 引用示例 137
9.2 引用管理窗口 141
9.2.1 XRefs窗口 142
9.2.2 References To窗口 142
9.2.3 符号引用窗口 143
9.2.4 高级引用操作 143
9.3 小结 144
第10章 图形 145
10.1 基本块 145
10.2 函数图 146
10.3 函数调用图 152
10.4 树 157
10.5 小结 157
第三部分 让Ghidra为您工作
第11章 协作逆向工程 158
11.1 团队协作 158
11.2 Ghidra Server设置 158
11.3 共享项目 161
11.3.1 创建共享项目 161
11.3.2 项目管理 162
11.4 项目窗口菜单 163
11.4.1 文件菜单 163
11.4.2 编辑菜单 165
11.4.3 项目菜单 166
11.5 项目仓库 169
11.5.1 版本控制 169
11.5.2 示例场景 171
11.6 小结 175
第12章 自定义Ghidra 176
12.1 CodeBrowser窗口 176
12.1.1 重新排列窗口 177
12.1.2 编辑工具选项 177
12.1.3 编辑工具 179
12.1.4 特殊工具编辑功能 180
12.1.5 保存CodeBrowser布局 181
12.2 Ghidra项目窗口 182
12.3 工具菜单 185
12.4 工作区 189
12.5 小结 189
第13章 Ghidra功能扩展 190
13.1 导入文件 190
13.2 分析器 192
13.3 词模型 193
13.4 数据类型 195
13.5 Function ID分析器 198
13.6 Function ID插件 199
13.6.1 插件示例:UPX 200
13.6.2 插件示例:分析静态库 204
13.7 小结 207
第14章 Ghidra脚本开发 208
14.1 脚本管理器 208
14.1.1 脚本管理器窗口 209
14.1.2 脚本管理器工具栏 210
14.2 脚本开发 210
14.2.1 编写Java脚本 210
14.2.2 编辑脚本示例:正则搜索 212
14.2.3 编写Python脚本 215
14.2.4 支持其他语言 217
14.3 Ghidra API简介 217
14.3.1 地址接口 218
14.3.2 符号接口 218
14.3.3 引用接口 218
14.3.4 GhidraScript类 218
14.3.5 Program类 224
14.3.6 函数接口 225
14.3.7 指令接口 225
14.4 Ghidra脚本开发示例 226
14.4.1 示例1:枚举函数 226
14.4.2 示例2:枚举指令 226
14.4.3 示例3:枚举交叉引用 227
14.4.4 示例4:寻找函数调用 228
14.4.5 示例5:模拟汇编语言行为 229
14.5 小结 231
第15章 Eclipse和GhidraDev 232
15.1 Eclipse 232
15.1.1 Eclipse集成 232
15.1.2 启动Eclipse 233
15.1.3 使用Eclipse编辑脚本 233
15.2 GhidraDev菜单 234
15.2.1 GhidraDev→New 234
15.2.2 浏览包资源管理器 238
15.3 示例:Ghidra分析器模块项目 243
15.3.1 步骤1:定义问题 243
15.3.2 步骤2:创建Eclipse模块 244
15.3.3 步骤3:构建分析器 244
15.3.4 步骤4:使用Eclipse测试
分析器 249
15.3.5 步骤5:添加分析器到Ghidra
安装中 250
15.3.6 步骤6:使用Ghidra测试
分析器 250
15.4 小结 252
第16章 Ghidra无头模式 253
16.1 入门 253
16.1.1 步骤1:启动Ghidra 254
16.1.2 步骤2和3:在指定位新建
Ghidra项目 254
16.1.3 步骤4:将文件导入项目 255
16.1.4 步骤5和6:自动分析文件、
保存并退出 255
16.1.5 选项和参数 257
16.2 编写脚本 263
16.2.1 HeadlessSimpleROP 263
16.2.2 自动创建FidDb 267
16.3 小结 268
第四部分 深入探索
第17章 Ghidra加载器 269
17.1 未知文件分析 270
17.2 手动加载 Windows PE 文件 271
17.3 示例一:简易Shellcode加载器 279
17.3.1 步骤0:准备工作 280
17.3.2 步骤1:定义问题 282
17.3.3 步骤2:创建Eclipse模块 282
17.3.4 步骤3:构建加载器 283
17.3.5 步骤4:添加加载器到
Ghidra中 287
17.3.6 步骤5:在Ghidra中测试
加载器 288
17.4 示例二:简易Shellcode源代码
加载器 289
17.4.1 更新1:修改导入查询的
响应 289
17.4.2 更新2:在源代码中定位
Shellcode 290
17.4.3 更新3:将Shellcode转化为
二进制数组 290
17.4.4 更新4:导入二进制数组 291
17.4.5 生成结果 291
17.5 示例三:简易ELF加载器 292
17.5.1 统一代码规范 293
17.5.2 ELF头部格式 293
17.5.3 明确支持的加载规格 294
17.5.4 将文件内容加载到Ghidra中 295
17.5.5 数据格式化与添加入口点 296
17.5.6 语言定义文件 297
17.5.7 选项文件 297
17.5.8 结果 298
17.6 小结 300
第18章 Ghidra处理器 301
18.1 理解Ghidra处理器模块 302
18.1.1 Eclipse处理器模块 302
18.1.2 SLEIGH 303
18.1.3 处理器手册 304
18.2 修改Ghidra处理器模块 305
18.2.1 问题陈述 306
18.2.2 示例1:在处理器模块中添加
指令 306
18.2.3 示例2:修改处理器模块中的
指令 312
18.2.4 示例3:在处理器模块中添加
寄存器 319
18.3 小结 321
第19章 Ghidra反编译器 322
19.1 反编译器分析 322
19.2 反编译器窗口 324
19.2.1 示例1:在反编译器窗口中
编辑 325
19.2.2 示例2:无返回值函数 329
19.2.3 示例3:自动创建结构体 331
19.3 小结 334
第20章 编译器变体 336
20.1 高级结构 336
20.1.1 switch语句 336
20.1.2 示例:比较gcc与Microsoft C/
C++编译器 341
20.2 编译器构建选项 342
20.2.1 示例1:模运算符 343
20.2.2 示例2:三元运算符 345
20.2.3 示例3:函数内联 347
20.3 编译器特定的C++实现 348
20.3.1 函数重载 348
20.3.2 RTTI实现 349
20.4 定位main函数 352
20.4.1 示例1:gcc Linux x86-64从
_start到main 352
20.4.2 示例2:clang FreeBSD x86-64
从_start到main 353
20.4.3 示例3:Microsoft C/C++从
_start到main 354
20.5 小结 354
第五部分 实际应用
第21章 混淆代码分析 356
21.1 反逆向工程 356
21.1.1 混淆 356
21.1.2 反静态分析技术 357
21.1.3 导入函数混淆 366
21.1.4 反动态分析技术 370
21.2 使用Ghidra静态去混淆二进制文件 372
21.2.1 基于脚本的去混淆 373
21.2.2 基于模拟的去混淆 377
21.2.3 步骤1:定义问题 379
21.2.4 步骤2:创建Eclipse脚本
项目 379
21.2.5 步骤3:构建模拟器 379
21.2.6 步骤4:添加脚本到Ghidra
安装中 382
21.2.7 步骤5:使用Ghidra测试
脚本 382
21.3 小结 383
第22章 修补二进制文件 384
22.1 规划你的补丁 384
22.2 寻找需要修改的东西 385
22.2.1 搜索内存 385
22.2.2 搜索直接引用 386
22.2.3 搜索指令模式 386
22.2.4 寻找特定行为 389
22.3 应用你的补丁 390
22.3.1 做基本的修改 390
22.3.2 做重要的修改 394
22.4 导出文件 397
22.4.1 Ghidra导出格式 398
22.4.2 二进制导出格式 398
22.4.3 脚本辅助的导出 398
22.5 示例:修补二进制文件 400
22.6 小结 403
第23章 二进制差分和版本跟踪 404
23.1 二进制差分 404
23.1.1 程序差分工具 406
23.1.2 示例:合并两个已分析的
文件 408
23.2 比较函数 411
23.2.1 函数比较窗口 412
23.2.2 示例:比较加密例程 413
23.3 版本跟踪 417
23.4 小结 419
附录A IDA用户的Ghidra使用指南 420
^ 收 起
Chris Eagle从事逆向工程工作已有40年。他是《IDA Pro权威指南》的作者,以及非常受欢迎的逆向工程培训专家。他开发了许多逆向工程工具,并在Blackhat、Defcon和Shmoocon等会议上发表演讲。Kara Nance是一名私人安全顾问。多年来一直是计算机科学教授。她曾在Honeynet Project董事会任职,并在世界各地的会议上发表过多次演讲。她喜欢构建Ghidra扩展并定期提供Ghidra培训。
杨超,毕业于西安电子科技大学,L-Team成员,CISP,CISSP,《CTF竞赛权威指南(Pwn篇)》作者。目前就职于某头部造车新势力,从事车联网安全研究和攻防测试工作,拥有多个CVE。活跃在开源社区,项目star数6000+,https://github.com/firmianay。
杨超,毕业于西安电子科技大学,L-Team成员,CISP,CISSP,《CTF竞赛权威指南(Pwn篇)》作者。目前就职于某头部造车新势力,从事车联网安全研究和攻防测试工作,拥有多个CVE。活跃在开源社区,项目star数6000+,https://github.com/firmianay。
Ghidra是美国国家安全局(NSA)开发的免费和开源的逆向工程工具,已于2019年的RSA正式发布,包含了一整套功能齐全的高级软件分析工具,可以帮助广大研究人员在Windows、macOS和Linux各大常见系统平台上进行源代码分析。目前已在技术安全社区掀起一股学习热潮。
比价列表