Ghidra是市场上最受欢迎的软件逆向工程套件之一,但它总是需要针对不同情况添加或自定义功能。幸运的是,Ghidra的脚本编写功能非常强大,能够让用户在分析程序时解决特殊的问题。例如,SentinelOne的VTgrep是一种自定义的Ghidra脚本编写工具,它对逆向工程恶意软件产生了巨大影响。在本文中,我们将介绍如何安装GhidraDev,Ghidra的API,Building Scripts和我最重要的5个Ghidra脚本。
将Eclipse IDE集成到Ghidra
使用Ghidra编写脚本时,用于编辑或创建脚本的逻辑选择是Eclipse IDE。尽管Ghidra预先安装了基本脚本编辑器,修改现有脚本是很好也很方便的操作,但是Ghidra与Eclipse IDE的集成非常适合开发和更复杂的编辑任务,因为Ghidra在Eclipse环境中有插件。在本节中,我们将介绍如何安装Eclipse并使其为编写脚本做好准备。
安装步骤:
· 安装Eclipse
· 浏览https://www.eclipse.org/downloads/packages/,并下载面向C / C ++开发人员的Eclipse IDE。
· 解压下载
· 安装PyDev
· 要使用Eclipse更新管理器安装PyDev扩展,请选择Help >Install New Software,然后在Work with部分中输入以下链接:http://www.pydev.org/updates。
· 要确认已安装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文件添加到Ghidra Python脚本文件夹中,然后打开Eclipse IDE->Ghidra Python scripts->binwalk.py。
加载所选的已下载的固件,接着打开代码浏览器,然后打开脚本并查找binwalk.py并运行脚本。
如果您查看该脚本,子进程调用将运行-c开关(将结果记录为CSV格式)和-f开关(将结果记录到文件)。如下图所示,这个有用的脚本用类别名称“binwalk”、描述和位置来为它找到的东西添加书签。
接下来,我们将创建一个函数,该函数允许逆向工程师为binwalk指定一个开关以读取和执行输入。除了编写代码,我还会向您展示屏幕截图,这样您根据在本文中所阅读的内容,就应该能够独立完成脚本而无需我的帮助了。
下面的屏幕快照是一个弹出窗口,用于输入开关-e,该开关提取在固件映像中找到的所有文件。接下来要做的就是将其指向文件所在的目录,并将所有文件保存到该文件夹中。
探索现有的Ghidra脚本
太棒了!我们已经看到,添加和编辑脚本很容易就能做到了,但是Ghidra中已经包含了许多有用的脚本。没有人愿意浪费时间进行这个无谓的重复工作,所以让我们看看有没有什么可以利用的。
让我们从文件夹结构开始:
· JUnit4是一个开放源代码单元测试框架,用于用Java编写可重复的测试。
· JRE System Library是创建Java项目后会自动添加的文件夹。
· Referenced Libraries是与Ghidra关联的库
· Ghidra是Ghidra安装的位置
· Ghidra * scripts,在这里您可以找到现有脚本的集合,这里有超过100个脚本,其中许多脚本非常有用。因此如上所述,在花时间编写内容之前,请先查看此处的内容避免浪费时间!
我觉得这个过程很重要,目前我也是这么做的,但是如果要创建新脚本,我通常只是到Ghidra Python scripts文件夹创建一个python文件,或者可以转到GhidraDev-> New-> Ghidra脚本,它允许您输入脚本名称,脚本类型,脚本作者,脚本类别和脚本描述。创建Ghidra脚本项目可以输入项目名称、选择项目根目录并创建运行配置。如果要创建多个脚本,此功能很有用。
最后一个是创建一个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脚本,几乎不需要做任何修改。
本文翻译自:https://labs.sentinelone.com/a-guide-to-ghidra-scripting-development-for-malware-researchers/如若转载,请注明原文地址: