本页面介绍了 Ghidra 对 ARM 架构的支持,详细说明了 Ghidra 如何处理 ARM 指令集、处理器变体和特定于架构的功能。文档涵盖了 ARM 处理器模块的实现,包括 32 位 ARM 和 Thumb 指令集,以及 NEON SIMD 扩展和 VFP(向量浮点)支持等高级功能。
有关用于定义 ARM 指令语义的处理器规范语言的信息,请参阅 处理器规范语言。
Ghidra 为 ARM 架构系列提供了全面的支持,包括多种处理器变体和指令集扩展。
来源:Ghidra/Processors/ARM/data/languages/ARM.ldefs1-550 Ghidra/Processors/ARM/data/languages/ARM.sinc1-269
Ghidra 通过不同的语言模块支持多种 ARM 处理器变体。每个语言模块都专门针对特定的处理器版本和功能集。
| 架构 | 变体 | 字节序 | 大小 | 描述 |
|---|---|---|---|---|
| ARMv4/ARMv4T | 默认 | 小端/大端 | 32 位 | 带可选 Thumb 的 ARM |
| ARMv5/ARMv5T | 默认/T | 小端/大端 | 32 位 | 带 Thumb 和扩展 DSP 的 ARM |
| ARMv6 | 默认 | 小端/大端 | 32 位 | 增强型 ARM 架构 |
| ARMv7 | 默认 | 小端/大端 | 32 位 | 带 NEON/VFP 的高级架构 |
| ARMv8 | 默认/T | 小端/大端 | 32 位 | ARMv8 架构的 32 位模式 |
| Cortex | 默认 | 小端/大端 | 32 位 | Cortex-M/R 特定功能 |
| v8-m | 默认 | 小端/大端 | 32 位 | ARMv8-M 架构 (Cortex-M) |
“T”变体表示 Thumb 模式设置为默认指令集的配置。
来源:Ghidra/Processors/ARM/data/languages/ARM.ldefs4-240
ARM 处理器支持两种主要的指令集:
Ghidra 通过上下文跟踪来处理这些模式之间的切换,特别是使用 TMode 上下文变量。
来源:Ghidra/Processors/ARM/data/languages/ARM.sinc82-90 Ghidra/Processors/ARM/data/languages/ARM.sinc208-225
ARM 架构包含用于增强向量运算的高级 SIMD 指令,通常称为 NEON。Ghidra 通过 ARMneon.sinc 文件实现 NEON 支持,该文件定义了:
来源:Ghidra/Processors/ARM/data/languages/ARMneon.sinc1-780 Ghidra/Processors/ARM/data/languages/ARM.sinc34-74
Ghidra 对 ARM 寄存器集进行了建模,全面支持不同架构变体中的所有寄存器类型。
| 寄存器类型 | 寄存器 | 描述 |
|---|---|---|
| 通用寄存器 | r0-r15 | 标准 ARM 寄存器 (r13=sp, r14=lr, r15=pc) |
| 状态 | cpsr, spsr | 当前/已保存的程序状态寄存器 |
| VFP 单精度 | s0-s31 | 32 位浮点寄存器 |
| VFP 双精度 | d0-d31 | 64 位浮点寄存器 |
| NEON | q0-q15 | 128 位 SIMD 寄存器 |
| 特殊类型(Special) | fpscr | 浮点状态和控制寄存器 |
寄存器模型正确处理了寄存器的重叠关系,其中:
来源:Ghidra/Processors/ARM/data/languages/ARM.sinc10-76
ARM 支持的一个关键方面是上下文跟踪,它能够根据处理器状态进行正确的指令解码。关键的上下文变量包括:
TMode 上下文变量尤其重要,因为它决定了指令是作为 ARM 还是 Thumb 进行解码。ARM.sinc 中的 BXWritePC 宏通过修改此变量来管理 ARM 和 Thumb 模式之间的切换。
来源:Ghidra/Processors/ARM/data/languages/ARM.sinc82-118 Ghidra/Processors/ARM/data/languages/ARM.sinc208-225
Ghidra 使用 P-code 语言实现 ARM 指令语义。关键指令类别包括:
例如,带链接交换指令 (BLX) 的分支的实现展示了 Ghidra 如何处理模式切换行为。
macro BXWritePC(addr) {
SetThumbMode((addr & 0x1) != 0);
local tmp = addr & 0xfffffffe;
pc = tmp;
}
来源:Ghidra/Processors/ARM/data/languages/ARM.sinc208-225 Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc1-200 Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc1-200 Ghidra/Processors/ARM/data/languages/ARM.sinc246-268
Ghidra 通过编译器规范文件支持多种 ARM 调用约定,包括:
调用约定定义了:
来源:Ghidra/Processors/ARM/data/languages/ARM.cspec1-200 Ghidra/Processors/ARM/data/languages/ARM_win.cspec1-200
Ghidra 根据文件格式元数据识别 ARM 二进制文件。ARM.opinion 文件定义了这些识别模式:
| 加载器 | 主键 | 元数据 | 架构 |
|---|---|---|---|
| PE (Windows) | 448, 450, 452 | - | ARM LE 32 位 v8 |
| ELF | 40 | 各种标志模式 | ARM 变体 |
| Mach-O | 12, 13 | - | ARM 变体 |
这些定义允许 Ghidra 在加载 ARM 二进制文件时自动选择合适的处理器模块。
来源:Ghidra/Processors/ARM/data/languages/ARM.opinion1-100
Thumb 指令通过 ARMTHUMBinstructions.sinc 文件中的专用解析模式来支持,包括对以下内容的的:
来源:Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc1-732 Ghidra/Processors/ARM/data/languages/ARM.sinc246-268
Ghidra 的 ARM 支持包括对向量浮点 (VFP) 和高级 SIMD (NEON) 扩展的强大处理。
| 功能 | 描述 | 实现 |
|---|---|---|
| VFPv2 | 基础 VFP 支持 | 单精度和双精度运算 |
| VFPv3 | 扩展 VFP | 附加寄存器 (d16-d31) |
| SIMD | NEON 指令 | 向量运算、特殊寄存器 |
这些扩展根据处理器变体通过预处理器指令(如 @if defined(SIMD) 或 @if defined(VFPv3))有条件地编译到语言规范中。
来源:Ghidra/Processors/ARM/data/languages/ARMneon.sinc1-780 Ghidra/Processors/ARM/data/languages/ARM.sinc25-74
Ghidra 通过 ARMEmulateInstructionStateModifier 类为 ARM 处理器提供指令仿真支持。这允许:
此仿真能力对于高级分析功能至关重要,例如函数原型恢复和值传播。
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(2abfd4)