第三章 逆向分析环境搭建: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或更高。
3.1.2 ARM64 处理器模块加载
导入 ARM64 二进制文件时,Ghidra 会自动识别架构。但有时会识别错,需要手动指定:
- 导入文件时,在 Language 下拉框选择
AARCH64:LE:64:default(小端序)或AARCH64:BE:64:default(大端序)。 - 如果遇到 Thumb 模式混编(比如 iOS 越狱插件),需要勾选
ARM:LE:32:default并启用 Thumb 支持。 - 分析选项里,建议开启
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 环境下,需要加载对应的签名文件:
- 打开
File -> Load File -> FLIRT Signature File。 - 选择
arm64_v8a或aarch64开头的签名。 - 如果分析的是 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。
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 搜索安装 |
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 配置流程,方便你对照操作:
3.6 我的最终建议
环境搭建只是第一步。真正重要的是你熟悉工具后,能快速定位到关键代码。
我刚开始用 Ghidra 时,花了一周才把 ARM64 的 PCode 搞明白。后来换 IDA,又觉得 FLIRT 签名太死板。直到 Binary Ninja 出现,我才找到平衡点。
嗯,工具是死的,人是活的。别在配置上花太多时间,尽快上手分析才是正道。