前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开源Ghidra逆向工程的百宝书来了

开源Ghidra逆向工程的百宝书来了

作者头像
博文视点Broadview
发布2023-04-04 10:10:46
1.8K0
发布2023-04-04 10:10:46
举报
文章被收录于专栏:博文视点Broadview

👆点击“博文视点Broadview”,获取更多书讯

Ghidra 第一次出现在公众视野是在 2017 年 3 月,当时维基解密开始泄露 Vault 7 文档,这是美国中央情报局(CIA)最大的机密文件泄漏事件,该文档包括各种秘密网络武器和间谍技术。其中,Vault 7 的第一部分包括恶意软件库、0day 武器化攻击,以及如何控制苹果的 iPhone、谷歌的 Android和微软的 Windows 设备。和 Ghidra 相关的内容就位于这一部分,包括最新版本的软件和安装使用手册。

很难说是不是当年的泄露事件导致了这一开源行为,但对于广大逆向工程师来说,确实获得了一个功能强大且免费的工具。没有哪个逆向工具是完美的,它们都有各自的优缺点,并且在竞争中相互取长补短。软件逆向工程工具本就不多,特别是在软件静态分析工具方面,Ghidra 是少数能与 IDA Pro 比肩的软件。

即使你已经掌握了 IDA Pro、Binary Ninja 或者 Radare2,也可以从 Ghidra 中受益。

Ghidra 的主要优势有:

  • 开源且免费(这意味着有无限可能)
  • 支持众多的处理器架构
  • 允许在同一个项目中加载多个二进制文件,并同时进行相关操作
  • 拥有设计强大且良好的 API,方便开发自动化工具
  • 支持团队协作模式
  • 支持版本跟踪和匹配

如果你是一位有有经验的 IDA Pro 用户,并且对使用 Ghidra 感兴趣,无论是出于好奇还是准备长期使用,,强烈推荐你阅读这本Chris Eagle的新书, 作者是一位经验丰富的逆向工程专家,早在十年前就出版了《IDA Pro 权威指南》一书,到今天依然非常受欢迎。如今他的新作《Ghidra权威指南》中文版本也已经上市,这两本书的结构大体相似,但在具体细节上有诸多不同,如果你已经熟练掌握了 IDA Pro,那么切换到 Ghidra 也相当容易。甚至可以将它们结合起来使用,在一个工具中集成另一个工具的能力——已有研究表明结合多个反汇编程序可以明显地提升函数识别率。

本文旨在将 IDA 术语和用法映射到 Ghidra中的类似功能,而不提供 Ghidra 功能的具体说明。对于这里提到的任何 Ghidra 功能的具体用法,我们不试图比较这两个工具的性能,也不会争论哪个工具更优越。我们选择使用哪个工具可能是出于价格考虑,或者出于某个工具提供的特殊功能。接下来,我们将从 IDA 用户的角度对本书的主题做简单介绍。

基础知识

数据库的创建

当 IDA 将二进制文件导入数据库时,这个操作本质上是单用户的,而 Ghidra 是面向项目的,每个项目可以包含多个文件,并且支持多个用户在同一个项目上进行协作式逆向。IDA 数据库的概念最接近于 Ghidra 项目中的单个程序(program)。Ghidra 用户界面分为两个主要部分:项目(Project)和 CodeBrowser。

你与 Ghidra 的第一次交互是创建项目(共享或非共享),并通过项目窗口将程序(即二进制文件)导入这些项目中。而当使用 IDA 打开新二进制文件,并最终创建新数据库时,你和 IDA 进行了以下操作:

(1)(IDA)查询每个可用的加载器,了解哪些加载器能识别新选择的文件。

(2)(IDA)显示加载文件对话框,列出可接受的加载器、处理器模块和分析选项。

(3)(用户)选择用于将文件内容加载到新数据库的加载器模块,或接受 IDA 的默认选择。

(4)(用户)选择对数据库内容进行反汇编时应使用的处理器模块,或接受 IDA 的默认选择(可能是由加载器模块决定的)。

(5)(用户)选择创建初始数据库时应使用的任何分析选项,或接受 IDA 的默认选择。此时你也可以完全禁用分析。

(6)(用户)单击“OK”按钮来确认你的选择。

(7)(IDA)所选择的加载器模块将从原始文件中提取字节内容填充到数据库中。IDA 加载器通常不会将整个文件加载到数据库中,并且通常也不可能根据新数据库中的内容重新创建原始文件。

(8)(IDA)如果启用了分析,则使用选定的处理器模块来反汇编由加载器和任何选定的分析器(IDA 称分析器为内核选项)识别的代码。

(9)(IDA)将生成的数据库显示在 IDA 用户界面上。


Ghidra 对列出的每个步骤都有类似的方法,但该过程被分成两个不同的阶段:导入和分析。Ghidra的导入过程通常从项目窗口开始,包括以下步骤:

(1)(Ghidra)查询每个可用的加载器,了解哪些加载器能识别新选择的文件。

(2)(Ghidra)显示导入对话框,列出可接受的格式(大致是加载器)和语言(大致是加载器模块)。

(3)(用户)选择将文件导入当前项目的格式,或接受 Ghidra 的默认选择。

(4)(用户)选择程序的反汇编语言,或接受 Ghidra 的默认选择。

(5)(用户)单击“OK”按钮来确认你的选择。

(6)(Ghidra)与所选格式相关的加载器将从原始文件中提取字节内容,并加载到当前项目的一个新程序中。加载器将创建程序节、处理二进制符号和导入导出表,但不进行涉及反汇编代码的分析。Ghidra 加载器通常会将整个文件加载到项目中,尽管文件的某些部分可能不会被 CodeBrowser显示出来。

虽然该过程类似于IDA数据库的创建,但缺少一些步骤。在Ghidra中,分析行为是在CodeBrowser中进行的。当你成功导入文件之后,在项目视图中双击该文件,就会在 Ghidra 的 CodeBrowser 中将其打开。首次打开一个文件时,Ghidra 会执行以下步骤:

(1)(Ghidra)打开 CodeBrowser 并显示导入过程的结果,询问是否要分析该文件。

(2)(用户)决定是否分析该文件,如果选择不分析,则直接进入 CodeBrowser 中,你可以随时选择 Analysis→Auto Analyze 来分析该文件。无论哪种情况,当决定分析文件时,Ghidra 都会显示与当前文件格式和语言设置兼容的分析器列表,你可以选择要运行的分析器,并修改分析器使用的任何选项,然后让 Ghidra 执行其初始分析。

(3)(Ghidra)执行所有选定的分析器,并将用户的关注点置于 CodeBrowser,以开始使用完全分析过的程序。

有关导入和分析阶段的更多信息,请参阅本书的相关章节。除了共享的 Lumina 数据库,IDA 既没有类似的项目视图,也没有任何协作逆向的功能。我们在第 4 章中介绍了项目视图,在第 11 章中介绍了共享项目和协作逆向工程的支持情况。CodeBrowser 也在第 4 章中,并从第 5 章开始进行更深入的介绍。CodeBrowser 是 Ghidra 的一个工具,也是你分析程序的主要界面。因此,它是与 IDA 用户界面最相似的 Ghidra 组件,所以我们会花些时间将 IDA 用户界面的各种元素与 CodeBrowser 对应起来。

窗口和导航基础知识

清单视图

CodeBrowser 的中心是 Ghidra 的清单窗口,它提供了类似 IDA 文本模式的经典反汇编视图。要想自定义清单的格式,浏览器字段格式化器允许你修改、重新排列和删除单个清单元素。与 IDA 一样,清单窗口中的导航主要是通过双击标签(IDA 名称)来完成的,这将导航到与标签相关联的地址。右击将获得上下文敏感的菜单,可访问与标签相关的常见操作,包括重命名和重新输入。

与 IDA 类似,清单中的每个函数都有一个头部注释,列出了函数的原型,提供了函数局部变量的摘要,并显示了针对该函数的交叉引用。IDA 栈视图在 Ghidra 中的等效物,只有通过右击函数头部并选择 Function→Edit Stack Frame 才能访问。IDA 会将(如寄存器名称或指令助记符)所有出现你所单击的字符串高亮显示,但该行为在Ghidra 中默认关闭。要启用这一行为,可以选择 Edit→Tool Options→Listing Fields→Cursor TextHighlight,并将 Mouse Button to Active 选项从 MIDDLE 更改为 LEFT。另一个让人喜欢/讨厌的功能是 Markup Register Variable References,它会使 Ghidra 自动重命名用于保存函数传入参数的寄存器。要禁用此行为,让 Ghidra 使用寄存器名称指示操作数,可以选择 Edit→Tool Options→Listing Fields→Operands Fields,然后取消选择 Markup Register Variable References。

最后,如果你已经对使用 IDA 的热键序列产生了肌肉记忆,并希望 Ghidra 也能适配这些记忆,可以花一些时间在 Edit→Tool Options→Key Bindings 中,将 Ghidra 的默认热键重新分配成类似 IDA的热键。对于 IDA 用户来说,这是一个很常见的任务,以至于已经有人做出了第三方的绑定文件,以自动重新分配你喜欢的所有热键序列。

图形视图

Ghidra 的清单窗口是纯文本视图。如果喜欢在 IDA 的图形视图中工作,需要在 Ghidra 中打开一个单独的函数图窗口。与 IDA 的图形视图一样,Ghidra 的函数图窗口在任何时候都只显示单个函数,并且你可以像在清单窗口中一样操纵函数图窗口中的项目。默认情况下,Ghidra 的图形布局算法可能会将边放在基本块节点的后面,这可能使我们对边的跟随变得更加困难。你可以访问 Edit→Tool Options→Function Graph→Nested Code Layout,并勾选Route Edges Around Vertices 来禁用这种行为。

反汇编器

Ghidra 包含对所有支持的处理器进行反汇编的功能。默认情况下,反编译器窗口出现在清单窗口的右侧,只要光标位于清单视图中的一个函数内,就会显示反编译的 C 源代码。如果你想在生成的 C 源代码中添加和查看行尾注释,则需要在 Edit→Tool Options→Decompiler→Display 中通过选择Display EOL Comments 来启用。在同一个选项卡上,你还会发现 Disable printing of type casts 选项,在某些情况下,关闭它可以极大地简化生成的代码,从而提高可读性。反编译器也有积极优化生成代码的倾向。如果你在阅读一个函数的反汇编版本时,觉得反编译版本中缺少了部分行为,那么就说明反编译器可能已经消除了它认为的函数中的死代码。要在反编译器窗口中显示这些代码,可以打开菜单 Edit→Tool Options→Decompiler→Analysis,并取消选择Eliminate dead code。我们在第 19 章中进一步讨论了反编译器。

符号树

CodeBrowser 的符号树窗口提供了程序中包含的所有符号的分层视图。符号树包含六个顶层文件夹,代表程序中可能存在的六类符号。单击任何符号树文件夹中的名称,将在清单窗口中导航到相应地址:

  • Imports:该文件夹与动态链接的二进制文件相关,提供了由程序引用的外部函数和库的列表。与它最接近的是 IDA 中的 Imports 选项卡。
  • Exports:该文件夹列出了程序中任何在程序外公开可见的符号。文件夹中的符号通常与 nm工具所输出的符号相似。
  • Functions:该文件夹包含程序清单中每个函数的条目。
  • Labels:该文件夹包含程序中任何其他的非局部标签的条目。
  • Classes:该文件夹包含任何 C++类的名称,Ghidra 已经为其找到了运行时类型标识(RTTI)。
  • Namespaces:该文件夹包含 Ghidra 在程序分析期间创建的每个命名空间的条目。有关 Ghidra命名空间的更多信息,请参阅 Ghidra 帮助文档。

数据类型管理器

数据类型管理器维护着 Ghidra 关于数据结构和函数原型的所有信息。数据类型管理器中的每个文件夹大致相当于 IDA 的类型库(.til),提供了 IDA 中 Structures、Enums、Local Types 和 Type Libraries窗口的作用,在第 8 章中进行了详细讨论。

脚本支持

Ghidra 是用 Java 实现的,其原生脚本语言就是 Java。除了常规脚本,Ghidra 的主要 Java 扩展还包括分析器、插件和加载器。Ghidra 的分析器和插件共同承担了 IDA 插件的作用,而 Ghidra 加载器的作用与 IDA 加载器基本相同。Ghidra 支持处理器模块的概念,但是,Ghidra 处理器是用一种称为SLEIGH 的规范语言来定义的。

Ghidra 包含一个用于常规脚本任务的基础脚本编译器,以及一个 Eclipse 插件,以方便创建更复杂的 Ghidra 脚本和扩展。另外,还通过 Jython 来支持 Python 的使用。Ghidra API 是以类的层次结构来实现的,它将二进制文件的特性表示为 Java 对象,并提供了快捷类,以方便访问一些最常用的 API类。Ghidra 脚本在第 14 章和 15 章中讨论,扩展在第 15 章、17 章和 18 章中讨论。

小结

Ghidra 的功能与 IDA 十分相似,在某些情况下,Ghidra 的显示方式与 IDA 也十分相似,唯一需要适应的是新的热键、工具按钮和菜单。在其他情况下,由于信息的呈现方式与 IDA 不同,学习曲线可能会比较陡峭。无论如何,不管你是利用 Ghidra 的定制功能使其像 IDA 一样使用,还是花时间熟悉新的工作方式,都会发现 Ghidra 能够满足大部分的逆向工程需求,甚至在某些方面还能开启全新的工作方式。

作者编写本书的目的是将 Ghidra 介绍给现在和未来的逆向工程师。在熟练的逆向工程师手中,Ghidra 简化了分析过程,并允许用户自定义和扩展其功能,以满足个人需求并改进工作流程。新手逆向工程师使用 Ghidra 也很容易,特别是它包含的反编译器可以帮助他们在开始探索二进制分析领域时更清楚地理解高级语言和反汇编清单之间的关系。

这本书是第一本关于 Ghidra 的综合性书籍,旨在成为用户使用 Ghidra 进行逆向工程的百宝书。它提供介绍性内容以将新的探索者带入逆向工程世界,提供高级内容以扩展经验丰富的逆向工程师的世界观,并为新手和资深 Ghidra 开发者提供示例,以便他们可以继续扩展 Ghidra 的功能并成为Ghidra 社区的贡献者。

发布:刘恩惠

审核:陈歆懿

代码语言:javascript
复制
如果喜欢本文欢迎 在看丨留言丨分享至朋友圈 三连

▼点击阅读原文,了解本书详情~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博文视点Broadview 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Prowork 团队协同
ProWork 团队协同(以下简称 ProWork )是便捷高效的协同平台,为团队中的不同角色提供支持。团队成员可以通过日历、清单来规划每⽇的工作,同时管理者也可以通过统计报表随时掌握团队状况。ProWork 摒弃了僵化的流程,通过灵活轻量的任务管理体系,满足不同团队的实际情况,目前 ProWork 所有功能均可免费使用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档