为你推荐
内容简介
推荐序
译者序
前言
第一部分 简介
第1章 反汇编简介
1.1 反汇编理论
1.2 何为反汇编
1.3 为何反汇编
1.3.1 恶意软件分析
1.3.2 漏洞分析
1.3.3 软件互操作性
1.3.4 编译器验证
1.3.5 显示调试信息
1.4 如何反汇编
1.4.1 基础反汇编算法
1.4.2 线性扫描反汇编
1.4.3 递归下降反汇编
1.5 小结
第2章 逆向与反汇编工具
2.1 分类工具
2.1.1 file
2.1.2 PE Tools
2.1.3 PEiD
2.2 摘要工具
2.2.1 nm
2.2.2 ldd
2.2.3 objdump
2.2.4 otool
2.2.5 dumpbin
2.2.6 c++filt
2.3 深度检测工具
2.3.1 strings
2.3.2 反汇编器
2.4 小结
第3章 初识Ghidra
3.1 Ghidra许可证
3.2 Ghidra版本
3.3 Ghidra支持资源
3.4 下载Ghidra
3.5 安装Ghidra
3.5.1 Ghidra的目录结构
3.5.2 启动Ghidra
3.6 小结
第二部分 Ghidra的基本用法
第4章 开始使用Ghidra
4.1 启动Ghidra
4.2 创建新项目
4.2.1 Ghidra文件加载
4.2.2 使用原始二进制加载器
4.3 使用Ghidra分析文件
4.3.1 自动分析结果
4.4 初始分析期间的桌面行为
4.4.1 保存并退出
4.5 Ghidra桌面提示和技巧
4.6 小结
第5章 Ghidra数据显示
5.1 CodeBrowser
5.2 CodeBrowser窗口
5.2.1 清单窗口
5.2.2 创建额外的反汇编窗口
5.2.3 函数图形化视图
5.2.4 程序树窗口
5.2.5 符号树窗口
5.2.6 数据类型管理器窗口
5.2.7 控制台窗口
5.2.8 反编译器窗口
5.3 其他窗口
5.3.1 字节窗口
5.3.2 数据定义窗口
5.3.3 字符串定义窗口
5.3.4 符号表和符号引用窗口
5.3.5 内存映射窗口
5.3.6 函数调用图窗口
5.4 小结
第6章 理解Ghidra反汇编
6.1 反汇编导航
6.1.1 名称和标签
6.1.2 在Ghidra中导航
6.1.3 Go To对话框
6.1.4 导航历史
6.2 栈帧
6.2.1 函数调用机制
6.2.2 调用约定
6.2.3 栈帧的其他思考
6.2.4 局部变量布局
6.2.5 栈帧示例
6.3 Ghidra栈视图
6.3.1 Ghidra栈帧分析
6.3.2 清单视图中的栈帧
6.3.3 反编译辅助栈帧分析
6.3.4 局部变量作为操作数
6.3.5 Ghidra栈编辑器
6.4 搜索
6.4.1 搜索程序文本
6.4.2 搜索内存
6.5 小结
第7章 反汇编操作
7.1 操作名称和标签
7.1.1 重命名参数和局部变量
7.1.2 重命名标签
7.1.3 添加新标签
7.1.4 编辑标签
7.1.5 删除标签
7.1.6 导航标签
7.2 注释
7.2.1 行末注释
7.2.2 前注释与后注释
7.2.3 块注释
7.2.4 可重复注释
7.2.5 参数和局部变量注释
7.2.6 注解
7.3 基本的代码转换
7.3.1 更改代码显示选项
7.3.2 格式化指令操作数
7.3.3 操纵函数
7.3.4 数据与代码的转换
7.4 基本的数据转换
7.4.1 指定数据类型
7.4.2 处理字符串
7.4.3 定义数组
7.5 小结
第8章 数据类型和数据结构
8.1 理解数据
8.2 识别数据结构的使用
8.2.1 数组成员访问
8.2.2 结构体成员访问
8.3 用Ghidra创建结构体
8.3.1 创建结构体
8.3.2 编辑结构体成员
8.3.3 应用结构体布局
8.4 C++逆向入门
8.4.1 this指针
8.4.2 虚函数和虚表
8.4.3 对象生命周期
8.4.4 名称改编
8.4.5 运行时类型识别
8.4.6 继承关系
8.4.7 C++逆向参考资料
8.5 小结
第9章 交叉引用
9.1 引用基础
9.1.1 交叉引用(反向引用)
9.1.2 引用示例
9.2 引用管理窗口
9.2.1 XRefs窗口
9.2.2 References To窗口
9.2.3 符号引用窗口
9.2.4 高级引用操作
9.3 小结
第10章 图形
10.1 基本块
10.2 函数图
10.3 函数调用图
10.4 树
10.5 小结
第三部分 让Ghidra为您工作
第11章 协作逆向工程
11.1 团队协作
11.2 Ghidra Server设置
11.3 共享项目
11.3.1 创建共享项目
11.3.2 项目管理
11.4 项目窗口菜单
11.4.1 文件菜单
11.4.2 编辑菜单
11.4.3 项目菜单
11.5 项目仓库
11.5.1 版本控制
11.5.2 示例场景
11.6 小结
第12章 自定义Ghidra
12.1 CodeBrowser窗口
12.1.1 重新排列窗口
12.1.2 编辑工具选项
12.1.3 编辑工具
12.1.4 特殊工具编辑功能
12.1.5 保存CodeBrowser布局
12.2 Ghidra项目窗口
12.3 工具菜单
12.4 工作区
12.5 小结
第13章 Ghidra功能扩展
13.1 导入文件
13.2 分析器
13.3 词模型
13.4 数据类型
13.4.1 创建新的数据类型存档
13.5 Function ID分析器
13.6 Function ID插件
13.6.1 插件示例:UPX
13.6.2 插件示例:分析静态库
13.7 小结
第14章 Ghidra脚本开发
14.1 脚本管理器
14.1.1 脚本管理器窗口
14.1.2 脚本管理器工具栏
14.2 脚本开发
14.2.1 编写Java脚本
14.2.2 编辑脚本示例:正则搜索
14.2.3 编写Python脚本
14.2.4 支持其他语言
14.3 Ghidra API简介
14.3.1 地址接口
14.3.2 符号接口
14.3.3 引用接口
14.3.4 GhidraScript类
14.3.5 Program类
14.3.6 函数接口
14.3.7 指令接口
14.4 Ghidra脚本开发示例
14.4.1 示例1:枚举函数
14.4.2 示例2:枚举指令
14.4.3 示例3:枚举交叉引用
14.4.4 示例4:寻找函数调用
14.4.5 示例5:模拟汇编语言行为
14.5 小结
第15章 Eclipse和GhidraDev
15.1 Eclipse
15.1.1 Eclipse集成
15.1.2 启动Eclipse
15.1.3 使用Eclipse编辑脚本
15.2 GhidraDev菜单
15.2.1 GhidraDev→New
15.2.2 浏览包资源管理器
15.3 示例:Ghidra分析器模块项目
15.3.1 步骤1:定义问题
15.3.2 步骤2:创建Eclipse模块
15.3.3 步骤3:构建分析器
15.3.4 步骤4:使用Eclipse测试分析器
15.3.5 步骤5:添加分析器到Ghidra安装中
15.3.6 步骤6:使用Ghidra测试分析器
15.4 小结
第16章 Ghidra无头模式
16.1 入门
16.1.1 步骤1:启动Ghidra
16.1.2 步骤2和3:在指定位新建Ghidra项目
16.1.3 步骤4:将文件导入项目
16.1.4 步骤5和6:自动分析文件、保存并退出
16.1.5 选项和参数
16.2 编写脚本
16.2.1 HeadlessSimpleROP
16.2.2 自动创建FidDb
16.3 小结
第四部分 深入探索
第17章 Ghidra加载器
17.1 未知文件分析
17.2 手动加载 Windows PE 文件
17.3 示例一:简易Shellcode加载器
17.3.1 步骤0:准备工作
17.3.2 步骤1:定义问题
17.3.3 步骤2:创建Eclipse模块
17.3.4 步骤3:构建加载器
17.3.5 步骤4:添加加载器到Ghidra中
17.3.6 步骤5:在Ghidra中测试加载器
17.4 示例二:简易Shellcode源代码加载器
17.4.1 更新1:修改导入查询的响应
17.4.2 更新2:在源代码中定位Shellcode
17.4.3 更新3:将Shellcode转化为二进制数组
17.4.4 更新4:导入二进制数组
17.4.5 生成结果
17.5 示例三:简易ELF加载器
17.5.1 统一代码规范
17.5.2 ELF头部格式
17.5.3 明确支持的加载规格
17.5.4 将文件内容加载到Ghidra中
17.5.5 数据格式化与添加入口点
17.5.6 语言定义文件
17.5.7 选项文件
17.5.8 结果
17.6 小结
第18章 Ghidra处理器
18.1 理解Ghidra处理器模块
18.1.1 Eclipse处理器模块
18.1.2 SLEIGH
18.1.3 处理器手册
18.2 修改Ghidra处理器模块
18.2.1 问题陈述
18.2.2 示例1:在处理器模块中添加指令
18.2.3 示例2:修改处理器模块中的指令
18.2.4 示例3:在处理器模块中添加寄存器
18.3 小结
第19章 Ghidra反编译器
19.1 反编译器分析
19.1.1 分析选项
19.2 反编译器窗口
19.2.1 示例1:在反编译器窗口中编辑
19.2.2 示例2:无返回值函数
19.2.3 示例3:自动创建结构体
19.3 小结
第20章 编译器变体
20.1 高级结构
20.1.1 switch语句
20.1.2 示例:比较gcc与Microsoft C/C++编译器
20.2 编译器构建选项
20.2.1 示例1:模运算符
20.2.2 示例2:三元运算符
20.2.3 示例3:函数内联
20.3 编译器特定的C++实现
20.3.1 函数重载
20.3.2 RTTI实现
20.4 定位main函数
20.4.1 示例1:gcc Linux x86-64从_start到main
20.4.2 示例2:clang FreeBSD x86-64从_start到main
20.4.3 示例3:Microsoft C/C++从_start到main
20.5 小结
第五部分 实际应用
第21章 混淆代码分析
21.1 反逆向工程
21.1.1 混淆
21.1.2 反静态分析技术
21.1.3 导入函数混淆
21.1.4 反动态分析技术
21.2 使用Ghidra静态去混淆二进制文件
21.2.1 基于脚本的去混淆
21.2.2 基于模拟的去混淆
21.2.3 步骤1:定义问题
21.2.4 步骤2:创建Eclipse脚本项目
21.2.5 步骤3:构建模拟器
21.2.6 步骤4:添加脚本到Ghidra安装中
21.2.7 步骤5:使用Ghidra测试脚本
21.3 小结
第22章 修补二进制文件
22.1 规划你的补丁
22.2 寻找需要修改的东西
22.2.1 搜索内存
22.2.2 搜索直接引用
22.2.3 搜索指令模式
22.2.4 寻找特定行为
22.3 应用你的补丁
22.3.1 做基本的修改
22.3.2 做重要的修改
22.4 导出文件
22.4.1 Ghidra导出格式
22.4.2 二进制导出格式
22.4.3 脚本辅助的导出
22.5 示例:修补二进制文件
22.6 小结
第23章 二进制差分和版本跟踪
23.1 二进制差分
23.1.1 程序差分工具
23.1.2 示例:合并两个已分析的文件
23.2 比较函数
23.2.1 函数比较窗口
23.2.2 示例:比较加密例程
23.3 版本跟踪
23.3.1 版本跟踪概念
23.4 小结
附录A IDA用户的Ghidra使用指南
买过这本书的人还买过
读了这本书的人还在读
同类图书排行榜