原文链接:https://malwology.com/2018/08/24/python-for-malware-analysis-getting-started/
翻译:看雪翻译小组 wanrin
引子
提高你的Python编程技能很可能在你想要做的事的列表上——就像清理你的衣柜,粉刷墙壁,或者拧紧那个松动的螺丝(你知道我说的是哪个)。
一般来说,脚本编写是跨越大多数安全主题的有用技能。编写脚本可以帮助您自动化一个琐碎的任务,将分析扩展到大量数据,并且可以分享您的工作。
尽管有多种编程语言可供选择,但Python是最受欢迎的语言,原因之一是它是跨平台的,读和写都相对容易。同时许多现有的开源安全工具也是用Python编写的,因此学习这种语言有助于更好地理解现有工具的功能。
这篇博文介绍了Python编程来用于分析可移植执行文件(PE文件)。在这种情况下,脚本可以让您快速解析单个文件并提取关键特征,或者扩展到多个文件之间工作,以帮助对我们对工作进行优先排序。
注意,本文假设读者对Python和编程概念有一些基本的了解
Learning Python
有了一些基本的编程技能,就可以通过简单地检查现有代码,根据需要进行修改来提高您对Python的了解。虽然简单地调整代码在某些情况下可能会产生预期的结果,但许多人可能会从对该语言更正式的介绍中获益。一个快速的在线搜索将揭示许多免费可用的编写和视频Python教程。对于一个结构化的、交互式的介绍,我推荐代码学院(Code Academy)。如果您有更严格的、身临其境的Python学习经验,请考虑使用SANS SEC573的自动化信息安全(完全披露Python课程,我是SANS学院认证的教师)。
现有工具
现在有很多可以使用的基于python的恶意软件分析工具。下面是一些我认为有助于静态分析的工具:
pyew
AnalyzePE
pescanner
peframe
pecheck
这些工具产生能够有用的输出,并可作为理解Python的很好起点。通过简单地查看源代码并根据需要进行研究,您可以从作者编写的代码中学习并修改代码以满足自己的目的。然而,当您构建技术分析的经验时,您可能会遇到现有工具不能满足您需求的场景,并且必须开发定制的解决方案。请放心,这些情况不需要您从头编写代码。相反,您可以依赖现有的Python库以编写用于于您需要的方式来提取数据和操作输出。
一个流行的、长期代表性的PE文件分析库被称为pefile。这个模块提供了对可移植可执行文件结构的简单访问。另一个最近的、更加通用的跨平台库称为library来测试可执行格式(LIEF),它包含一个用于PE文件分析的Python模块(在这里有文档说明)。
本文将重点介绍如何使用Python 2和pefile进行文件分析。注意,pefile是一个第三方模块,而不是标准Python安装的内置模块。因此,您必须首先安装它;尝试pip install pefile
熟悉pefile
对于我们的环境,我们将使用REMnux恶意软件分析Linux发行版,您可以在这里下载。我们首先启动Python交互式shell来探索pefile模块并编写一些初始代码。与直接创建脚本不同,交互式shell是了解可用模块和执行快速测试的好方法。只要在终端上输入python,你就会看到如下提示:
接下来,导入pefile来利用它的功能:
让我们通过查看它的帮助信息来探索这个模块。输入help(pefile)。下面是输出的摘录:
除了模块的概述之外,我们还将看到模块中包含的类的描述。向下滚动提供关于每个类的信息。目前,我们只关注PE类:
描述告诉我们,这个类将使我们能够访问PE文件的结构,这正是我们分析Windows文件所需要的。输出还说明了如何创建PE类的实例。让我们在一个文件读取中进行测试。对于本文,我们将使用一个emotet示例。
我们可以返回帮助菜单来阅读关于PE类的方法和属性的更多信息。或者,我们可以通过键入dir(pefile.PE)查看此信息的摘要。下面是这个输出的摘录。
这里有很多文本,其中大部分可能不会根据您之前接触过的PE文件分析而生成。然而,让我们寻找一些我们可能认识的基本术语。我们看到以“get_”开头的多个方法的引用,这些方法有助于收集关于文件的一些基本静态信息。例如,get_impash()返回导入地址表(IAT)的MD5散列。让我们尝试使用我们的file实例:
get_imphash()方法按照预期工作,提供文件的导入表散列。
另一个我认为有价值的get_函数是get_warnings()。当pefile解析一个Windows可执行文件时,它可能在过程中遇到错误。函数的作用是:返回在处理PE文件时生成的警告列表。安全性分析都是关于调查异常情况的,因此这个输出可以揭示用于进一步审查的有用起点。例如,这个函数的输出可能表明文件被混淆了,即使特定的封隔器不能由寻找封隔器签名的常用工具(如ExeInfo或PEid)识别。然而,在这种特殊情况下,执行函数并不会返回错误:
让我们继续我们的pefile旅程,提取经常在初始恶意软件分析的其他静态信息。例如,我们如何使用pefile来理解这个可执行文件导入了哪些dll和函数?为了回答这个问题,我们将再次使用内置的help()系统进行一些老式的尝试和错误。这种方法可以与任何文档支持的Python模块一起使用。
首先,让我们通过学习更多关于PE类的的知识来回顾我们的选择。我们可以输入help(pefile.PE)并滚动输出。以下是一段有趣的摘录:
我们看到了对许多"DIRECTORY_ENTRY_"属性的引用,这些属性指向关键文件组件的位置。因为我们对导入内容感兴趣,所以我们将关注DIRECTORY_ENTRY_IMPORT,它被描述为ImportDescData实例的列表。让我们从迭代这个列表开始,看看它提供了哪些信息:
正如指定的帮助输出一样,我们将看到ImportDescData对象的列表。这些对象代表什么?我们将再次返回帮助,并输入help(pefile.ImportDescData):
如上所示,该结构包含DLL的名称和导入符号列表。这似乎就是我们需要的信息。让我们再次重复确认:
我们正在取得进展,但我们有一个新的结构需要研究。我们输入help(pefile.ImportData):
现在,我们只关注导入的名称,因此name属性应该具有我们需要的信息。让我们将其合并到我们的代码中,使输出更易于阅读:
成功!这段代码为我们提供了一个导入DLL的名称及其相应的导入函数名称。我们可以使这个输出更加优雅,但是我们需要的信息都已经在这里了。
规模化
正如在介绍中所讨论的,使用脚本进行自动化工作可以使您跨越更大的数据量扩展任务。上面执行的单个文件分析有它的位置,但是如果您的日常工作涉及到恶意软件分析,您可能有成百上千的文件需要筛选,然后再选择一个进行更仔细的检查。在这些场景中,需要从所有文件中提取关键信息,对示例进行分组并对其进行优先排序,以便进行更有效的分析。
让我们再考虑一个文件。通过大量的示例,通过imphash进行分组,可以更容易地识别出类似的功能或用于生成二进制文件的通用packer/packaging工具。为了探索这个想法,我们将编写一个小脚本从文件目录中提取imphash。代码应该完成以下任务:
1.创建目录(完整路径)中所有文件的列表。
2.打开一个XLSX文件来编写(我经常使用Excel来方便查看/排序,但是您当然可以输出到CSV,或者更好的是,将此信息写入数据库)。
3.计算并写入每个文件的sha256散列和imphash到XLSX文件。
4.自动筛选数据。
下面是实现这些任务的一种方法.
#~/usr/bin/env python
import sys,os
import pefile
import hashlib
import xlsxwriter
if __name__ == "__main__":
#Identify specified folder with suspect files
dir_path = sys.argv[1]
#Create a list of files with full path
file_list = []
for folder, subfolder, files in os.walk(dir_path):
for f in files:
full_path = os.path.join(folder, f)
file_list.append(full_path)
#Open XLSX file for writing
file_name = "pefull_output.xlsx"
workbook = xlsxwriter.Workbook(file_name)
bold = workbook.add_format({'bold':True})
worksheet = workbook.add_worksheet()
#Write column headings
row = 0
worksheet.write('A1', 'SHA256', bold)
worksheet.write('B1', 'Imphash', bold)
row += 1
#Iterate through file_list to calculate imphash and sha256 #file hash
for item in file_list:
#Get sha256
fh = open(item, "rb")
data = fh.read()
fh.close()
sha256 = hashlib.sha256(data).hexdigest()
#Get import table hash
pe = pefile.PE(item)
ihash = pe.get_imphash()
#Write hashes to doc
worksheet.write(row, 0, sha256)
worksheet.write(row, 1, ihash)
row += 1
#Autofilter the xlsx file for easy viewing/sorting
worksheet.autofilter(0, 0, row, 2)
workbook.close()
我将上面的脚本命名为pe_stats.py并使用python pe_stats.py命令在名为“suspect_files”的目录下运行它。为了填充目标目录,我从VT下载了100个高度的文件(具体来说,我使用了基本的VTI查询“type:peexe positive:50+”)。下面是在Microsoft Excel中打开的结果数据的摘录:
快速浏览前几行可以立即发现imphash值中的模式。下一步,也许您将研究最大的导入表散列集群,以了解为什么这些文件组具有相同的imphash。您还可以重新查看pefile库文档,以了解这个电子表格中值得包含的其他静态特性。有了更多的细节,这个文档可以帮助您分类和优先分析样本。我把这些任务留给你们进一步研究。
结论
本文提供了一种使用Python分析PE文件的初始方法。最重要的是,它介绍了如何使用内置的Python帮助特性和PE文件的一些基本知识,以便系统地研究文件的特征,然后将该过程扩展到更大的文件集。
如果你想了解更多关于恶意软件分析策略的知识,请参加我即将开设的 SANS FOR610 课程。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课