3、静态分析工具实战:IDA Pro界面与操作、Ghidra基础使用、字符串与交叉引用分析、静态分析流程
静态分析,说白了就是「不动手,先动眼」。你拿到一个二进制文件,不运行它,光靠看代码、看数据、看结构,就能把它的逻辑摸个七七八八。我做了这么多年逆向,80% 的活儿其实都是在静态分析阶段完成的。动态调试当然重要,但那是最后攻坚用的。今天咱们就把静态分析的两把利器——IDA Pro 和 Ghidra——好好捋一遍。
3.1 IDA Pro 界面与核心操作
IDA Pro 是老牌王者了。我第一次用 IDA 的时候还是 5.0 版本,那时候界面还没现在这么花哨。但说实话,核心逻辑一直没变:反汇编 + 交叉引用 + 类型系统。你把这三点吃透了,IDA 就算入门了。
3.1.1 界面布局
打开一个 PE 或 ELF 文件后,你会看到几个关键窗口:
- IDA View-A:图形视图,展示函数控制流图。我个人习惯先看这个,一眼就能看出函数是简单还是复杂。
- Pseudocode (F5):反编译后的伪代码。嗯,这个功能太强了,但要注意——伪代码不一定完全准确,尤其是遇到混淆代码的时候。
- Functions Window:列出所有识别出的函数。我一般会按名称排序,先看那些名字可疑的(比如 sub_401000 这种默认名)。
- Output Window:输出日志,加载插件的信息也会显示在这里。
Ctrl + L 可以快速跳转到某个地址。我经常用它来定位关键函数。
3.1.2 常用快捷键
| 快捷键 | 功能 | 我的备注 |
|---|---|---|
| F5 | 反编译当前函数 | 最常用的键,没有之一 |
| G | 跳转到地址 | 配合 IDA 底部的地址栏用 |
| X | 查看交叉引用 | 这个后面重点讲 |
| N | 重命名变量/函数 | 我习惯把关键函数改成有意义的名字 |
| Alt + M | 添加书签 | 分析大文件时特别好用 |
你想想看,一个二进制文件可能有几千个函数。没有快捷键,光靠鼠标点,手都得抽筋。
3.1.3 字符串分析
字符串往往是逆向的突破口。IDA 会自动提取程序中的字符串,你可以在 Strings Window (Shift + F12) 里看到它们。
我曾经分析过一个恶意软件,它把所有关键字符串都加密了。运行时才解密。但即便如此,我仍然在字符串窗口里看到了几个硬编码的 IP 地址——这就是突破口。所以我的建议是:永远不要跳过字符串分析这一步。
Setup,调整最小字符串长度。默认是 5 个字符,有时候太短会刷出大量无意义数据,太长又会漏掉关键信息。我一般设成 6 或 8。
3.2 Ghidra 基础使用
Ghidra 是 NSA 开源的逆向工具。说实话,刚出来的时候我还有点抵触——毕竟用惯了 IDA。但用了一段时间后,我发现 Ghidra 有几个 IDA 比不了的优势:免费、跨平台、自带反编译器、支持脚本扩展。
3.2.1 创建项目与导入文件
Ghidra 的项目管理方式和 IDA 不太一样。你需要先创建一个项目(Project),然后把文件导入进去。导入时 Ghidra 会自动识别文件格式,并询问你是否要执行分析。
# 基本操作流程
1. File -> New Project -> Non-Shared Project
2. 选择保存路径,命名项目
3. 拖入目标文件到项目窗口
4. 双击文件,Ghidra 开始分析
5. 等待分析完成(第一次会比较慢)
我记得第一次用 Ghidra 分析一个 50MB 的固件,等了快十分钟。当时我还以为程序卡死了。后来才知道,Ghidra 的分析引擎默认会做很多深度分析,比如数据流分析、类型传播等。如果你只是快速浏览,可以在分析选项中关掉一些不必要的步骤。
3.2.2 代码浏览与反编译
Ghidra 的代码浏览窗口叫 Listing,对应 IDA 的 IDA View。按 F5 同样可以调出反编译窗口(Decompiler)。
有一点我觉得 Ghidra 做得比 IDA 好:它的反编译结果默认是 可编辑的。你可以直接在反编译窗口里修改变量名、函数名、甚至修改类型定义。修改会同步到 Listing 窗口。这在分析大型项目时非常方便。
3.2.3 交叉引用分析
交叉引用(XRef)是静态分析的核心。无论是 IDA 还是 Ghidra,你都需要熟练使用它。
在 Ghidra 中,选中一个函数或变量,右键选择 References -> Show References to,就能看到所有引用它的地方。快捷键是 Ctrl + Shift + F。
我举个例子:你在字符串窗口里看到一个字符串 "Password: ",你想知道哪里用到了它。直接查交叉引用,就能定位到校验密码的函数。然后从那个函数再往上查交叉引用,就能找到调用它的上层逻辑。一层层往上,整个程序的脉络就清晰了。
3.3 字符串与交叉引用分析实战
光说不练假把式。咱们拿一个简单的 CrackMe 来演示一下。
3.3.1 场景描述
假设你拿到一个 Windows PE 文件,它要求输入一个序列号。你的目标是找到正确的序列号,或者直接跳过验证。
3.3.2 分析步骤
- 打开文件:用 IDA 或 Ghidra 加载文件。
- 查看字符串:按 Shift+F12,搜索 "Wrong"、"Correct"、"Serial" 等关键词。
- 定位关键函数:找到 "Wrong" 字符串,查看它的交叉引用。你会发现它被一个比较函数引用。
- 分析比较逻辑:进入那个函数,看它是怎么比较的。可能是直接比较字符串,也可能是某种算法(比如 XOR、Base64)。
- 提取算法:如果是简单比较,直接就能看到序列号。如果是算法,你需要逆向出算法逻辑,然后写一个 keygen。
3.4 静态分析流程总结
静态分析不是乱看一气。我总结了一套流程,你可以参考:
- 文件识别:确定文件类型(PE、ELF、Mach-O 等),查看入口点、节区信息。
- 字符串提取:快速浏览所有字符串,标记可疑内容。
- 函数概览:查看函数列表,识别库函数和自定义函数。
- 入口点分析:从入口点开始,跟踪程序的主逻辑。
- 关键函数深入:对可疑函数进行反编译,分析其逻辑。
- 交叉引用追踪:从关键数据或函数出发,向上向下追踪调用链。
- 类型重建:根据使用方式,重建数据结构、虚函数表等。
这套流程我用了十几年,基本没翻过车。当然,遇到加壳或混淆的程序,静态分析就不够用了——那是后面动态分析的内容。
3.5 知识体系图
下面这张图展示了本章的核心知识结构。你可以把它当作一个检查清单:
这张图把 IDA Pro、Ghidra 和核心分析技术串在了一起。你可以在分析时对照着看,确保自己没有遗漏关键步骤。
好了,静态分析的基础就讲到这里。记住一句话:静态分析是逆向的基石,工具只是手段,思路才是核心。下一节我们会进入动态分析的世界,到时候你会看到,静态分析打下的基础有多重要。