ARTICLE · 1254990
没有源码,怎么读懂程序?
当然是逆向。当然逆向现在很容易了。
在遇到一个陌生的二进制文件的时候,最耗时间的往往不是打开它的过程,而是要建立起正确的上下文环境:入口点在哪里、函数之间的调用关系怎样、哪些数据会影响重要的分支、一段汇编代码最后做些什么事情。
Ghidra 提供了一个比较完整的分析链条。该软件逆向工程框架是由美国国家安全局研究局所创建和维护的,包含反汇编、汇编、反编译、图形分析以及脚本功能,并且可以对各种处理器指令集以及可执行文件格式进行操作。它可以用来做互动式的分析工作,也可以用来做自动化的任务。

由机器码转换为可验证的信息
反编译只是起点,Ghidra可以把指令、函数、数据以及它们之间的调用关系放在同一个分析环境中进行研究,并且可以使用图形界面来跟踪控制流,之后再回到反汇编和反编译的结果里去核对细节。脚本功能则用来做重复性的工作,比如批量地检查函数、提取模式或者整理分析结果等。
一个常常被人忽视的选择就是:高级语言视图降低了阅读难度,并不意味着就恢复了原始源代码。编译优化、符号丢失以及编译器的行为会使反编译的结果需要人工验证。Ghidra的价值在于把可疑的信息聚集在一起,使研究人员能够更快地回到机器码、数据流和上下文中去,而不是许诺一键还原程序。
官方还支持用户用Java或者Python语言编写脚本和扩展,发布版内置了用于Eclipse的GhidraDev插件,也可以通过Script Manager调用Visual Studio Code;但是官方说明说,上述集成只适用于完整构建的Ghidra安装,并非随便指明某个源代码文件夹。
什么样的工作流程才合适呢?
个人分析可以从GUI开始:导入样本、查看函数调用图,并据此去核查反编译的结果。对于大批量文件进行操作的时候可以用到headless模式。
官方的Getting Started文档中也提到了single jar的方式,即可以把所有或者一部分功能打包进一个ghidra.jar里,然后用命令行方式运行或者做为其它Java程序逆向分析的能力库。
当团队一起研究某个项目的时候,Ghidra服务器可以让每个人都在自己的本地副本上进行修改,并且可以将这些改动上传到共享仓库中。这里所说的不是几个人一起看同一个窗口,而是把各个参与者的分析意见、注释以及提交历史都整合进工程的合作当中去。
安装时,官方预构建版本要求使用的是 64 位的 JDK 25。可以从 Release 页面下载多平台压缩包并解压之后再执行命令:在 Linux/macOS 系统上执行 ./ghidraRun 命令,在 Windows 上则需运行 ghidraRun.bat。
如果要用到 Python 的话,则可以使用如下命令来启动 Ghidra:在 Linux/macOS 系统下输入 ./support/pyghidraRun,在 Windows 下则为 support\pyghidraRun.bat。
值得注意的边界
Ghidra 支持 Windows 10、Linux 和 macOS,但当前官方发布包主要提供 Windows 和 Linux x86-64 原生组件;macOS 和 Linux ARM64 等平台需要自行构建原生组件。一些版本还有已知的安全漏洞,在使用之前要查看官方的安全建议。
另外,分析的结果始终需要和样本来源、执行环境以及人工判断一起考虑,并不能把反编译窗口看作最后的结果。
我认为Ghidra的竞争优势并不是一个单一的算法,而是在于将逆向工程转化为可回溯的工作流程:线索有出处、脚本能重复使用、合作留痕迹、自动化的入口也存在。对于从事二进制研究时间较长的人来说,工程上的进步比一时一地的高明反编译更有价值。
https://github.com/NationalSecurityAgency/ghidra















































































