原文:https://malwology.com/2018/08/24/python-for-malware-analysis-getting-started/
提升你的 Python 编程技巧可能正在你的待做清单上——就行清理衣橱、粉刷墙壁、拧紧螺丝一样(你知道我在说什么)。
通常来说,脚本是跨大多数安全学科的一个实用的工具,编写脚本可以帮助你自动完成琐碎的任务,规模化分析大量数据,分担你的工作量。
尽管有许多的编程语言可供选择,但 Python 是其中最受欢迎的那一个,抛开别的原因不谈,它是跨平台的,并且相对容易阅读和编写。许多现有的开源安全工具都是用 Python 写的,所以学习 Python 可以帮助你更好的理解这些工具。
这篇文章介绍了用于 PE 文件分析的 Python 程序,在下文中,一个脚本可以帮助你快速解析单个文件并提取关键特征,或在多个文件之间规模化测量以完成更高优先级的任务。
请注意,这篇文章假定读者已经对Python和编程的概念有了一些基本的了解。
现在已经有许多使用 Python 编写的恶意软件分析工具可供使用。以下是一些我觉得对静态文件分析比较有帮助的工具:
这些工具可以产生有用的输出,是理解 Python 的绝佳选择。通过简单的浏览源代码和进行一些必要的搜索,你可以了解到作者是怎么编写这个程序的,和怎么修改程序以满足自己的目的。在你进行技术分析的过程中,你会积累经验,同时也会遇到工具不能满足需求的情况,这时候就需要自己去修改工具。不过放心,不需要从头开始编写代码,你可以通过 Python 库来提取数据,把输出修改成你想要的形式。
pefile是一个流行的、存在已久的、用于分析PE文件的的库。这个模块提供了PE 文件组织的便捷入口。另一个最近更新的更通用的且跨平台的一个库叫做 Library to Instrument Executable Formats (LIEF),它包含了一个用于 PE 文件分析的Python 模块(文档在这)
这篇文章会用到Python2和 pefile
库来进行文件分析。请注意pefile
是一个第三方模块,不是 Python 标准内置库。因此,你可能需要先安装它,尝试运行pip install 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()
如期的提供了 IAT 的 MD5值
另一个有用的"get_"
函数是get_warnings
。当pefile
解析一个 Windows 可执行文件时,可能会发生错误。get_warnings
返回一个 PE 文件在被处理时产生的警告。安全性分析就是为了调查异常的,所以这个输出可以揭示用于进一步分析的着手点。比如说,这个函数的输出可以指示出文件是被混淆过的,即使打包器不能被普通的那种寻找打包器签名的工具识别出来(例如ExeInfo 或者 PEid)。在这种情况下,函数不会返回错误:
继续往下,提取恶意软件分析时常用的其他静态信息。比如说,使用pefile
查看可执行文件导入了哪些 DLL 文件和函数。为了解决这个问题,再次使用内建的 help()
进行一些老式的尝试和报错。此方法适用于任何文档详细的 Python 模块。
首先,查阅 PE 类以检查我们的选项。键入help(pefile.PE)
,然后往下看。感兴趣的是这一部分:
可以看到许多"DIRECTORY_ENTRY_"
属性的引用,这些属性指向密钥文件组件的位置。因为我们对导入表感兴趣,所以关注DIRECTORY_ENTRY_IMPORT
,它被描述为ImportDescData 实例的一个列表。通过迭代这个列表看看他提供什么信息:
就像帮助信息里说明的一样,可以看到一个关于ImportDescData对象的列表。这些对象又代表什么呢?再次使用help(pefile.ImportDescData)
:
如上所示,这个结构体包含了 DLL 的名字和一个已导入的符号表。这貌似就是我们想要的,再次迭代进行确认:
我们取得了不错的进展,但现在有一个新的结构体需要研究一下。键入help(pefile.ImportData)
目前为止,我们只关注导入的名字,所以名字属性应该有我们想要的信息。将它放入到代码中,使输出更具有可读性。
成功了!代码为我们提供了导入的DLL的名称及其对应的导入函数名称。可以把输出变得更好看点,但是我们需要的信息已经全都有了。
像之前在介绍里说的一样,使用脚本自动完成工作可以使你规模化分析大量数据。单文件分析固然重要,但是日重工作中的恶意软件分析可能需要你分析成百上千个文件,再挑选出一个文件仔细分析。在这些情境中,提取关键信息可以让你对样本进行分组和优先级排序,以使分析更高效。
另外再考虑文件的 imphash。在大量的文件中,通过 imphash可以更容易的鉴别出类似的函数或者用于产生二进制文件的公共打包器/打包工具。代码应该完成下列任务:
下面是完成这些任务的一种方法。
#~/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
,并在 “suspect_files” 目录中使用命令python pe_stats.py suspectfiles
来运行它。为了填充目标目录,我从 VT下载了100个高危文件(说明一下,我使用了基础 VTI 查询:"type:peexe positives:50+")。在 Excel 中打开输出数据,部分输出如下。
看一眼前几行就可以发现 imphash 有一个特定的模式。下一步,可以研究一下最大的导入表哈希集群,以了解为什么文件具有相同的 imphash。你也可以再看一下pefile
库的文档,研究一下表中其他的静态特性有什么用。有了这些的细节,会对样本分类和优先级分析有很大的帮助。我把这些作为任务留给你作为进一步的探究。
这篇文章提供了使用 python 分析 PE 文件的一个方法。更重要的是,它介绍了如果使用 Python 的内置函数 help
以及一些PE 文件的基础知识来系统化分析文件的特征,然后将其扩大到更大的文件集。
如果你想了解更多关于恶意软件分析的策略,你可以加入 即将开始的 SANS FOR610 课程以了解更多。