Ghidra 入门:NSA 开源的逆向分析神器到底怎么用

1608 字
8 分钟
Ghidra 入门:NSA 开源的逆向分析神器到底怎么用

你拿到一个不知名的二进制文件。没有源代码,没有文档,只有一段 file 命令的输出告诉你”这是 ELF 64-bit LSB executable”。你想知道它里面到底干了什么——有没有偷偷联网?有没有读取敏感文件?硬编码了什么密码?

strings 只能看到明文字符串,用 objdump 看汇编又太累。你需要一个能把二进制还原成代码的图形化工具。

IDA Pro 是最好的选择——但免费版功能受限,Pro 版要几千美元。除非你公司报销,个人用户很难下得去手。

Ghidra 是 NSA(美国国家安全局)在 2019 年开源的反汇编与逆向分析框架。这不是玩票项目——NSA 内部用了几十年的工具,拿出来免费给所有人用。功能上对标 IDA Pro,而且反编译器的质量在一些场景下甚至比 IDA 更好。最关键是:完全免费,开源,还能写插件。


一、Ghidra vs IDA Pro vs radare2#

对比项GhidraIDA Proradare2
价格免费$2,789/年起免费
开源
图形界面✅ 开箱即用✅ 开箱即用⚠️ 需装 Cutter
反编译器✅ 内置✅ 内置❌ 需插件(Ghidra 的)
调试器⚠️ 内测中✅ 内置✅ 内置
插件生态丰富(Java/Python)丰富(IDC/Python)一般
学习曲线中等中高
跨平台✅(需 JRE)

如果你刚开始学逆向,Ghidra 是最合适的门槛——功能足够强大,且免费让你没有心理负担。等以后遇到非要调试不可的场景,再考虑 IDA Pro 或者加一个 gdb 辅助。


二、安装#

前置要求#

Ghidra 基于 Java,需要 JDK 17 以上:

Terminal window
# Ubuntu/Debian
sudo apt install openjdk-21-jdk
# macOS
brew install openjdk@21
# 验证
java -version

下载 Ghidra#

GitHub Releases 下载最新版,解压即可使用:

Terminal window
wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_11.2_build/ghidra_11.2_PUBLIC_20250210.zip
unzip ghidra_11.2_PUBLIC_20250210.zip
cd ghidra_11.2_PUBLIC
./ghidraRun # 启动图形界面

注意目录路径中不能有空格。 Ghidra 对路径比较敏感,如果启动失败,先检查路径。


三、反编译第一个程序#

用之前第一篇 GDB 汇编教程里的 add 程序作为目标,或者随便找一个你编译过的 Linux ELF 文件。

Step 1:创建项目#

启动 Ghidra 后点击 File → New Project,选择 Non-Shared Project,填一个项目名和目录。

Step 2:导入目标文件#

add 拖进 Ghidra 窗口。弹窗里直接点 Yes 确认导入,然后点 OK 使用默认分析选项。

Step 3:用 CodeBrowser 打开#

导入完成后,双击文件图标打开 CodeBrowser。Ghidra 会自动开始分析——耐心等待底部的进度条走完。

Step 4:看反编译结果#

分析完成后,你会看到三个主要面板:

左侧:Symbol Tree(函数列表)
中间:Listing(反汇编)
右侧:Decompiler(反编译的 C 代码)

在左侧找到 main 函数双击,中间显示汇编代码,右侧自动显示对应的 C 语言伪代码:

void main(void)
{
int iVar1;
int local_10;
int local_14;
int local_18;
local_14 = 10;
local_18 = 20;
local_10 = add(local_14, local_18);
iVar1 = printf("Result: %d\n", local_10);
return 0;
}

跟原始代码几乎一模一样。这就是 Ghidra 最让新手震撼的地方——一个二进制文件进去,伪 C 代码出来。


四、Ghidra 最有用的四个操作#

1. 重命名变量#

反编译器生成的变量名都是 local_10iVar1 这种毫无意义的名称。在反编译窗口里右键变量 → Rename Variable,改成有意义的名称(比如 result),修改后自动同步到所有引用位置。

2. 给函数改名#

双击选中函数名 → 右键 → Rename Function。如果你遇到了 FUN_00101234 这种自动命名,说明 Ghidra 不认识这个函数。分析调用上下文后手动改成有意义的名字。

3. 搜索字符串#

Search → For Strings,可以快速定位二进制中的硬编码字符串。很多恶意软件的关键行为线索就藏在字符串里。

4. 交叉引用#

右键一个变量或函数 → References → Show References to。看有哪些地方调用了这个函数、这个字符串被谁引用——这是理清代码逻辑的关键操作。


五、实战案例:分析一个假想的后门程序#

假设你拿到了一个可疑的 ELF 文件,怀疑是后门。用 Ghidra 打开,搜索字符串:

你会看到类似这样的字符串:

/sbin/ifconfig
/etc/shadow
http://192.168.1.100:8080/upload
POST /upload HTTP/1.1

找到函数的交叉引用,追踪谁用了 http://192.168.1.100:8080/upload,你就能看到完整的网络请求逻辑——它把 /etc/shadow 文件内容打包发送到远程服务器。

整个过程不需要你一行一行读汇编。Ghidra 的反编译器和字符串搜索已经把 80% 的工作替你做了。


常见问题

Q:Ghidra 跟 IDA Pro 比反编译质量差很多吗? 在某些场景下 Ghidra 甚至更好(尤其是 x86-64 架构)。IDA Pro 的优势在于调试器、对嵌入式架构的支持、以及更成熟的插件生态。但就看代码这件事,Ghidra 完全够用。

Q:反编译出来的 C 代码能直接编译? 不能。Ghidra 生成的是”伪 C 代码”——它保留了逻辑结构,但变量名、类型推断都可能不准确。目的是让人看懂,不是让人重新编译。

Q:对中文支持好吗? Ghidra 的界面是英文的,但分析中文路径和字符串没有问题。字符串搜索也能正常显示 UTF-8 编码的中文字符。

Q:入门逆向需要会汇编吗? 建议至少了解基础指令(mov、push、call、jmp),Ghidra 会帮你反编译成伪 C 代码,但有时候伪 C 代码不准,你还是得看汇编确认。建议先看站内这篇《x86 汇编入门:用 GDB 看懂你的 C 程序在干什么》打基础。

Q:有 Python 接口吗? 有。Ghidra 的插件可以用 Java 写,也可以用 Jython(Python 的 Java 实现)写。写个自动分析脚本、批量处理多个二进制都很方便。


Ghidra 是为数不多的”NSA 出品,你我都能用”的工具。免费、强大、活跃更新——入门逆向从它开始是最划算的选择。

逆向分析不只是破解软件。排查恶意程序、分析固件漏洞、理解老旧代码——Ghidra 在这些场景下都是趁手的工具 🐾

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Ghidra 入门:NSA 开源的逆向分析神器到底怎么用
https://www.kshare.top/posts/ghidra-intro-reverse-engineering/
作者
Kshare
发布于
2026-06-20
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kshare
Hello, I'm Kshare.
公告
站点已开启广告(类型:弹窗广告),给您带来的不便敬请谅解。如有更好的广告建议,欢迎发送邮件至 t9uzrz6u@anonaddy.me,感谢您的支持!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
187
分类
9
标签
190
总字数
490,175
运行时长
0
最后活动
0 天前

文章目录