菜单

ARM架构支持

相关源文件

目的与范围

本页面介绍了 Ghidra 对 ARM 架构的支持,详细说明了 Ghidra 如何处理 ARM 指令集、处理器变体和特定于架构的功能。文档涵盖了 ARM 处理器模块的实现,包括 32 位 ARM 和 Thumb 指令集,以及 NEON SIMD 扩展和 VFP(向量浮点)支持等高级功能。

有关用于定义 ARM 指令语义的处理器规范语言的信息,请参阅 处理器规范语言

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 和 Thumb 模式

ARM 处理器支持两种主要的指令集:

  1. ARM 模式:32 位定长指令
  2. Thumb 模式:16 位(在 Thumb-2 中为 32 位)压缩指令

Ghidra 通过上下文跟踪来处理这些模式之间的切换,特别是使用 TMode 上下文变量。

来源:Ghidra/Processors/ARM/data/languages/ARM.sinc82-90 Ghidra/Processors/ARM/data/languages/ARM.sinc208-225

高级 SIMD (NEON) 支持

ARM 架构包含用于增强向量运算的高级 SIMD 指令,通常称为 NEON。Ghidra 通过 ARMneon.sinc 文件实现 NEON 支持,该文件定义了:

  • NEON 向量寄存器 (Q0-Q15, D0-D31)
  • SIMD 指令和它们的语义
  • 向量操作

来源: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-s3132 位浮点寄存器
VFP 双精度d0-d3164 位浮点寄存器
NEONq0-q15128 位 SIMD 寄存器
特殊类型(Special)fpscr浮点状态和控制寄存器

寄存器模型正确处理了寄存器的重叠关系,其中:

  • Q 寄存器与 D 寄存器配对重叠
  • D 寄存器与 S 寄存器配对重叠

来源: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 指令语义。关键指令类别包括:

  1. 数据处理指令:算术、逻辑和移位操作
  2. 内存访问指令:带各种寻址模式的加载/存储
  3. 分支指令:不同类型的分支和调用
  4. SIMD 指令:NEON 的向量操作
  5. VFP 指令:浮点操作
  6. 系统指令:控制和协处理器操作

例如,带链接交换指令 (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 调用约定,包括:

  1. 默认 (AAPCS):ARM 过程调用标准
  2. Windows:Microsoft 特定的 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
ELF40各种标志模式ARM 变体
Mach-O12, 13-ARM 变体

这些定义允许 Ghidra 在加载 ARM 二进制文件时自动选择合适的处理器模块。

来源:Ghidra/Processors/ARM/data/languages/ARM.opinion1-100

Thumb 指令支持

Thumb 指令通过 ARMTHUMBinstructions.sinc 文件中的专用解析模式来支持,包括对以下内容的的:

  1. 16 位 Thumb 指令:原始紧凑指令集
  2. 32 位 Thumb-2 指令:具有 32 位编码的扩展指令集
  3. IT 块:Thumb 模式下的条件执行
  4. ThumbEE:Thumb-2 的执行环境变体

来源:Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc1-732 Ghidra/Processors/ARM/data/languages/ARM.sinc246-268

VFP 和高级 SIMD 扩展

Ghidra 的 ARM 支持包括对向量浮点 (VFP) 和高级 SIMD (NEON) 扩展的强大处理。

功能描述实现
VFPv2基础 VFP 支持单精度和双精度运算
VFPv3扩展 VFP附加寄存器 (d16-d31)
SIMDNEON 指令向量运算、特殊寄存器

这些扩展根据处理器变体通过预处理器指令(如 @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 处理器提供指令仿真支持。这允许:

  1. ARM 代码的动态分析
  2. 寄存器状态变化的跟踪
  3. 内存操作的模拟
  4. ARM 特定操作的特殊处理

此仿真能力对于高级分析功能至关重要,例如函数原型恢复和值传播。

来源:Ghidra/Processors/ARM/src/main/java/ghidra/program/emulation/ARMEmulateInstructionStateModifier.java1-28