玩转Ghidra主要数据显示窗口,第二篇

2020-09-16 9,539

在上一篇文章中,我们详细考察了CodeBrowser窗口的菜单。在本文中,我们将继续为读者介绍CodeBrowser窗口的子窗口方面的知识。

查找指定的窗口

由于Ghidra提供的窗口数量较多,如果您打开了众多的窗口,后面打开的窗口可能会盖住之前的窗口,这时寻找我们所需的窗口就需要一定的技巧了。不过,Ghidra提供了专门的功能来帮助我们找到那些“丢失”的窗口。实际上,最简单的方法就是点击相关的工具栏图标或菜单项,这时选定的窗口就会移动到前面;如果继续点击该窗口的工具栏图标,这些窗口就会通过震动、改变字体大小或颜色、缩放、旋转以及其他动作来吸引你的注意力,从而顺利找到它们。

Listing窗口

该窗口也被称为反汇编窗口,主要用于查看、操作和分析Ghidra生成的反汇编代码。该窗口不仅显示了目标程序的反汇编代码清单,还提供了查看二进制数据区域的主要方法。

 

1显示的是calc.exeCodeBrowser窗口的默认配置。Listing窗口左边的空白处提供了文件的重要信息以及我们当前在文件中的位置。Listing窗口的右侧(紧靠垂直滚动条的右侧)有一个额外的标记区域,也提供了重要的信息和导航功能。滚动条用于表示您在文件中的位置,可用于导航。在滚动条的右侧是一些相关信息,包括书签,以便提供更多的信息。

 

image.png

加载了calc.exe后的默认CodeBrowser窗口

常用工具栏

在文件经过自动分析后,我们就可以借助于相关的工具栏来进行导航和进一步分析了。在默认情况下,只会显示Navigation栏。我们可以使用Listing窗口右上方的Toggle Overview Margin工具按钮,添加(或隐藏)Overview栏和Entropy栏(见图2)。无论显示哪种工具栏,它们左边都会有一个导航标记,指出我们当前在文件中的位置。左键单击任何工具栏中的任何位置,都会将您移动到文件中相应的位置,并更新Listing窗口的内容。

image.png

2  Listing窗口的工具按钮

 

现在您知道了如何控制各栏的显示(和隐藏),让我们研究一下各栏显示的内容,以及如何在逆向分析过程中使用它。

 

Navigation Marker(导航标记)区域:它不仅可以用于在文件中进行移动,同时,它还提供了另一个非常重要的功能:如果你右击导航标记区域,就可以看到可以与当前文件相关联的标记和书签的类别。通过选择和取消标记类型,就可以控制导航栏中显示的内容了。这非常便于在特定类型的标记(如高亮)中进行导航。

 

Overview(概览)栏:为您提供有关文件内容的重要视觉信息。概览栏中的水平带代表程序的颜色编码区域。虽然Ghidra提供了与函数、外部引用、数据和指令等常见类别相关的默认颜色,但您可以通过Edit菜单中的Tool Options选项来控制颜色方案。在默认情况下,如果您将鼠标悬停在一个区域上,就可以查看该区域的详细信息,包括区域类型和相关地址。

 

Entropy(熵)栏:它提供了一个独特的Ghidra功能:它根据周围的文件内容来“刻画”文件内容。如果一个区域内的变化非常小,则赋予它一个低熵值。如果随机性很高,相应的熵值就会很高。将鼠标悬停在Entropy栏中的水平带上,它将给出具体的熵值(介于0.08.0之间)、类型(例如.text)以及文件中的相关地址。

 

上面,我们介绍了Listing窗口特有的工具按钮。在图3中,展示的是展开并放大了Listing窗口。我们可以看到,反汇编代码是以线性方式呈现的,在默认情况下,最左边一列将用于显示虚拟地址。

 

image.png

3  Listing窗口

 

Listing窗口中,最左边的灰色带是页边标记。它用来指示我们在文件中的当前位置,包括点标记和区域标记,这些概念的详细介绍请参考Ghidra的帮助菜单。就本例来说,当前文件位置(14000104c)在页边标记中用黑色小箭头表示。

 

紧靠页边标记右边的区域以箭头形式来描述函数内的非线性控制流。当控制流指令的源地址或目标地址在Listing窗口中可见时,会显示相关的控制流箭头。实线箭头代表无条件跳转,而虚线箭头代表有条件跳转。将鼠标悬停在控制流线条上会打开一个工具提示,显示控制流的开始和结束地址以及控制流的类型。当一个跳转(有条件的或无条件的)将控制权转移到程序中之前的地址时,它通常表示为一个循环。通过双击相关的控制流箭头,可以很容易地导航到任何跳转的源地址或目标地址。

 

4顶部显示了Ghidra关于函数的栈帧布局的最佳估计。Ghidra通过对堆栈指针和函数中使用的任何堆栈框架指针的行为进行详细分析,推断出函数的栈帧(局部变量)。堆栈数据的显示方法将在后续文章中加以介绍。

 

image.png

4 函数栈帧布局

 

此外,代码清单中通常会有许多数据和代码交叉引用,用XREF表示,见图4右侧。实际上,只要反汇编中的一个位置指向反汇编中的另一个位置,就会产生交叉引用。例如,如果地址A处的指令跳转到地址B处的指令,将导致一个从AB的交叉引用。在引用地址上悬停会弹出一个引用窗口。引用的弹出式窗口的布局与Listing窗口相同,但背景为黄色(类似于工具提示的弹出式窗口)。弹出窗口虽然可以查看内容,却无法跟踪引用。

创建额外的反汇编窗口

如果你发现自己想同时查看两个函数的代码清单,你只需要使用Listing窗口工具栏中的快照图标(见图2)打开另一个反汇编窗口即可。打开的第一个反汇编窗口在文件名前的前缀为Listing:。所有后续的反汇编窗口的标题都是[Listing: <filename>],以表示它们与主显示窗口并没有关联在一起。也就是说,快照是独立的,所以,我们可以在其中自由浏览,而不影响其他窗口。

 

配置Listing窗口

反汇编代码清单实际上可以分成多个组件字段,诸如助记字段、地址字段和注释字段等等。到目前为止,我们看到的清单是由一组提供文件的重要信息的默认字段组成的。但是,有时默认视图并不会提供您希望看到的信息。这时,我们可以求助于Browser Field Formatter(浏览字段格式化器)。

 

通过Browser Field Formatter,我们可以自定义30多个字段,以确保您能够控制Listing窗口的最终外观。您可以通过单击Listing工具栏中的相关按钮来激活Browser Field Formatter(参见图2)。这时,将在Listing窗口顶部打开一个功能强大的子菜单和布局编辑器,具体如图5所示。通过Browser Field Formatter,我们可以控制地址中断、注释、函数、变量、指令、数据、结构体和数组的外观,以创建完美的清单格式。

image.png

5 激活Browser Field Formatter后的Listing窗口

 

小结

在本文中,我们为读者介绍了如何查找窗口,Listing窗口及其配置方法,以及创建额外的反汇编窗口等内容。在下一篇文章中,我们将继续为读者介绍其他常用的窗口方面的知识。

 


本文作者:mssp299

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/140989.html

Tags:
评论  (0)
快来写下你的想法吧!

mssp299

文章数:51 积分: 662

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号