面向恶意软件研究人员的Ghidra脚本开发指南

将Eclipse IDE集成到Ghidra

安装步骤:

·安装Eclipse

·浏览https://www.eclipse.org/downloads/packages/,并下载面向C / C ++开发人员的Eclipse IDE。

·解压下载

·安装PyDev

·要确认已安装PyDev,请选择Window-> Perspective-> Open Perspective-> Other,选择PyDev并单击Open。

·安装GhidraDev:GhidraDev支持在Eclipse中开发脚本和模块

·浏览至Help->Install New Software

·单击Add按钮,然后单击Archive

·浏览Ghidra目录,选择GhidraDev-2.xxzip。

·单击 OK -> Check Ghidra类别

·单击下一步->下一步->完成

·确保单击Install anyway,然后单击Restart Now。

·下一步是配置Ghidra的安装位置。

·浏览GhidraDev-> Ghidra Installations。

·单击Add按钮并导航到Ghidra的安装位置,然后单击Apply并Close。

为确保所有设置均正确无误,请执行以下操作:

·打开Ghidra,然后打开代码浏览器窗口,导航到Script Manager Window->Script Manager,或单击图标栏上的绿色播放按钮。

·接下来,选择AddCommentToProgramScriptPy.py并点击窗口右上角的Eclipse按钮。

·在Eclipse应用程序中会打开一个窗口,用于创建New Ghidra Project。

·单击下一步->下一步并启用Ghidra附带的Jython解释器,然后单击完成。

完成此操作后,您将能够查看刚刚打开的python脚本。

在左侧窗格中,单击GhidraScripts展开按钮以查看已安装的Ghidra脚本:

Ghidra的API

Ghidra API的优点之一是它对Java和Python都一样,因此您可以使用Scripts Manager中的Java脚本作为指南,以了解如何使用函数以及如何调用函数来让你的脚本工作。例如,在Eclipse中打开ShowCCallsScript.java。

让我们以该文件为例,研究如何剖析Ghidra的API。

打开Ghidra的代码浏览器,然后选择Window-> Python。在Ghidra的代码浏览器中进入解释器后,在这个脚本中currentProgram会返回一个包含程序哈希的对象。

我了解Ghidra API的方法是在python解释器中使用help的命令。键入help(currentProgram)以显示调用的功能。Ghidra的API文档非常有用。

让我们更深入地了解有关API的更多信息。键入相同的命令,但添加一个.并单击tab currentProgram。这使您可以查看可以在当前程序中调用的内容。您可以看到currentProgram.getListing(),但让我们选择其他内容以了解其工作原理。

我将选择一个SHA256哈希,如下面的屏幕截图所示。尝试按up按钮,然后选择您感兴趣的内容。

我将给出的关于Ghidra API的最后一个示例,是如何在使用脚本时获取用户输入。该askBytes()函数有两个参数。第一个参数是弹出框的标题,第二个参数是显示在输入字段旁边的消息。我经常使用自己编写的askBytes()插件,因为当我需要添加一些东西时,这会非常方便。我将在下一部分中对此进行演示。

上有许多资源展示有关如何使用Ghidra API的示例。在本节的最后一部分,我将介绍一些我常用的Ghidra API method。

·currentProgram.getExecutablePath():收集有关项目中当前程序的信息

·currentProgram.getName():返回已加载程序的名称

·currentProgram.getMemory().getBlocks():返回包含给定范围内任何地址的所有内存块的列表

·getFirstFunction():检索已加载的二进制文件中的第一个函数

·currentProgram.getFunctionManager():管理程序中的所有函数

·getGlobalFunctions(String Name):返回具有给定名称的全局名称空间中所有函数的列表

·DirectedGraph():创建各种图形结构,包括方向图等

·DecompInterface():单个反编译进程的自包含接口,适用于单个程序的不限数量的函数反编译。我强烈建议您查看API文档以对此进行更深入的研究。

构建Ghidra脚本

在我从事逆向工程的早期,有一位导师给了我一个建议,那就是对于任何你发现自己做过三遍的任务,都必须找出一种使之自动化的方法。从那以后,他与我共享的东西就一直困扰着我。在导师提出建议之后,我一直习惯于构建脚本来帮助我完成日常的任务。在本节中,我们将构建一些简单但有用的脚本,这些脚本将有助于进行逆向工程时的日常任务。

添加到现有脚本

对于该示例,您将需要安装binwalk工具并确保它位于$path中。对于Ubuntu,请使用apt-get install binwalk;对于Mac用户,请使用sudo port install binwalk(对于MacPorts)或brew install binwalk(对于Homebrew);Windows用户应单击此链接以获取更多说明。

浏览github上的binwalk插件repo并下载或复制文本,然后将其添加到您的Python scripts文件夹/GhidraScripts/Ghidra Python Scripts。下载随机固件二进制文件。如果您不知道将固件下载到哪里,则简单的 络搜索“固件下载”将返回许多选项。

加载所选的已下载的固件,接着打开代码浏览器,然后打开脚本并查找binwalk.py并运行脚本。

如果您查看该脚本,子进程调用将运行-c开关(将结果记录为CSV格式)和-f开关(将结果记录到文件)。如下图所示,这个有用的脚本用类别名称“binwalk”、描述和位置来为它找到的东西添加书签。

下面的屏幕快照是一个弹出窗口,用于输入开关-e,该开关提取在固件映像中找到的所有文件。接下来要做的就是将其指向文件所在的目录,并将所有文件保存到该文件夹中。

探索现有的Ghidra脚本

让我们从文件夹结构开始:

·JUnit4是一个开放源代码单元测试框架,用于用Java编写可重复的测试。

·JRE System Library是创建Java项目后会自动添加的文件夹。

·Referenced Libraries是与Ghidra关联的库

·Ghidra是Ghidra安装的位置

·Ghidra * scripts,在这里您可以找到现有脚本的集合,这里有超过100个脚本,其中许多脚本非常有用。因此如上所述,在花时间编写内容之前,请先查看此处的内容避免浪费时间!

最后一个是创建一个Ghidra Module Project,该项目从Ghidra Module模板收集代码并将其添加到您新创建的模块中。

让我们编写一个完整的Ghidra脚本

说到这里,查看您的Ghidra Python Scripts文件夹,右键单击该文件夹,创建一个文件并将其命名os_command.py。

脚本的元数据对于脚本的最终用户很重要,因此我们要添加的第一件事是在python脚本的开头添加一些行。

第一行是将添加有关如何使用脚本的元数据注释的地方,这将使最终用户可以通过在“脚本管理器”窗口中单击脚本来阅读注释。

第三行是类别,它可以让您在脚本管理器窗口中设置脚本将要的保存位置。

menupath是脚本的顶级路径菜单,要添加的最后一个选项是工具栏,它允许您可以为脚本创建图标。该图像将作为启动脚本的按钮出现在工具栏上。

下一步是编写要创建的脚本,我们要为该脚本编写一个在本地运行的命令。在反向恶意软件时,我通常会在找到的域和IP地址上运行whois。以下屏幕截图展示了带有注释的代码,以便您可以理解每一行的用途。

保存此代码后,如果查看到Ghidra中的“脚本管理器”窗口,则将看到该os_command.py文件,并显示您在第1-6行中提供的元数据信息。

要使用该脚本,请输入您选择的OS命令,Ghidra脚本将运行它并在控制台窗口中输出结果。

前5的Ghidra脚本

这是一个简短的介绍,可帮助您开始使用Ghidra脚本编写非常有用的东西!

就像我在上面说的那样,自动化实际上是成为一名更有效和更具生产力的恶意软件分析师的关键,而Ghidra脚本编写是您的工具库中必不可少的工具。

通过上面的内容,我们还了解到Ghidra安装中默认提供了许多脚本,这意味着您不必从头开始开发所有内容,您可以从提供的脚本中学习。

最后,我想以使用Ghidra进行恶意软件研究的最佳脚本结尾。毫无疑问,您会发现它们就如我说的一样非常有用:

1.VTGrep:https://github.com/SentineLabs/VTgrepGHIDRA

此插件将VirusTotal Web服务的功能集成到GHIDRA的用户界面中。当前版本为v0.1,此插件尚未投入生产,并且不排除发生意外的情况。此版本将VTGrep集成到GHIDRA中,便于搜索类似的代码、字符串或字节序列。您可以观看视频(https://assets.sentinelone.com/ghidra/GHIDRA?lb-mode=overlay&lb-width=100%25&lb-height=100%25)了解如何使用VTGrep。

2.Binwalk:https://github.com/ghidraninja/ghidra_scripts/blob/master/binwalk.py

在当前程序上运行binwalk并将结果标记为书签。要求binwalk位于$ PATH中。

3.Yara:https://github.com/0x6d696368/ghidra_scripts/blob/master/YaraSearch.py

此Ghidra脚本提供了YARA搜索,它将在每次匹配前放置一个PRE_COMMENT,并未为每次匹配设置书签。

4.Golang Renamer:https://github.com/ghidraninja/ghidra_scripts/blob/master/golang_renamer.py

从剥离的Go二进制文件中还原函数名称。

5.Daenerys:https://github.com/daenerys-sre/source

Daenerys是一个互操作框架,它允许您运行Ghidra下的IDAPython脚本和IDA Pro下的Ghidra脚本,几乎不需要做任何修改。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年2月11日
下一篇 2021年2月11日

相关推荐