- Ghidra 是由美国国家安全局 (NSA) 开发的一款功能强大的免费开源逆向工程套件,用于分析多个平台上的二进制文件。
- 该工具需要 64 位系统和 JDK 11,并且可以在 Windows、Linux 和 macOS 上使用 Gradle 进行编译,以确保始终使用最新版本。
- 正确的项目配置、代码浏览器用户界面、快捷方式和外部数据类型是最大限度地发挥分析能力的关键。
- Java 和 Python 脚本、类型数据库以及其他签名使 Ghidra 成为恶意软件分析和高级逆向工程的非常可靠的选择。

如果您有兴趣 逆向工程和二进制分析你几乎不可能没听说过 Ghidra。这款工具由美国国家安全局 (NSA) 在内部使用十多年后发布,已经成为 IDA Pro 和其他商业反汇编软件的有力替代品,尤其因为它免费、开源且功能极其强大。
接下来您将找到一份非常完整的指南。 从零开始创建 Ghidra本文将介绍 Ghidra 是什么,使用 Ghidra 需要哪些工具,如何在不同的操作系统上安装或编译 Ghidra,如何创建你的第一个项目,如果你之前使用过 IDA,如何调整 Ghidra 的界面以方便使用,以及如何对可执行文件进行初步的基本分析。本文的目标是让你读完后能够自信地使用 Ghidra 打开二进制文件并轻松地浏览其环境。
什么是吉德拉?它为何成为一个转折点?
吉德拉是 用 Java 开发的逆向工程套件 由美国国家安全局 (NSA) 开发。十多年来,它一直是用于分析恶意软件、固件、不同平台的可执行文件以及任何需要反汇编或反编译以了解其行为的二进制文件的内部工具。
Ghidra 于 2019 年上市,打破了此前存在的模式:近二十年来,如果你想认真地投身于…… 专业逆向工程此前,IDA Pro(通常搭配付费反编译器)是主流选择,这是一款价格昂贵且生态系统非常成熟的软件。虽然也存在其他工具,但鲜有能与之匹敌的。Ghidra 的出现,作为一款免费开源软件,彻底改变了社区的格局。
最初最令人惊讶的是,Ghidra 与许多分析师接受培训时使用的传统工具并不完全相同。它基于 Java 的界面、模块化方法以及…… 略有不同的窗户布局这导致许多人一开始尝试使用,但感到有些迷茫,于是又回到使用 IDA 或其他程序的传统工作流程。
然而,随着项目的成熟,通过新版本的发布、漏洞修复和持续改进,Ghidra 已成为一款完全有效的逆向工程工具。 良好的初始界面设置通过自定义快捷方式和一些类型的数据库,许多分析师发现他们可以舒适高效地工作,而不会太怀念以前的工作环境。
Ghidra的基本要求和功能
在你开始疯狂剖析二进制文件之前,了解 Ghidra 正常运行所需的条件以及它开箱即用的功能至关重要。从技术上讲,它是一个 应用程序是用 Java 编写的这使得它具有跨平台(Linux、macOS 和 Windows)的优势,但缺点是依赖于相对较新的 Java 虚拟机。
该工具本身推荐的最低要求相当合理: 64位操作系统 (任何当前版本的 Linux、macOS 或 Windows),至少 4 GB 内存,以及大约 1 GB 的磁盘空间用于基本安装和初始项目。显然,二进制文件越大越复杂,您就越需要更多的内存和 CPU 资源。
必须有一个 Java 开发工具包 (JDK) 11 或更高版本。Ghidra 的执行并非完全依赖虚拟机,因为许多组件和脚本都依赖于此开发环境。如果您使用从 GitHub 下载的预编译包,该包本身通常已准备好与合适的 JDK 配合使用;但如果您从源代码编译,则需要正确安装 JDK。
吉德拉的优势之一是其庞大的 可扩展性您可以使用 Java 或 Python(通过 Jython)开发自己的模块、脚本和扩展程序,以实现分析自动化、生成报告、创建模式检测器或集成其他工作流程。此外,Ghidra 还支持与 Eclipse 等环境集成,并提供与 IDA Pro 等参考工具互操作的机制。
值得澄清的是,虽然该项目现在是开源的,代码也已发布在 GitHub 上,但在发布后的最初几个月里,情况略有不同:最初,发布过程较为缓慢,并非所有代码库都已开源。截至目前, 官方 Ghidra 存储库 它记录了社区的积极发展、事件和贡献。
工具的安全和信任警告
尽管 Ghidra 已被广泛使用,并且是由一家知名的政府机构发布的,但不应忘记它仍然是一种…… 庞大而复杂的代码库它依赖于众多第三方库。其中一些库过去曾出现过漏洞,因此可以合理推断,未来可能会出现新的安全漏洞。
无法绝对保证 Ghidra 的当前代码完全没有漏洞,也无法保证不会有人利用依赖项中的漏洞执行恶意代码。明智的做法是…… 将 Ghidra 视为任何其他复杂的工具。保持更新,从官方来源下载版本,在受控环境中运行应用程序,除非绝对必要,否则不要将其与关键系统混用。
在专业环境中,通常最好在……中运行它。 专用虚拟机 或者在隔离环境中,尤其是在分析来源不明的恶意软件或二进制文件时。请记住,加载恶意样本时,分析引擎或插件的任何故障都可能被视为攻击途径,尽管这种情况相对罕见。
如何获取 Ghidra:预编译二进制文件还是从代码编译
使用 Ghidra 最快捷的方法是下载 稳定版本已在 GitHub 上发布。 以 ZIP 压缩包的形式提供。这些预编译的二进制文件通常比主开发分支落后几个月,但作为回报,它们为大多数用户提供了更高的稳定性和更可控的体验。
如果你想始终拥有 最新功能和最新修复或者,您可以直接克隆官方代码库并自行编译 Ghidra。虽然这种方法并不适合所有人,但它为那些想要修改代码、提交补丁或测试尚未发布到稳定版本的功能的用户提供了极大的灵活性。
在很多情况下,这正是建议的做法:下载 源代码以 ZIP 文件格式提供 或者,您可以克隆 Git 仓库并在本地生成二进制文件,利用 Gradle 的自动化构建过程。完成首次构建(通常由于依赖项下载而最消耗资源)后,保持工具更新就相对容易了。
无论选择哪种方法,验证都至关重要。 签名和哈希 从 GitHub 或其他官方来源下载的软件包中获取 Ghidra 的安装包。这降低了恶意文件伪装成合法 Ghidra 版本的风险。
如何在 Windows 上逐步编译 Ghidra
在 Windows 系统上,除了 Java 和 Gradle 之外,您还需要…… Visual Studio 提供的本地编译器现代版本,例如 Visual Studio 2017 或更高版本,都能很好地工作,而 Community 2022 版本通常足以满足此目的。
典型的构建工作流程始于打开一个窗口 CMD(命令提示符) 然后使用以下命令导航到 Ghidra 源代码所在的目录:cd %directory_of_ghidra_source_code%
进入项目目录后,可以使用项目树中提供的 Gradle 脚本来初始化项目结构、下载所有依赖项并准备环境。通常的命令类似于:gradle.bat -I .\gradle\support\fetchDependencies.gradle init
这个过程可能需要 5 到 10 分钟,具体时间取决于您的网络连接和 Gradle 缓存的状态,因为它必须…… 下载所有必要的库.
如果一切顺利,流程结束后,您会在控制台上看到一条消息,内容如下: 建立成功此外,还需要确认已正确检测到 Visual Studio 安装,这是继续编译本机模块的必要条件。
初始化阶段结束后,剩下的就是启动主工具构建:gradle.bat buildGhidra
这一步骤可能也需要一些时间,出现警告也是正常的,但只要最终结果是“构建成功”,就可以认为编译成功。
该过程完成后,整个 Ghidra 软件包将被打包成一个 ZIP 文件,并放置在该目录中。 构建/分发使用方法很简单,只需将 ZIP 文件解压到你喜欢的文件夹,然后运行脚本即可。 ghidraRun.bat它负责使用适当的配置启动应用程序。
在 Linux 上编译 Ghidra
在 GNU/Linux 系统上,基本思路相同,但需要的不是 Visual Studio,而是…… GCC 的现代版本例如,Series 9 或 12 通常都能取得不错的效果。此外,当然,Java 和 Gradle 必须正确安装在系统上,如果您需要的话。 运行 Windows 软件 Linux 系统下有像 Bottles 这样的解决方案。
第一步是打开终端,并使用以下命令切换到 Ghidra 代码所在的目录:cd <directorio_del_codigo_de_ghidra>
接下来,启动初始 Gradle 进程,下载依赖项并配置项目,使用的命令如下:gradle -I ./gradle/support/fetchDependencies.gradle init
就像在 Windows 系统中一样,这个初始化阶段需要 活跃的互联网连接 这通常需要几分钟时间。Linux 系统中需要特别注意一点:如果您的区域设置不是英语(例如,如果您使用俄语或西班牙语),GCC 的本地化消息可能会导致一些解析输出的脚本无法正常工作。
为避免本地化问题,建议在运行 Gradle 时强制环境语言为英语,例如使用以下命令:LANG=C gradle -I ./gradle/support/fetchDependencies.gradle init
这样,GCC 输出就会生成英文版本,依赖于该输出的脚本也能正常运行,不会出现意外情况。
当初始化过程成功完成后(您将看到以下消息), 建立成功现在是时候建造吉德拉以及与之相关的其他部件了:gradle buildGhidra
编译完成后,您将在该目录中找到一个已准备好的 ZIP 文件。 构建/分发只需解压并运行 shell 脚本即可。 ghidraRun 位于提取出的树的根目录以启动应用程序。
在许多发行版中,开发版本(例如,本文所述时的 10.3-DEV)使用默认值 “Nimbus”界面主题如果您仍有疑虑,可以从工具的选项中轻松更改,我们稍后会看到。
在 macOS 上编译 Ghidra
在 macOS 上,该过程与 Linux 非常相似,区别在于您需要安装…… Xcode 命令行工具这些工具可以替代 GCC 和 Make 等 Gradle 在构建过程中使用的其他实用程序。
要检查是否已安装这些命令,您可以打开终端并运行以下命令。 gcc如果系统检测到工具缺失,macOS 将显示一个对话框。 下载并安装命令行工具您接受后,等待下载完成,就完成了。
利用现有工具,在 macOS 上编译 Ghidra 的方法与在 Linux 上相同:使用以下命令导航到源代码目录:cd <directorio_del_codigo_de_ghidra>
然后运行 Gradle 初始化命令来获取依赖项并配置项目:gradle -I ./gradle/support/fetchDependencies.gradle init
初始化完成后,主构建过程开始:gradle buildGhidra
当它完成并显示消息时 建立成功您的 ZIP 文件将准备就绪。 build/dist剩下的就是将软件包解压到你选择的文件夹,然后用脚本启动 Ghidra。 ghidraRun 根据您的设置,可以通过终端或双击来操作。
在 macOS 上,Ghidra 的图形界面通常采用默认设置 原生外观 它与系统非常契合,这有助于在视觉上将其整合起来,因为它不会与其他桌面应用程序发生冲突。
第一步:创建一个项目并打开代码浏览器
一旦 Ghidra 启动并运行,你需要理解的第一个概念是: 项目Ghidra 不直接操作系统文件,而是将二进制文件导入到自己的数据库中,并将您生成的所有分析、注释、数据类型、结构、标签和其他信息存储在其中。
首先,打开菜单 文件 -> 新建项目… 在 Ghidra 主窗口中,您可以选择共享项目(在服务器上共享,用于协作)或本地项目。如果您是唯一进行修改的人,那么非共享项目就足够了。
在向导中,指定项目保存的文件系统路径以及 你想给它取什么名字?确认后,您将看到项目窗口,其中包含一个空的存储库,可用于存放您的二进制文件。这种结构与数据库集合有些类似,每个导入的文件都会生成自己的一组信息。
下一步是启动名为“主要分析工具”的程序。 代码浏览器您可以通过项目窗口的“工具”菜单执行此操作(例如,“工具”->“运行工具”->“代码浏览器”),或者在导入二进制文件后将其拖到“绿色龙头”图标上。
CodeBrowser 将打开一个由多个视图组成的界面:一个显示已组装指令的主列表,以及包含多个视图的部分。 符号树和数据类型它包含一个高级反编译窗口和一个用于查看日志和消息的控制台。本质上,它是你日常使用 Ghidra 的核心。
配置 Ghidra 界面以获得舒适的工作体验
对于许多从IDA或其他工具转过来的用户来说,Ghidra给人的第一印象是界面有些不同,有时甚至略显混乱。不过,好消息是几乎所有元素都可以自定义。 调整、重新定位和自定义 从工具的选项中。
要访问 CodeBrowser 的全局设置,请使用菜单 编辑 -> 工具选项…在这里,您可以修改视觉布局(颜色、字体、显示的字段、鼠标行为)以及键盘快捷键和其他影响您日常工作流程的内部方面。
许多人最先错过的事情之一是 紧凑型导航栏这与其他反汇编器提供的功能类似。CodeBrowser 也具备此功能,但通常默认处于禁用状态。您可以点击滚动条旁边的“概览”按钮启用它,该按钮会显示二进制文件的垂直概览。
键盘快捷键是另一个关键点。默认值可能会让人困惑,而且与 Eclipse 等环境中的设置非常相似,这并不总是符合多年使用 IDA 的用户的肌肉记忆。您可以在工具选项的“按键绑定”部分进行设置。 搜索特定操作并重新分配按键 根据您的喜好(例如,C 标记代码,D 标记数据,X 标记外部引用,Esc 标记返回等)。
此外,建议在“列表显示”中调整拆卸列表的外观,以进行选择。 舒适的字体和颜色您还可以在“列表字段 -> 数组选项”中配置数组或字符串显示的最大行数等详细信息。您甚至可以指定以十六进制显示数组索引,以避免混淆。
实用视觉设置:字节、高亮显示和字段
在“列表字段”部分,Ghidra 允许您修改汇编代码周围显示的几乎所有元素:地址、字节、操作、操作数、注释、标签等等。这使您可以构建一个 更紧凑或更详细的视图,以您觉得最舒服的方式为准。
例如,如果您希望每条指令占用一行,可以转到“字节字段”并将“要显示的最大行数”值设置为 1,这样可以消除不必要的换行符。如果您觉得大写字母更易于阅读,也可以选择将字节显示为大写字母。 十六进制大写字母.
文本高亮是另一个经常让新手感到困惑的功能。默认情况下,Ghidra 使用鼠标中键来高亮显示条目、值或标签,这在许多现代鼠标上并不直观。在“光标文本高亮”设置中,您可以将“激活的鼠标按钮”选项更改为“左键”,这样…… 单击鼠标左键激活高亮显示 感觉更自然。
在函数部分,勾选“标记函数入口”和“标记函数出口”非常有用,这样可以在代码列表中直观地显示每个函数的起始和结束位置。同时,许多用户倾向于在“标签字段”中禁用“显示函数标签”,以减少每个函数头中的冗余行。 清除视图.
最后,如果您觉得水平滚动很烦人,可以取消选中“列表字段”中“鼠标”下的相应选项。这将强制使用更适合窗口宽度的布局,优先考虑…… 更自然的垂直滚动.
配置符号、数据类型和交叉引用
当你开始尝试使用 Ghidra 的符号视图和数据类型时,它的真正强大之处就会显现出来。在代码浏览器的左侧,你会找到…… “符号树”这样,您就可以轻松找到函数、导入、导出和其他关键符号,从而了解二进制文件的结构。
就在下方, “数据类型管理器” 它充当所有已知类型的集中式存储库:结构体、类型定义、枚举、游标等等。您可以从这里使用下拉菜单加载外部类型库(例如 Windows 定义),或者创建自己的类型。 反编译后的代码更容易理解。.
交叉引用(XREF)也可以进行微调。在“列表字段 -> XREF 字段”中,您可以增加显示的最大引用数量,这样当鼠标悬停在地址上时,就会显示更多相关的调用或访问记录。这在恶意软件分析中尤其有用,因为跟踪在恶意软件分析中至关重要。 使用特定 API 或函数的地方.
此外,Ghidra 还允许您使用界面中的“编辑列表字段”按钮,动态更改地址、字节和操作码列的宽度。激活后,您可以 拖动并调整每个字段的大小 自定义您的设置。退出 CodeBrowser 时,选择“保存工具”即可保存配置,确保您偏好的设计得以保留。
导入二进制文件并启动自动分析。
现在界面基本符合您的喜好,是时候导入您的第一个文件了。在项目窗口中,使用菜单 文件 -> 导入文件… 然后选择要分析的可执行文件、库或二进制文件。Ghidra 会将内容复制到其内部数据库,因此理论上您可以…… 删除原文件 从文件系统中导出,且不丢失导入的样本。
在导入过程中,该工具将尝试 自动识别格式和语言 从文件中读取。Ghidra 中的“语言”并非指人类语言,而是指处理器架构、字节序和编译器变体的组合。如果无法检测到格式或格式较为原始,您可以手动选择语言和其他一些选项。
在导入选项中,您可以决定是否加载外部库。例如,在 Windows 可执行文件中,这意味着 Ghidra 可以尝试解析并加载外部库。 依赖的 DLL 为了丰富分析内容。在其他情况下,您可能更愿意禁用该选项,以便仅关注主二进制文件。
导入完成后,Ghidra 会显示一份摘要,其中包含文件类型、平台、格式(例如,Windows 上的 PE 文件)以及一个“附加信息”部分,您可以在其中查看所有预期库是否都已正确找到,或者是否存在任何缺失。这些信息对于理解 Ghidra 至关重要。 您已加载可执行生态系统的哪些部分? 哪些没有。
导入二进制文件后,它会显示在项目窗口中。您可以双击该文件或从菜单中选择相应选项,在代码浏览器中打开它。此时,Ghidra 会询问您是否要运行自动分析或稍后执行。
探索代码浏览器:视图、树状结构和反编译
在开始分析时,吉德拉应用了一系列“分析器”或 专门负责识别代码、数据、函数和引用的任务这些分析器的默认配置在大多数情况下通常都足够用了,不过您始终可以访问选项面板,根据需要激活或停用特定模块。
随着分析的进行,您会看到指令列表不断增长,新增函数、标签和自动注释。左侧面板中的“程序树”显示了…… 文件逻辑结构 (段、节、块),而“符号树”按类别(功能、标签、命名空间等)对符号进行分组。
中间是经典的汇编器视图,您可以逐地址导航、跳转到函数、跟踪函数调用以及查看指令序列。右侧是……的视图。 反编译代码 它尝试从汇编程序重建 C(或其他高级语言)表示,这在很多情况下大大加快了对代码的理解。
控制台底部显示分析日志、警告和错误信息。通常,未分析的功能、特定分析器的问题或可疑数据结构的警告等详细信息都可以在这里找到。这里是检查所有操作是否正确执行的好地方。 运行正常 或者是否应该开展另一次局部分析。
基本导航操作通过鼠标和键盘完成:您可以跟踪调用、返回上一步、跳转到引用、重命名符号或即时定义新函数。稍加练习,您使用 CodeBrowser 的工作流程就会变得非常流畅灵活,尤其是在您将快捷键适应到自己的工作习惯之后。
脚本、Python 控制台和功能扩展
《吉德拉》不仅仅关乎视觉效果;它还带来了…… Java 和 Python 脚本集合 这些脚本可以帮助您自动执行许多常规分析任务。它们由“脚本管理器”进行管理,您可以通过相应的按钮或“窗口”菜单访问该管理器。
在脚本管理器中,您可以找到用于各种任务的脚本:从查找特定函数模式到提取字符串、生成报告、应用签名、调整数据类型或搜索。 特定编译器的典型结构您可以直接运行这些脚本,也可以根据需要进行修改,或者使用 Ghidra API 创建自己的脚本。
此外,该工具还包括 基于 Jython 的交互式 Python 控制台可通过“窗口 -> Python”访问。在该控制台中,您可以使用简单的调用来探索 Ghidra API,例如: dir()可以操作已加载的程序,创建临时自动化,或者在将代码片段集成到永久脚本之前对其进行测试。
这种脚本编写功能是许多分析师最终选择继续使用 Ghidra 的主要原因之一:它允许他们构建 高度定制化的分析流程将其与其他工具集成,可大幅减少重复性体力劳动。
签名、附加数据类型和恶意软件分析
Ghidra 开箱即用,自带丰富的数据类型和函数签名,但如果您从事 Windows 环境下的恶意软件分析,您可能会注意到: 该系统的许多特定类型都缺失了。 这对于正确理解 API 调用和内部结构至关重要。
为了弥补这一不足,社区已经产生了 扩展类型数据库 对于 Windows 系统,以及不同版本 Visual Studio(例如 VS2013)和其他编译器(例如 Delphi)的 FIDB 签名文件,这些数据库可以加载到数据类型管理器中,并用作参考,以增强对样本的分析。
集成后,您会看到反编译后的代码变得更加清晰,并且结构也以某种方式显示出来。 重要人物 而且,使用复杂 API 的函数流程也更容易理解。所有这些都促使 Ghidra 逐渐成为一个功能日益全面的专业分析平台。
显然,它还有改进的空间,某些平台仍然存在不足,但作为一个开放项目,它使得社区更容易随着时间的推移贡献更多的定义、脚本和模板,这巩固了它作为许多逆向工程实验室中心工具的地位。
考虑到以上所有因素,Ghidra正在将自己确立为一家…… 一种强大、灵活且免费的替代方案 对于任何想要获取二进制文件的人来说,无论是为了学习漏洞利用技术、练习 CTF、调查恶意软件还是审核专有软件,只要它保持最新、配置合理,并附有针对目标平台的类型和签名的良好数据库,都是可以的。
对字节世界和一般技术充满热情的作家。我喜欢通过写作分享我的知识,这就是我在这个博客中要做的,向您展示有关小工具、软件、硬件、技术趋势等的所有最有趣的事情。我的目标是帮助您以简单而有趣的方式畅游数字世界。
