如何利用IDA Pro逆向分析ARM 二进制映像

💡 原文中文,约4800字,阅读约需12分钟。
📝

内容提要

本文介绍了使用ANYTONE 878UVII对讲机固件进行ARM固件映像逆向分析的步骤,包括使用IDA Pro和固件映像进行分析、设置处理器选项和重新定位固件映像。还介绍了使用脚本创建代码和字符串的方法,以及识别操作系统函数和处理I/O和外围设备。

🔎

延伸解读

固件分析前的硬件信息获取

文章指出,ANYTONE 878系列对讲机使用GigaDevice GD32 ARM Cortex-M4微控制器。除了拆机查看芯片型号,还可以通过FCC查询设备信息,找到内部照片,从而避免拆机。此外,下载CPU数据表至关重要,因为后续设置处理器选项、内存偏移量和长度等参数都需要从数据表中获取。这为逆向分析提供了准确的硬件背景。

IDA Pro加载固件时的关键设置

加载CDD固件映像时,需将处理器类型设为ARM little-endian,并修改处理器选项以适应ARMv7E-M架构。建议勾选“No automatic ARM THUMB switching”,因为项目与Thumb指令集高度相关。此外,必须将映像重新定位到0x8004000偏移量,并创建RAM分区(起始0x20000000,长度0x17FFF),否则交叉引用会被破坏,反汇编无法正常工作。这些设置是后续分析的基础。

手动与脚本辅助的代码分析

IDA不会自动分析固件映像,需要手动创建代码。从向量表开始,复位处理程序的地址最低有效位为1表示Thumb模式,需将入口点改为Thumb(CODE16)。手动创建所有代码较繁琐,可借助脚本(如define_code_functions.py和make_strings.py)自动创建代码和字符串。注意,由于多语言引用表的存在,部分字符串引用可能无法通过静态分析解决,但引导过程中的直接嵌入字符串可作为分析起点。

识别OS函数与外围设备访问

通过字符串可识别设备使用的RTOS是μC/OS-II。识别基本OS函数(如print_string、memcpy)有助于理解固件行为。基于ARM的CPU使用特殊内存区域处理I/O和外围设备,需在IDA中添加这些内存区域(可参考提供的IDC脚本),然后重新运行自动分析以创建交叉引用。这样可以通过查看对特定内存区域的引用来定位使用UART、GPIO等外设的函数,尤其在字符串引用较少时特别有用。

❓

Q&A

如何确定ANYTONE 878UVII对讲机使用的微控制器型号?

可以通过查询FCC获取设备内部照片,照片中会显示芯片型号;也可以拆开对讲机直接查看芯片。ANYTONE 878系列使用的是GigaDevice GD32 ARM Cortex-M4微控制器。

在IDA Pro中加载CDD固件映像时,处理器类型和架构选项应该如何设置?

将Processor type指定为“ARM little-endian”。由于设备使用ARMv7E-M架构,需在Processor options中编辑ARM architecture选项进行相应修改,并建议勾选“No automatic ARM THUMB switching”,因为项目与Thumb指令集高度相关。

为什么需要将固件映像重新定位到0x8004000?如何确定这个偏移量?

因为ARM CPU要求映像从物理ROM映射地址0x8004000开始加载,不重新定位会破坏交叉引用和反汇编。该偏移量可从CPU数据手册的内存映射部分找到:主闪存加载地址在数据手册第17页,第一个0x4000由引导程序占用,所以二进制文件必须位于0x8004000。

在IDA Pro中如何创建RAM分区?起始地址和长度是多少?

在加载文件时勾选“Create RAM section”,设置RAM起始地址为0x20000000,长度为0x17FFF。这些值可以从CPU数据手册第16页的SRAM偏移量和长度信息中获得。

如何判断复位处理程序是Thumb还是ARM模式?在IDA中如何正确设置?

检查复位处理程序地址的最低有效位:如果为1则为Thumb模式。例如地址最后一个字节为0xF9(二进制11111001),最低位为1,表示Thumb。在IDA中跳转到该地址减1字节处,按Alt+G将当前偏移量定义为Thumb(CODE16),然后按C创建代码。

有哪些脚本可以辅助IDA Pro分析ARM固件映像?如何使用?

可以使用Maddie Stone的IDAPythonEmbeddedToolkit脚本(已适配IDA 7.x,可从GitHub下载)。首先运行define_code_functions.py在0x08004000到0x080963DC范围内创建代码(询问是否撤销现有代码时选No),然后运行make_strings.py在ROM其余部分创建字符串。

如何识别固件中使用的实时操作系统(RTOS)?

通过分析固件映像中的字符串,可以识别出设备使用的RTOS是μC/OS-II,这是一个用ANSI C编写的免费实时操作系统。

在IDA Pro中如何添加特殊内存区域以分析I/O和外围设备?

打开IDA的内存区域视图(segments view),根据数据手册第14页的内存映射添加特殊内存区域(如UART、GPIO等),然后重新运行自动分析(Options -> General -> Reanalyse program)以创建交叉引用。之后可以查看这些区域的交叉引用来定位操作外设的函数。

🏷️

标签

➡️

继续阅读