菜单

二进制格式支持

相关源文件

Ghidra 的二进制格式支持包括负责加载和分析可执行文件和对象文件格式的系统、类和过程。本页面详细介绍了 Ghidra 如何处理不同的二进制格式,包括 ELF、Mach-O 和 DYLD Cache 文件,并解释了支持逆向工程各种二进制文件的架构和组件。

有关加载这些二进制文件后分析代码的信息,请参阅反编译器系统。有关处理器架构建模的详细信息,请参阅处理器架构支持

二进制格式加载架构

Ghidra 的二进制格式支持遵循分层架构,将原始二进制文件转换为 Ghidra 的内部程序表示。

二进制格式加载管道

管道组件协同工作以

  1. 从文件中读取二进制数据
  2. 识别二进制格式类型
  3. 根据格式解析二进制结构
  4. 创建表示段/节的内存块
  5. 处理符号、重定位和其他元数据
  6. 构建完整的程序表示以供分析

来源

ELF格式支持

可执行和可链接格式(ELF)广泛用于 Linux、Unix 和类 Unix 系统。Ghidra 实现了对解析和分析 ELF 可执行文件、共享对象和对象文件的全面支持。

ELF 文件结构和加载

ELF 加载过程包括

  1. 头解析ElfHeader 类解析 ELF 头、程序头和节头。
  2. 内存映射ElfProgramBuilder 根据程序头(段)或节头创建内存块。
  3. 符号处理:符号表(.symtab.dynsym)被处理以创建程序符号。
  4. 重定位处理:重定位表(.rel.rela)被处理以修复地址引用。
  5. 动态链接:动态节(.dynamic)被处理以处理共享库依赖项。
  6. GOT/PLT 处理:全局偏移表和过程链接表结构被处理。

关键 ELF 支持类

目的
ElfHeader解析 ELF 头并提供对所有 ELF 结构的访问
ElfProgramBuilder从 ELF 文件创建 Ghidra 程序
ElfLoadAdapter提供特定于体系结构的加载适配
ElfRelocationTable处理重定位条目
ElfSectionHeader表示节头及其属性
ElfDefaultGotPltMarkup处理 GOT 和 PLT 结构

来源

Mach-O 格式支持

Mach-O(Mach Object)是 Apple 的 macOS 和 iOS 操作系统使用的可执行文件格式。Ghidra 为 Mach-O 可执行文件、动态库和其他 Mach-O 变体提供了广泛的支持。

Mach-O 文件结构和加载

Mach-O 加载过程包括

  1. 头解析MachHeader 类解析 Mach-O 头和加载命令。
  2. 加载命令处理:各种加载命令被处理以理解文件结构。
  3. 内存映射:根据段和节创建内存块。
  4. 符号处理:处理符号表和字符串表以创建程序符号。
  5. 动态链接:处理 Dyld 信息和绑定数据以进行动态链接。
  6. 修复处理:处理新版 Mach-O 文件中的链式指针修复。

预链接 Mach-O 支持

对于预链接内核(在 macOS/iOS 中使用),Ghidra 使用 MachoPrelinkProgramBuilder,它

  • 处理主内核 Mach-O 和嵌入的 Mach-O 文件(KEXT)
  • 创建一个包含所有模块的统一程序表示
  • 组织程序树以反映内核及其扩展

关键 Mach-O 支持类

目的
MachoProgramBuilder从 Mach-O 文件创建 Ghidra 程序
MachoPrelinkProgramBuilder预链接内核的专用构建器
LoadCommand所有 Mach-O 加载命令的基类
SymbolTableCommand处理符号表信息
DynamicSymbolTableCommand处理动态符号表信息
DyldChainedFixups处理链式指针修复
NList表示 Mach-O 文件中的符号条目

来源

DYLD 缓存支持

DYLD 缓存文件由 Apple 的动态链接器用于存储共享库的优化版本。这些缓存文件包含多个为更快加载而优化的 Mach-O 库。

DYLD 缓存结构和加载

DYLD 缓存加载过程包括

  1. 头解析DyldCacheHeader 类解析 DYLD 缓存头和相关结构。
  2. 内存映射:根据映射信息创建内存块。
  3. 滑块处理:处理滑块信息以修复需要滑动的指针。
  4. 嵌入的 Dylib 处理:识别和处理嵌入的 Mach-O 库。
  5. 符号处理:如果可用,则处理本地符号。
  6. 程序组织:组织程序树以反映 dylib 结构。

关键 DYLD 缓存支持类

目的
DyldCacheHeader解析并表示 DYLD 缓存头
DyldCacheProgramBuilder从 DYLD 缓存文件创建 Ghidra 程序
DyldCacheLocalSymbolsInfo处理 DYLD 缓存文件中的本地符号
SplitDyldCache处理拆分的 DYLD 缓存文件(跨越多个文件)
DyldCacheLoader识别和加载 DYLD 缓存文件的加载器
DyldCacheSlideInfoCommon处理用于指针修复的滑块信息

来源

扩展机制

Ghidra 提供了扩展二进制格式支持以支持特定体系结构和格式的机制。

特定于体系结构的扩展

ELF 扩展

ElfLoadAdapter 类可以扩展以提供特定于体系结构的处理

  • 添加自定义节类型、程序头类型和动态条目类型
  • 为 GOT/PLT 结构提供专门处理
  • 实现特定于体系结构的内存映射策略

重定位处理程序

特定于体系结构的重定位处理程序根据目标体系结构处理重定位

  • ElfRelocationHandler 是 ELF 重定位处理的基类
  • 特定于体系结构的实现处理专门的重定位类型
  • 重定位处理程序根据重定位规则修复内存引用

格式特定的选项

每个加载器都提供配置选项来控制加载过程

  • ElfLoaderOptionsFactory 提供 ELF 加载选项
  • DyldCacheOptions 控制 DYLD 缓存处理选项
  • 选项控制镜像基址设置、重定位处理和符号处理等方面

来源

与其他 Ghidra 系统的集成

二进制格式支持与其他几个 Ghidra 系统集成

  1. 处理器架构支持#3

    • 二进制格式指定目标体系结构
    • 特定于体系结构的扩展处理格式的特殊性
    • 处理器模块为加载的二进制文件提供指令解码
  2. 反编译器系统#2

    • 使用二进制加载器提供的符号和内存映射
    • 引用在二进制加载期间识别的函数
    • 依赖重定位信息进行正确的地址解析
  3. 数据类型系统

    • 二进制格式可能包含或引用类型信息
    • 类型信息被转换为 Ghidra 数据类型
    • 格式头和结构表示为数据类型

二进制格式支持系统构成了 Ghidra 分析能力的基础,它将原始二进制文件转换为结构化的程序,这些程序可以使用 Ghidra 强大的反编译和分析工具进行分析。