本节摘要:radare2 的学习曲线出名地陡,但范式只有一句话:seek 定位、analysis 分析、print 打印。本节先把这句话拆成可操作的模型——光标(当前地址)是一切命令的隐含主语——并给出命令族谱(a 管分析、p 管打印、i 管信息、ax 管引用);再给核心命令族速成表,覆盖信息、分析、导航、反汇编、引用、字符串、修改、视觉八类,附内部管道修饰符与视觉模式两个提效技巧;然后用 r2 把第 1.2 节的 demo_stripped 走查重演一遍:izz 找字符串、afl 看函数、pdf 读校验函数、axt 查调用者,结论与 Ghidra 侧完全互证。最后正面回答「有了 Ghidra 还要 r2 吗」:互补而非替代——并给出三条选择标准。命令行为基于 6.x,以官方文档为准。
r2 是 UNIX 哲学在逆向上的化身:小命令、文本输出、可组合。它的交互模型可以压缩成三件事:
s main 跳到 main,s 0x00401160 跳到地址。当前地址是所有打印命令的隐含对象——「你在哪,就打印哪」。aaa 全量分析,af 分析当前函数,afl 列出已识别函数。分析产出标志(flag)与引用,后续命令才有东西可查。pdf 打印当前函数反汇编,iz 打印数据段字符串。命令字母有族谱:a 开头管分析、p 开头管打印、i 开头管信息、ax 开头管交叉引用。记住族谱,看到陌生命令也能猜个八九不离十——这就是「陡峭学习曲线」的缓坡:先记族谱,再记命令。
(文字流程图)r2 -A demo_stripped ──▶ s main(定位)──▶ aaa 已随 -A 完成 ──▶ pdf(打印)──▶ axt(查引用)──▶ s 目标(再定位)──▶ 循环
| 族 | 命令 | 作用 |
|---|---|---|
| 信息 | i / ij | 二进制基本信息(格式、架构、入口),j 后缀出 JSON |
| 信息 | iz / izz | 数据段字符串 / 全部字符串(含数据区之外) |
| 分析 | aaa | 全量分析(等价启动参数 -A) |
| 分析 | afl / aflj | 列出函数;j 后缀出 JSON(2.2 节的主角) |
| 定位 | s main / s 0xADDR | seek 到函数或地址 |
| 打印 | 打印当前函数反汇编 | |
| 打印 | pd 20 | 从当前地址打印 20 条指令 |
| 打印 | px 32 | 打印 32 字节十六进制(查常量数据) |
| 打印 | pdc | 内置伪反编译;更强的 pdg 需 r2ghidra 插件 |
| 引用 | axt | 谁引用了当前地址(xref to) |
| 引用 | axg | 当前地址的调用图 |
| 修改 | afn newname | 重命名当前函数 |
| 修改 | CC 注释文本 | 给当前地址加注释 |
| 视觉 | V / VV | 可视模式 / 函数图模式(按 q 退出) |
两个提效技巧值得先学:
afl~main(只看含 main 的行)、pdf~xor(只看含 xor 的指令)。长输出先过滤再读,是命令行的基本功。e asm.bytes=false 关掉机器码字节列,e asm.lines=false 关掉行间连线,反汇编立刻清爽;配置可写进 r2 配置文件持久化。再补一条进阶线索:想要 Ghidra 级的反编译质量,可以装 r2ghidra 插件(radare 社区维护,安装方式以官方文档为准),装好后 pdg 一条命令出 Ghidra 伪代码——r2 的轻快与 Ghidra 的质量从此可以在同一个会话里切换。
打开样本时用 -A 直接带上全量分析:
# bash —— r2 会话走查 demo_stripped(输出为示意,地址以实际环境为准) r2 -A bin/demo_stripped
进入交互提示符后按第 1.2 节的走查五步法来:
# bash —— r2 交互命令序列(写法示意) [0x00401090]> i # 基本信息:elf、x86、入口 [0x00401090]> izz # 字符串:发现 [FAIL] invalid license key [0x00401090]> axt @ str._FAIL_invalid_license_key # 字符串被谁引用 [0x00401090]> afl # 函数列表:main 与若干 fcn. 开头的名字 [0x00401090]> s main # 定位 main [0x00401090]> pdf # 读 main:可见对 fcn.00401160 的条件调用 [0x00401090]> s 0x00401160 # 跳到可疑函数(地址以你的环境为准) [0x00401090]> pdf # 看到 strcmp 与对 fcn.00401189 的调用 [0x00401160]> afn check_key # 重命名(只改本会话,导出见 2.2 节) [0x00401160]> s 0x00401189 [0x00401189]> pdf~xor # 过滤看关键指令:逐字节与 0x5a 异或 [0x00401189]> px 16 @ 0x00402008 # 看混淆常量的原始字节:36 33 39 3f 34 29 3f [0x00401189]> axt @ sym.imp.strcmp # strcmp 被谁调用:正是 check_key
若入口没有自动标出 main,定位口诀与 Ghidra 侧一致:看 entry 的伪代码或反汇编,把传给启动例程的那个地址当 main 候选,再进去验证。
与 Ghidra 走查对照:入口定位、字符串锚点、读校验函数、认出异或、重命名,五步一一对应,结论一致(期望密钥 license,异或常量 0x5a)。这不是巧合——两个工具读的是同一个二进制,方法通用,工具可换。多工具互证还有额外收益:两个工具对同个函数的结构认知不同时(比如函数边界切分不同),差异本身就是值得人工裁决的信号。
纯命令用熟之后,VV(函数图模式)值得记一手:它把当前函数的控制流画成 ASCII 块图,条件分支的两条边、循环的回边一目了然。对 if-else 密集的函数(比如 demo 的 main),先 VV 看形状再 pdf 读细节,比硬读线性反汇编省力。
# bash —— 视觉模式速记(写法示意) [0x00401160]> VV # 进入函数图;p / P 切换视图,x 查引用,q 退出
视觉模式里也能直接发命令(先按冒号进命令行),改完刷新即见——「图形看结构、命令改细节」的混合用法,是 r2 老手的常态。
三个入门期提醒:VV 里按 h 看帮助键位,记不住就现场查;图太大时先 pdf 读关键块再进图,别在图里迷路;视觉模式的修改(如重命名)同样只在本会话生效,落盘思路不变。
| 维度 | radare2 | Ghidra |
|---|---|---|
| 启动与体量 | 秒开,终端里随手用 | 启动慢,工程化、窗口多 |
| 反编译质量 | 内置 pdc 较朴素;装 r2ghidra 可借 Ghidra 反编译器 | 反编译器是招牌,类型推断强 |
| 持久化 | 会话内修改,需主动导出脚本 | 工程文件自动保存重命名与注释 |
| 脚本化 | r2pipe 一根管子通多语言,管道文化 | analyzeHeadless 与 PyGhidra,JVM 生态 |
| 适合 | 快看、批量、嵌入自动化 | 精读、长期工程、复杂类型恢复 |
定位一句话:快与组合找 r2,深与留痕找 Ghidra。 本书后续章节恰好各用一边:第 03 章的 MCP 让模型操作 Ghidra 工程,第 04 章的 r2ai / r2mcp 把 r2 变成模型的双手——两条线在方法上完全同构。
给三条具体标准:
再加一条组合拳:同一样本两边都开。Ghidra 精读建理解,r2 快问快答做验证;两边的函数地址体系一致,抄个地址就能互跳。真实逆向工作里,工具切换的成本远低于单工具硬啃的成本。
手敲命令解决了「快」,下一节解决「批量与复用」:r2pipe 把这些命令搬进 Python,函数与伪代码按 JSON 成批流出,为第 04 章的大模型备好粮食。