第四章 静态分析工具链: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 基础使用流程
- 创建项目:File → New Project → Non-Shared Project
- 导入固件:拖入二进制文件,选择架构(ARM little endian / Thumb / etc.)
- 自动分析:双击打开,Ghidra会自动跑分析脚本
- 查看反汇编:Listing窗口显示汇编,Decompile窗口显示伪代码
- 符号恢复:右键 → Analyze → Symbol Recovery
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打开结构体窗口
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 知识体系总览
下面这张图,把本章的核心知识点串起来了。你对照着看,心里就有谱了。
4.6 实战建议:选哪个工具?
我个人的选择逻辑很简单:
- 免费且跨平台:Ghidra,没得选
- 分析x86恶意软件:IDA Pro,Hex-Rays反编译器无可替代
- 批量自动化:radare2/rizin,脚本写起来比Ghidra的Python快
- 团队协作:Ghidra,自带服务器,多人同时分析一个项目