← 返回目录课程:《Cortex-M0/M3/M4/M7固件逆向工程系统教程》
03

03 ARM Thumb/Thumb-2指令集快速识别与反汇编基础

梳理Thumb指令编码规范,快速识别常见指令模式与函数边界
章节导航 难度:入门类型:概念框架
操作落点

把ARM Thumb落到关键对象的触发条件、可观察状态和复查材料上,先判断问题从哪里收窄。

术语边界
接口配置流程状态日志
完成标志
架构图代码片段排障表检查清单

Thumb/Thumb-2指令集:从二进制到函数边界的快速识别

检查路径ARM Thumb / Thumb-2指令集快速识别与反汇编基础
✓Thumb-2指令集快…定位
✓整理定位
✓自动化校验
✓复用复测
ARMThumb把知识点接成体系01Thumb/Thum明确检查要点02为什明确检查要点03对象配置与验证链路先定义适用边界04异常信号与处理边界先定义适用边界05对象边界先定义适用范围06触发条件确认起点与约束

在固件逆向工程中,面对处理平台系列(M0/M3/M4/M7)的二进制固件,最直接的挑战并非理解每条指令的语义,而是快速从字节流中定位指令边界、识别函数起始与结束,并区分16位Thumb指令与32位Thumb-2指令。本节的核心目标是建立一套可操作的“视觉模式”与判断逻辑,让你在看到一段Hex数据时,能迅速判断其指令类型、大致功能,并识别出函数调用的关键信号

关键判断

逆向处理平台固件的起点不是逐条反汇编,而是先通过指令编码的“位模式”快速分类。Thumb-2的引入使得指令长度不再固定,因此识别指令边界(Instruction Boundary)是反汇编正确性的第一道防线

ARM Thumb

异常线索复盘

触发ARM Thumb首次出现问题的条件

记录输入、环境、时序或操作动作,先保留现场证据。

信号Thumb-2指令集快速识别暴露出的状态变化

优先保留日志、返回码、状态位或波形片段。

定位示例片段

把命令、配置和日志放到同一时间窗口,再只调整一个会改变链路状态的条件。

复查状态记录记录

把返回码、计数器和吞吐变化分开留存,避免把一次偶然恢复当成结论。

概念块:ARM Thumb

ARM Thumb用Thumb-2指令集快速识别、反汇编基础、学习Thumb指令编码规范连接到Thumb-2指令集快速识别的调试、验证和交付动作。

  • Thumb-2指令集快速识别
  • 反汇编基础
  • 学习Thumb指令编码规范
  • 快速识别常见指令模式

在《处理平台0/M3/M4/M7固件逆向工程系统教程》中,我们面对的是经过编译、链接后的二进制固件。直接使用反汇编工具(如IDA Pro、Ghidra)虽然能自动完成大部分工作,但理解其背后的识别逻辑,对于手动修复、分析混淆代码或处理非标准固件至关重要。本节的核心目标是:掌握Thumb/Thumb-2指令集快速识别的核心模式,能够在不依赖自动化工具的情况下,手动定位函数边界与常见指令模式

常见的问题场景包括:

因此,本节将以“指令编码规范”与“函数边界信号”两个关键对象为主线,建立一套可复用的快速识别框架

对象配置与验证链路:Thumb

ARM Thumb落地前要同时核对Thumb-2指令集快速识别的反汇编基础、失败路径和学习Thumb指令编码规范。

ARM Thumb指令集(16位)与Thumb-2指令集(16/32位混合)的编码规范是快速识别的基石。处理平台0仅支持Thumb指令,而M3/M4/M7支持完整的Thumb-2指令集。理解两者的差异,是进行ARM快速识别常见指令模式的前提

指令长度识别:高位模式检查

判断一条指令是16位还是32位,关键在于检查其半字(适配层fword,即2字节)的高5位。Thumb-2规范定义了一个简单的规范:如果半字的高5位不是11101、11110或11111,则为16位Thumb指令;否则,需要结合下一个半字共同解码为32位Thumb-2指令

例如,十六进制序列 0xF000 0xF800:第一个半字 0xF000 的高5位是 11110,表明这是一个32位指令,需要与后续的 0xF800 合并解码为 BL 指令。而 0x4770 的高5位是 01000,直接解码为16位的 BX LR(函数返回指令)

实操步骤

在手动分析固件时,养成“先观察高5位,再决定读取2字节还是4字节”的习惯。这是避免反汇编错位的核心动作。对于处理平台0,所有指令均为16位,无需此判断

函数边界识别:序言与结语模式

函数边界是逆向工程中最重要的结构信息。在ARM 处理平台固件中,函数通常以特定的指令序列开始和结束:

识别这些模式,可以快速定位函数起始地址与结束地址,从而划分出清晰的函数边界

真实项目场景

在分析一个M7固件时,你发现一段代码以 0x4770(BX LR)结尾,但紧接着的地址并未对齐到函数起始。通过扫描前向地址,发现 0x08001234 处存在 0xB510(PUSH {r4, lr}),确认这是一个函数入口。这种“从结语反推序言”的方法,在处理中断向量表或跳转表时非常有效

验收判断

ARM Thumb是否合格,要看数据是否进入真实处理链路,以及可观察信号能不能说明结果不是偶然通过。如果Thumb/Thumb-2和指令集给出的信息互相矛盾,先暂停扩大范围,把Thumb-2指令集快速识别补成一份能复查的最小材料。继续推进前只保留一个判断重点:哪一项条件最先改变结论,再围绕从二进制到函数边界的快速识别决定补测、调参还是重新划定验收边界。保留一条最小证据线:ARM Thumb说明对象,命令核对说明约束,Thumb/Thumb-2说明状态,最后用Thumb-2指令集快速识别判断能否继续推进。第03节的复盘出口是Thumb-2指令集快速识别,它要能说明ARM Thumb、现场判断和配置验收之间哪一项先发生变化。