在上一篇文章《玩转Ghidra主要数据显示窗口,第二篇》中,我们为读者介绍了如何查找窗口,Listing窗口及其配置方法,以及创建额外的反汇编窗口等内容。在本文中,我们将继续为读者介绍其他常用的窗口。
虽然汇编代码能够为我们提供大量的信息,但是,如果能够以图形方式展示程序的流程图的话,那么,理解代码会变得更加轻松。通过选择Window菜单中的Function Graph选项,或单击CodeBrowser工具栏中对应的图标,我们就可以打开与CodeBrowser工具栏联动的Function Graph窗口。该窗口中显示的内容看起来有点像程序流程图,因为函数会被分解成基本构造块,并以图形方式显示各个构造块之间的控制流的关系。
图1 Function Graph窗口
从上图中可以看到,Ghidra会使用不同颜色的箭头来区分函数块之间的不同类型的控制流。此外,当我们将鼠标放在它们上面时,这些箭头会以动态方式指示方向。此外,以条件跳转结束的基本构造块会产生两种可能的箭头:在默认条件下,测试条件得到满足的箭头会显示为绿色,测试条件没有得到满足的箭头,则显示为红色。另外,只有一个潜在的后续块的基本构造块,会使用普通的边(默认为蓝色)指向下一个要执行的块。我们可以通过单击箭头从一个构造块到另一个构造块。由于该窗口与代码清单窗口在默认情况下是保持同步的,因此,在代码清单窗口和该窗口之间进行切换和导航时,文件的位置通常会保持一致。
在图形模式下,Ghidra一次只显示一个函数。不过,我们可以通过传统的图像交互技术(如平移和缩放)在图形中进行导航。当遇到大型或非常复杂的函数时,图形会显得非常混乱,以至于难以导航,这时Satellite视图就可以发挥作用了。默认情况下,Satellite视图位于Function Graph窗口的右下角(见图1)。
Satellite窗口不仅会显示所有构造块的整体结构,同时,还会高亮显示一个方框,指出当前在反汇编窗口中查看的图形区域。当我们在Satellite窗口中点击一个构造块时,该构造块就会进入Function Graph窗口的中心位置。实际上,高亮显示的方框就像一个放大镜,我们可以在概览窗口周围拖动该方框,以快速将Function Graph视图重新定位到该窗口中的任意位置。
不过,由于该窗口会占用Function Graph窗口中的宝贵空间,并且可能会挡住一些重要的构造块和内容。这时,我们有两种方法解决这个问题。首先,我们可以右键单击Satellite 窗口,然后取消选中Dock Satellite View复选框。这样的话,就会把Satellite窗口及其全部功能移到Function Graph窗口之外。过后,我们只要重新选中该选项,Satellite窗口就会重新回到Function Graph窗口的原始位置。
第二种方法是隐藏Satellite 窗口,前提是您不需要使用它来导航了。为此,只需在右键上下文菜单中勾掉相应的复选框即可。隐藏Satellite窗口后,Function Graph窗口的右下角会出现一个小图标,单击该图标就会恢复Satellite View窗口。
当Satellite窗口处于可见状态时,会拖慢主视图的反应速度;隐藏Satellite窗口后,有助于提高软件的响应速度。
对于大部分窗口来说,既可以一起使用,也可以独立使用。我们已经看到了Listing窗口和Function Graph窗口是如何共享数据的,以及一个窗口中发生的事件如何影响另一个窗口。如果在Function Graph窗口中选择一个特定的构造块,相应的代码将在Listing窗口中高亮显示。相反,在Listing窗口中的函数之间进行导航会导致Function Graph窗口随之更新。也就是说,它们之间不仅存在联动效应,而且联动还是双向的。实际上,Ghidra也支持单向联动,限于篇幅,这里就不介绍了。
除了使用Satellite窗口进行导航外,我们还可以根据自己的需要,在Function Graph窗口中以多种方式对该视图进行操作。
l 平移:首先,除了使用Satellite窗口快速重新定位图形外,您还可以通过单击和拖动背景来改变图形视图的位置。
l 缩放:我们也可以使用传统的键盘方法,如CTRL/COMMAND、鼠标滚动来进行缩放。
l 构造块的重新排列:通过单击所需块的标题栏并将其拖动到新位置,可以将图形中的各个构造块拖动到新位置。移动构造块时,构造块之间的所有链接都将保留下来。如果想要恢复到图形的默认布局的话,只需选择Function Graph工具栏中的刷新图标即可。
l 构造块的分组和折叠:我们可以将构造块单独分组或与其他图构造块一起分组,此外,我们还可以对构造块进行折叠,以便让界面看起来更加清爽。需要注意的是,分组也会导致构造块发生折叠。为了对构造块进行折叠,您可以通过选择构造块工具栏最右侧的分组图标来完成该操作。如果您在选择此选项时选择了多个构造块,它们都将被折叠起来,相关构造块的清单将显示在堆叠窗口中。
为了便于进行分析,Ghidra在Function Graph窗口中的每个节点顶部都提供了一个菜单栏,用于控制该特定节点的显示方式。您可以控制节点的背景/文本颜色,跳转到XREF,查看图形节点的完整窗口列表,并使用分组功能来合并和折叠节点。需要注意的是,在Function Graph窗口中改变构造块的背景也会改变Listing窗口中的背景。
由于基于图形的显示窗口是在CodeBrowser外部的窗口中打开的,所以,我们可以并排查看两个显示窗口。因为这两个窗口是联动的,改变其中一个窗口的位置,就会移动另一个窗口中的位置标记。也就是说,当我们在显示程序控制流程时,我们不仅可以做选择题,也可两者都要。此外,请记住,对图形和文本视图的控制方式,这里介绍的只是冰水一角,更多的方式,还有待于读者自己去挖掘。
现在,我们开始介绍Program Trees窗口,该窗口如图2所示。
图2 Program Trees窗口
该窗口将以文件夹和片段的形式来显示程序,以便在自动分析过程中更好的组织程序。片段是Ghidra术语,指的是连续的地址范围。需要注意的是,片段不得相互重叠。实际上,片段更传统的名称是程序段(例如,.text、.data和.bss段)。下面是与程序树相关的操作,其中包括:
l 创建文件夹/片段
l 展开/折叠/合并文件夹
l 添加/删除文件夹/片段
l 识别列表窗口中的内容,并移动到一个片段
l 按姓名/地址排序
l 选择地址
l 复制/剪切/粘贴片段/文件夹
l 重新排列文件夹
Program Trees窗口是一个联动窗口,因此,点击窗口中的一个片段可以导航到Listing窗口中对应的位置。更多关于Program Trees窗口的信息,请参考Ghidra的帮助信息。
在本文中,我们为读者介绍了Function Graph窗口,卫星导航功能,窗口联动,显示方式的自定义,以及Program Trees窗口。在下一篇文章中,我们将继续为读者介绍其他常用的窗口方面的知识。
本文作者:mssp299
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/148311.html