从零开始学习 Ghidra 静态分析 + Frida 动态 Hook,掌握程序逆向的核心技能
逆向工程(Reverse Engineering)是在没有源码的情况下,通过分析编译后的二进制文件,理解程序的功能、逻辑和数据结构的技术。
不运行程序,直接分析二进制文件的代码结构。反汇编(看汇编)、反编译(还原伪代码)。
代表工具:Ghidra、IDA Pro
运行程序,实时观察内存、函数调用、网络通信。可以 Hook(拦截)函数,修改参数和返回值。
代表工具:Frida、LLDB
NSA(美国国家安全局)开源的逆向框架。支持 50+ CPU 架构,自带反编译器,功能接近商业工具 IDA Pro。
跨平台动态插桩工具,支持 Windows / macOS / Linux / Android / iOS。用 JavaScript 编写 Hook 脚本,实时拦截函数。
行业标准反汇编器,94% 函数边界识别准确率。Hex-Rays 反编译器生成最干净的伪代码。
现代化界面,API 设计优秀。支持实时协作,性价比最高的商业工具。
macOS 原生体验最好的反汇编器,轻量快速,特别适合分析 macOS / iOS 程序。
开源逆向框架,命令行为主(Cutter 是 GUI 版)。极其灵活,脚本化能力强。
# macOS 启动命令
/Applications/ghidra_12.0.4_PUBLIC/ghidraRun
# 需要 JDK 21(已安装)
java -version
File → New ProjectNon-Shared Project(单人项目)File → Import File,选择要分析的可执行文件Yes,等待分析完成| 面板 | 作用 |
|---|---|
| Listing(中间) | 反汇编视图,显示汇编指令 |
| Decompile(右侧) | 反编译伪代码,接近 C 语言,最常看的面板 |
| Symbol Tree(左侧) | 函数列表、导入表、导出表 |
| Data Type Manager | 数据结构定义 |
| Program Trees | 程序段(.text / .data / .bss) |
| 快捷键 | 操作 |
|---|---|
G | 跳转到指定地址 |
L | 重命名函数 / 变量(最重要的操作) |
; | 添加注释 |
T | 修改数据类型 |
Ctrl+Shift+F | 搜索字符串 |
X | 查看交叉引用(谁调用了这个函数) |
Ctrl+E | 搜索内存中的字节序列 |
Search → For Strings 搜索字符串,通过错误提示、日志信息、关键字快速定位核心逻辑。
Frida 是一个动态插桩工具 — 它能在程序运行时注入 JavaScript 代码,拦截(Hook)任意函数,查看参数、修改返回值。
# 列出当前运行的进程
frida-ps
# 列出 USB 设备上的进程(手机)
frida-ps -U
# 附加到一个正在运行的进程
frida -n "Safari"
# 跟踪某个 App 的 ObjC 方法调用
frida-trace -m "-[NSURLSession dataTaskWithRequest:*]" -n "Safari"
新建一个 hook.js 文件:
// hook.js — 拦截 macOS 上的文件打开操作
Interceptor.attach(Module.findExportByName(null, "open"), {
onEnter: function(args) {
// 打印每次打开的文件路径
console.log("[open] " + Memory.readUtf8String(args[0]));
},
onLeave: function(retval) {
// 打印返回的文件描述符
console.log(" → fd = " + retval);
}
});
# 运行 Hook 脚本
frida -n "目标进程名" -l hook.js
// 拦截 NSURLRequest,查看所有网络请求的 URL
var NSURLRequest = ObjC.classes.NSURLRequest;
Interceptor.attach(NSURLRequest["- URL"].implementation, {
onLeave: function(retval) {
var url = new ObjC.Object(retval);
console.log("[Request] " + url.absoluteString());
}
});
| 场景 | Frida 做法 |
|---|---|
| 查看 App 发了什么网络请求 | Hook NSURLSession 相关方法 |
| 查看加密前的明文数据 | Hook CCCrypt(CommonCrypto) |
| 绕过越狱检测 | Hook 检测函数,强制返回 false |
| 导出内存中的解密数据 | Hook 解密函数的 onLeave,dump 返回值 |
| 追踪函数调用链 | 用 frida-trace 批量 Hook |
| 维度 | Ghidra | IDA Pro | Binary Ninja |
|---|---|---|---|
| 价格 | 免费 | $1,879+/年 | $299 |
| 反编译质量 | 优秀(89%) | 顶级(94%) | 很好(85%) |
| 架构支持 | 50+ 架构 | 30+ 架构 | 20+ 架构 |
| 多人协作 | 原生支持 | 需要插件 | 原生支持 |
| 插件生态 | 丰富(Java/Python) | 最丰富(IDAPython) | 增长中 |
| 上手难度 | 中等 | 中等 | 较低 |
| AI 集成 | 有 MCP Server | 有插件 | 有 API |
| macOS 体验 | 良好 | 良好 | 良好 |
用 file 命令查看文件类型,用 strings 提取可见字符串,了解目标程序的基本信息。
file target_binary
strings target_binary | grep -i "password\|key\|token"
导入程序到 Ghidra,自动分析后浏览函数列表。从字符串搜索和导入函数入手定位核心代码。
通过交叉引用(Xref)追踪调用链,在反编译窗口阅读伪代码,重命名变量让代码更可读。
对静态分析中发现的关键函数编写 Hook 脚本,运行时验证参数和返回值是否符合预期。
# 1. 查看 macOS App 的二进制文件
file /Applications/Calculator.app/Contents/MacOS/Calculator
# 2. 查看它链接了哪些系统库
otool -L /Applications/Calculator.app/Contents/MacOS/Calculator
# 3. 导出 ObjC 类名(macOS 程序特有)
class-dump /Applications/Calculator.app/Contents/MacOS/Calculator
# 4. 用 Frida 查看计算器运行时调用了哪些方法
frida-trace -m "-[* *calculate*]" -n "Calculator"
| 法律 | 条款 | 说明 |
|---|---|---|
| 《刑法》 | 285 / 286 条 | 非法侵入 / 破坏计算机信息系统 |
| 《刑法》 | 217 条 | 侵犯著作权罪 |
| 《著作权法》 | — | 软件是受保护的作品 |
| 《反不正当竞争法》 | — | 保护商业秘密 |