第四章 静态分析工具链:Ghidra、IDA Pro与radare2实战

静态分析,说白了就是不动代码,只看二进制文件本身。你拿到一个固件,先别急着跑,先用工具把它「解剖」开。我做了这么多年逆向,发现很多新手上来就开调试器,结果被反调试搞得一头雾水。其实,80%的信息在静态阶段就能拿到。

这一章,我带你过一遍三个主流工具:Ghidra、IDA Pro、radare2/rizin。它们各有脾气,但核心逻辑相通——反汇编、反编译、符号恢复、类型重建。你掌握一个,另外两个上手就快了。

4.1 反汇编与反编译:你得先知道它俩的区别

很多同学问我:「反汇编和反编译不是一回事吗?」嗯,还真不是。

概念 输出 可读性 典型工具
反汇编 汇编指令(mov, add, call...) 低,需要懂指令集 objdump, Ghidra, IDA
反编译 类C伪代码(if, for, while...) 高,接近源码 Ghidra, IDA Hex-Rays

我个人习惯:先用反汇编确认关键地址和跳转,再用反编译看逻辑。举个例子,我在分析一个IoT固件时,反汇编看到一堆 BLX R3,头都大了。切到反编译,发现是个函数指针表,瞬间明白是状态机调度。

小技巧: 反编译不是万能的。遇到混淆代码或自修改代码,反编译器会输出「假逻辑」。这时候必须切回汇编,逐条确认。

4.2 Ghidra:NSA出品,免费且强大

Ghidra是我最常用的工具。为什么?免费、跨平台、插件生态好。而且它的反编译器(叫Sleepycat)质量很高,ARM、MIPS、RISC-V都支持得不错。

4.2.1 基础使用流程

  1. 创建项目:File → New Project → Non-Shared Project
  2. 导入固件:拖入二进制文件,选择架构(ARM little endian / Thumb / etc.)
  3. 自动分析:双击打开,Ghidra会自动跑分析脚本
  4. 查看反汇编:Listing窗口显示汇编,Decompile窗口显示伪代码
  5. 符号恢复:右键 → Analyze → Symbol Recovery
注意: Ghidra默认分析会加载所有插件,速度慢。我建议只勾选「Basic」「Function ID」「Data Reference」。其他按需开启,否则一个10MB的固件能分析半小时。

4.2.2 符号恢复与类型重建

固件里全是 sub_80001234 这种名字,看着就烦。Ghidra提供了几种恢复手段:

  • FLIRT签名:匹配标准库函数(比如newlib、uClibc)
  • 函数ID:基于哈希匹配已知函数
  • 手动重命名:按 L 键,输入有意义的名字

类型重建更关键。你看到一个指针被当作int用,反编译出来的代码全是乱码。这时候需要:

// 原始反编译
int *ptr = (int *)0x20001000;
*ptr = 0x12345678;

// 重建类型后
struct uart_regs *uart = (struct uart_regs *)0x20001000;
uart->baud = 115200;

在Ghidra里,按 Ctrl+L 打开数据类型管理器,可以导入结构体定义。我曾经分析一个Zephyr固件,手动重建了50多个结构体,最后反编译出来的代码跟源码几乎一样。

4.3 IDA Pro:老牌王者,但贵

IDA Pro是商业工具,价格劝退很多人。但如果你在公司做逆向,老板掏钱买了,那真香。它的Hex-Rays反编译器是目前最成熟的,尤其对x86/x64的支持无人能及。

4.3.1 与Ghidra的对比

特性 Ghidra IDA Pro
价格 免费 $2000+/年
反编译质量 ARM/MIPS优秀,x86一般 全架构优秀
插件生态 Python + Java IDC + Python + C++
调试器集成 弱(需插件) 强(内置调试器)
学习曲线 中等 陡峭

我个人习惯:分析ARM/MIPS固件用Ghidra,分析x86恶意软件用IDA。有一次我遇到一个VxWorks固件,IDA的签名库直接匹配了200多个系统调用,省了我两天时间。

4.3.2 基础操作

  • 导航:G 跳转到地址,X 查看交叉引用
  • 重命名:N 键,改函数/变量名
  • 添加注释:: 键,写中文注释(IDA支持UTF-8)
  • 创建结构体:Shift+F1 打开结构体窗口
避坑指南: 我曾经在IDA里直接修改了二进制数据,然后保存。结果固件校验失败,板子变砖。记住:IDA是分析工具,不是编辑器。改完要导出patch文件,用hex工具写入。

4.4 radare2/rizin:命令行党的最爱

radare2(简称r2)是开源逆向框架,主打命令行操作。它的继任者rizin(r2的分支)更稳定。如果你习惯终端操作,或者需要自动化分析,r2/rizin是不二之选。

4.4.1 快速上手

# 打开固件
r2 -a arm -b 16 firmware.bin

# 分析
aaaa

# 查看函数列表
afl

# 反汇编当前函数
pdf

# 切换到图形模式
VV

# 搜索字符串
izz | grep "password"

r2的命令很简洁,但记忆成本高。我建议你记住几个核心命令:aaa(自动分析)、afl(列函数)、pdf(反汇编)、VV(图形)。其他用到再查。

4.4.2 脚本化分析

r2的强大之处在于可脚本化。比如批量提取固件中的所有字符串:

# r2 script: extract_strings.r2
e asm.arch=arm
e asm.bits=16
aaaa
izz > strings.txt
quit

然后运行:r2 -i extract_strings.r2 firmware.bin

我在分析一批同型号路由器固件时,写了个r2脚本,自动提取所有HTTP路径和认证函数。200个固件,跑了一晚上,第二天直接拿到漏洞模式。

4.5 知识体系总览

下面这张图,把本章的核心知识点串起来了。你对照着看,心里就有谱了。

静态分析工具链知识体系 静态分析工具链 Ghidra IDA Pro radare2 / rizin 反汇编 + 反编译 符号恢复 + 类型重建 脚本化 + 自动化 FLIRT签名 / 函数ID匹配 结构体重建 / 枚举定义 批量分析 / 自动化流水线 核心目标:从二进制中恢复出接近源码的 函数、变量、类型和逻辑结构 输出:可读的伪代码 + 符号表

4.6 实战建议:选哪个工具?

我个人的选择逻辑很简单:

  • 免费且跨平台:Ghidra,没得选
  • 分析x86恶意软件:IDA Pro,Hex-Rays反编译器无可替代
  • 批量自动化:radare2/rizin,脚本写起来比Ghidra的Python快
  • 团队协作:Ghidra,自带服务器,多人同时分析一个项目
我的建议: 三个工具都装。Ghidra做主力,IDA Pro做备胎(如果公司买了),r2做自动化。别只学一个,面试时人家问你「用过IDA吗?」你说「只会Ghidra」,印象分会打折扣。