第三章 逆向分析环境搭建:Ghidra、IDA Pro、Binary Ninja 的 ARM64 支持配置

工欲善其事,必先利其器。做 ARM64 逆向,选对工具、配好环境,能省下一大半的力气。

市面上主流的反编译工具有三款:Ghidra、IDA Pro、Binary Ninja。它们对 ARM64 的支持程度、配置方式、上手难度都不一样。我这些年三款工具换着用,各有各的偏好场景。今天就把它们的 ARM64 配置要点掰开揉碎了讲清楚。

3.1 Ghidra:开源巨兽的 ARM64 配置

Ghidra 是 NSA 开源的逆向框架,免费、功能强、社区活跃。它对 ARM64 的支持相当完善,但第一次用的人容易在几个地方卡住。

3.1.1 安装与基础配置

  • JDK 版本:Ghidra 11.x 需要 JDK 17 以上。我遇到过有人用 JDK 11 跑新版本,启动直接报错。
  • 解压即用:下载后解压,运行 ghidraRun.bat(Windows)或 ghidraRun.sh(Linux/macOS)。
  • 内存调大:默认 2GB 堆内存,分析大固件时不够。修改 support/launch.properties 里的 GHIDRA_MAXMEMORY=4G 或更高。
注意:Ghidra 的路径不要包含中文或空格。我吃过这个亏,项目路径带中文,导致脚本解析失败,折腾了半天才发现。

3.1.2 ARM64 处理器模块加载

导入 ARM64 二进制文件时,Ghidra 会自动识别架构。但有时会识别错,需要手动指定:

  1. 导入文件时,在 Language 下拉框选择 AARCH64:LE:64:default(小端序)或 AARCH64:BE:64:default(大端序)。
  2. 如果遇到 Thumb 模式混编(比如 iOS 越狱插件),需要勾选 ARM:LE:32:default 并启用 Thumb 支持。
  3. 分析选项里,建议开启 Decompiler Parameter ID 和 Call-Fixup,能提升反编译质量。
小技巧:我习惯在分析前先跑一次 Auto Analysis,但只勾选 Basic 和 Disassembler,等第一次反编译完成后再补跑 Decompiler。这样能避免分析卡死。

3.1.3 常见问题与修复

问题 原因 解决方法
反编译结果全是 undefined 函数起始地址未正确识别 手动创建函数:选中地址,按 F 键
跳转表识别失败 编译器优化导致跳转表被内联 使用 Switch 分析插件手动标记
系统调用无法解析 缺少对应的 SVC 号映射 手动添加 syscall 注释或写脚本补全

3.2 IDA Pro:老牌劲旅的 ARM64 调优

IDA Pro 是商业工具,贵,但确实好用。它对 ARM64 的支持是最成熟的,尤其是对 iOS 和 Android 的 AArch64 二进制。

3.2.1 处理器模块选择

IDA 7.x 以上版本自带 ARM64 支持。导入文件时,选择:

  • ARM64:标准 AArch64 指令集。
  • ARM64+Thumb:如果文件包含 Thumb 代码(比如某些 bootloader)。
  • ARM64+NEON:分析多媒体或加密库时启用,能正确反编译 SIMD 指令。

个人经验:我分析 Android 的 libc.so 时,发现 IDA 默认不加载 NEON 寄存器。手动在 Options -> General -> Disassembly 里勾选 Display NEON registers,反编译结果会清晰很多。

3.2.2 签名库与 FLIRT

IDA 的 FLIRT 签名能快速识别标准库函数。ARM64 环境下,需要加载对应的签名文件:

  1. 打开 File -> Load File -> FLIRT Signature File。
  2. 选择 arm64_v8a 或 aarch64 开头的签名。
  3. 如果分析的是 iOS 二进制,加载 ios_arm64 签名。

我遇到过签名不匹配的情况——比如 Android 9 的 libc 和 Android 12 的 libc 函数偏移不同。这时候需要自己生成签名:用 sigmake 工具从目标库提取特征。

3.2.3 调试器配置

IDA 的远程调试功能对 ARM64 设备很实用:

  • Android:使用 android_server(在 IDA 的 dbgsrv 目录下),推送到设备上运行,IDA 端选择 Remote ARM64 Linux/Android debugger。
  • iOS:使用 debugserver,需要给二进制签名。我一般用 ldid 或 jailbreak 环境下的 debugserver。
避坑:IDA 的 ARM64 反编译有时会把 ADRP + ADD 指令对识别成全局变量引用,但实际上可能是局部地址计算。我曾经被这个误导过,后来养成习惯:看到 ADRP 先看它后面跟的是 ADD 还是 LDR,前者是地址计算,后者是内存访问。

3.3 Binary Ninja:新锐之选的 ARM64 支持

Binary Ninja 是后起之秀,UI 现代、脚本友好、反编译质量高。它对 ARM64 的支持在 3.0 版本后大幅提升。

3.3.1 架构识别与手动指定

Binary Ninja 会自动识别 ARM64 二进制。如果识别失败,可以在 File -> Open 时选择 Manual Architecture:

  • AArch64:标准 64 位 ARM。
  • AArch64+ILP32:某些嵌入式系统用的 32 位指针模式。
  • ARM64+Thumb:混合模式。

3.3.2 插件生态

Binary Ninja 的插件系统很强大。我常用的 ARM64 相关插件:

插件名 功能 安装方式
ARM64Helper 增强 ARM64 反编译,修复跳转表 Plugin Manager 搜索安装
UnicornBridge 集成 Unicorn 模拟器,动态执行 ARM64 代码 手动下载安装
SyscallResolver 自动识别 ARM64 Linux/Android 系统调用 Plugin Manager 搜索安装
推荐:如果你主要做 ARM64 逆向,Binary Ninja 的 Medium Level IL(MLIL)视图比 Ghidra 的 PCode 更直观。我分析混淆代码时,经常在 MLIL 和 HLIL 之间切换,能快速定位控制流。

3.3.3 性能优化

Binary Ninja 分析大型 ARM64 二进制时,内存占用会飙升。我的优化方案:

  • 关闭 Auto Analysis 中的 Data Flow 选项,只保留 Control Flow。
  • 使用 Linear Sweep 而非 Recursive Descent 作为初始反汇编策略。
  • 分析完成后,再手动对关键函数启用 Full Analysis。

3.4 三款工具对比与选择建议

说实话,没有完美的工具。我根据项目需求换着用:

维度 Ghidra IDA Pro Binary Ninja
价格 免费 昂贵($1000+/年) 中等($299/年)
ARM64 反编译质量 良好 优秀 优秀
调试功能 内置调试器 远程调试成熟 需插件支持
脚本语言 Python/Java Python/IDC Python
社区支持 活跃 成熟 较小但专业
学习曲线 中等 陡峭 平缓

我的个人建议:

  • 入门:先用 Ghidra,免费且功能全。
  • 深度分析:IDA Pro 的调试和签名库无可替代。
  • 快速原型:Binary Ninja 的 API 最友好,写脚本效率高。

3.5 环境配置流程图

下面这张图概括了三种工具的 ARM64 配置流程,方便你对照操作:

ARM64 逆向环境配置流程 选择逆向工具 Ghidra JDK 17+ 安装 选择 AARCH64:LE:64 Auto Analysis 基础扫描 IDA Pro 选择 ARM64 处理器 加载 FLIRT 签名库 配置远程调试器 Binary Ninja 自动识别 AArch64 安装 ARM64Helper 插件 关闭 Data Flow 优化性能 开始 ARM64 逆向分析 提示:根据二进制来源(Android/iOS/嵌入式)选择对应工具链和签名库

3.6 我的最终建议

环境搭建只是第一步。真正重要的是你熟悉工具后,能快速定位到关键代码。

我刚开始用 Ghidra 时,花了一周才把 ARM64 的 PCode 搞明白。后来换 IDA,又觉得 FLIRT 签名太死板。直到 Binary Ninja 出现,我才找到平衡点。

嗯,工具是死的,人是活的。别在配置上花太多时间,尽快上手分析才是正道。