Ghidra extension for exporting relocatable object files
This repository is empty
Translated by AI, submit an issue feedback
Ghidra 的目标文件导出器扩展
此 Ghidra 扩展支持将程序的部分内容导出为目标文件。这些目标文件包含有效的元数据(符号、重定位表等),因此可直接被工具链复用,以进行后续处理。
使用场景包括:
- 高级二进制修补,通过利用链接器将原始部分和修改部分拼接在一起,而无需手动完成此项工作;
- 软件移植,通过从程序中分离出系统无关代码,并替换其余部分;
- 将程序或目标文件从一种文件格式转换为另一种;
- 创建库,通过提取程序的部分内容并在其他环境中复用它们;
- 反编译项目,通过将程序拆分为多个目标文件,并以“忒修斯之船”的方式重新实现这些文件;
- …
支持的指令集架构和目标文件矩阵:
| x86 | x86_64 | MIPS | |
|---|---|---|---|
| COFF | ✅ | ✅ | ❌ |
| ELF | ✅ | ✅ | ✅ |
| OMF | ✅ | ❌ | ❌ |
构建(命令行界面)
- 克隆此仓库;
- 定义
GHIDRA_INSTALL_DIR环境变量,使其指向您的 Ghidra 安装目录; - 运行
gradle buildExtension。
Ghidra 扩展归档文件将在 dist/ 目录内创建。
Note
GitHub Maven 仓库要求进行身份验证才能下载软件包,您必须执行以下任一操作:
- 创建一个具有
read:packages权限的 GitHub 经典令牌,然后将githubToken=ghp_xxx添加到${GRADLE_USER_HOME}/gradle.properties(通常默认为~/.gradle/gradle.properties)。 - 运行
gradle installStandaloneDeps以从子模块构建并安装供应商提供的依赖项。
安装
- 从 发布页面 下载扩展,或在本地构建;
- 通过 文件 > 安装扩展… 将扩展安装到您的 Ghidra 实例中;
- 在 CodeBrowser 窗口内,通过 文件 > 配置 > 实验性 启用 RelocationTableSynthesizedPlugin 插件。
使用方法
- 在列表视图中选择一组要提取的地址;
- 运行 重定位表合成器 分析器(支持一次性模式);
- 通过 文件 > 导出程序… 调用可重定位目标文件导出器。
可通过 窗口 > 重定位表(已合成) 查看重建的重定位信息。 在 分析 > 自动分析… 对话框中,为 重定位表合成器 分析器设置 评估报告策略 选项,即可启用详细的评估报告。
Tip
使用此扩展前,无需预先对整个程序进行逆向工程。 通常,成功的反链接主要取决于您要导出的子集(及其外部引用)中的以下元数据:
- 作为重定位位置的函数/指针;
- 作为重定位目标的符号特征;
- 两者之间的引用。
Warning
重定位表合成器分析器依赖于 Ghidra 数据库的准确性。信息不正确或缺失可能导致分析过程中出现错误的重定位或遗漏重定位。
Caution
目标文件导出器依赖于重定位表合成器分析器的结果。 如有疑问,请在导出目标文件之前运行此分析器,以确保重定位表内容是最新的。
工作原理
目标文件由三部分组成:
- 可重定位的节字节;
- 符号表;
- 重定位表。
当调用链接器从多个目标文件生成可执行文件时,它将:
- 在内存中布置它们的节;
- 计算符号在虚拟地址空间中的地址;
- 根据符号的最终地址,将重定位应用于节字节。
通常,此过程后重定位表会被丢弃,如果不保留调试符号,符号表也会被丢弃,只留下不可重定位的节字节。 然而,通过仔细分析可以重新创建这些数据,从而使我们能够有效地将程序“反链接”回目标文件。