导语:本文介绍了Python编程如何用于实现可执行文件(PE)的分析,比如,脚本可以使你快速解析单个文件并提取其关键特征,或者在多个文件之间进行活动,以帮助确定它们运行的优先级。
一般来说,大多数安全防御的底层,都是各种经过编程的脚本,且这些脚本可以适用于多个安全防御策略和软件。而且编写脚本可以帮助安防人员将一些检测任务自动化,将琐碎的分析扩展到大量数据的分析,增加工作效率。
Python作为目前比较流行的一个种程序设计语言,已被用于很多杀毒模块中,所以有很多人希望提高Python的编程技能,以实现对杀毒软件的改造和自定义。
虽然有多种编程语言(Perl, Ruby, Scheme,或 Java)可供选择,但Python之所以最受欢迎的,原因之一,是它具有跨平台的属性,并且相对容易读写和编写。许多现有的开源安全工具也是用Python编写的,因此学习这种语言可以帮助你更好的理解现有功能。
本文就介绍了Python编程如何用于实现可执行文件(PE)的分析,比如,脚本可以使你快速解析单个文件并提取其关键特征,或者在多个文件之间进行活动,以帮助确定它们运行的优先级。
请注意,这篇文章假定读者已经对Python和编程概念有了一些基本的了解。
Python已经被大量用于分析恶意软件的工具中
有了一些基本的编程技能,就可以通过简单的检查现有代码,根据需要进行修改,就可以提高你对Python的了解。虽然在某些情况下简单的调整代码可能会产生预期的结果,但很多人可能会从对该语言更正式的介绍中获益。其实你上网就可以下载到许多免费提供Python教程,在此,我想你推荐Code Academy 。如果你希望获得更严格的Python学习体验,可以参加某些相关课程。
现有工具
目前市面上有许多基于Python的恶意软件分析工具,下面是一些我认为有助于静态文件分析的工具:
1.pyew:Pyew是一款非常著名的命令行恶意软件分析工具,通常被用于深度代码分析或修改文件。支持PE、ELF、OLE2、PDF等格式,并且支持自定义插件添加更多的功能;
2.AnalyzePE:用于报告Windows PE文件的各种工具;
3.pescanner;
4.peframe:PEframe是一个开源工具,用于对可移植可执行文件恶意软件和通用可疑文件执行静态分析。它可以帮助恶意软件研究人员检测打包程序,xor,数字签名,互斥锁,反调试,反虚拟机,可疑部分和函数以及有关可疑文件的更多信息;
5.pecheck:负责分析PE文件信息,使用方法也很简单,就是拖入PE文件,就可以对文件的PE结构进行解析;
这些工具可以产生有用的输出内容,是理解Python的绝佳开始。通过简单的查看源代码并根据需要进行研究,你可以了解开发者编写的内容并修改代码以满足自己的目的。但是,当你的自定义需求增多或分析更深入时,你可能会遇到现有工具无法满足你的情况,此时你必须开发新的解决方案。请放心,这些解决方案并不要求你从头开始编写代码。相反,你可以依赖现有的Python库,来提取那些符合你需求和操作的代码。
目前比较常用且流行的python PE库是pefile,python的PE库是用来专门解析PE文件的,可静态分析PE文件,且其中的模块可以轻松访问可执行文件的结构。另一个则是library库,它出现的时间不是很长,但却有着更加通用的跨平台库,能测试可执行格式(LIEF),library库包括用于PE文件分析的Python模块。
本文将重点介绍如何使用Python 2和pefile进行文件分析。请注意,pefile是一个第三方模块库,而不是标准Python安装的内置模块。因此,你必须先使用pip安装,如pip install 。
探索pefile
由于我的测试环境中运行的是Linux发行版,因此我将使用REMnux工具进行分析。REMnux是一个用于辅助逆向分析人员完成逆向分析任务的免费虚拟机镜像。其中包含了大量的逆向分析工具,可分析基于Web的恶意软件,如恶意的JavaScript,Java程序,和Flash文件。它也有工具可以分析恶意文档,如微软的Office和Adobe PDF文件,还有通过内存取证逆向病毒的实用工具。
我首先启动Python交互式shell来探索pefile模块并编写一些初始代码。交互式shell不是用来直接创建脚本的,而是学习可用模块和执行快速测试的好方法。比如,你只需在终端输入python,就将看到类似于以下内容的提示。
导入pefile后,就可以利用交互式shell的功能了。
让我们通过查看其帮助信息来看看此模块的具体内容,输入help(pefile),就可以看到以下内容了。
除了对模块的介绍之外,我还看到了模块中包含了对类的描述,鼠标向下滚动,就可以看到有关每个类的详细信息。不够,本文我只关注PE类的信息。
通过对PE类的详细介绍,我知道了这个类将使我们能够访问PE文件的结构,而这正是分析Windows文件所需要的。说明里还详细说明了如何创建PE类,按照其中所列举的样本,我对其中的一个文件进行读取以及测试。本文,我将使用一个关于银行木马emotet的样本。
我可以返回帮助菜单来阅读有关PE类的方法和属性的更多信息,或者通过输入dir(pefile.PE)来查看此信息的摘要。
虽然其中有很多文本,不过大部分可能都不是基于之前分析过的PE文件而生成的。不过,里面的一些基本方法,我还是要认识一下的。我看到很多以“get_”开头的方法,这些方法有助于收集有关文件的一些基本静态信息。例如,et_impash()返回导入地址表(IAT)的MD5哈希。
get_imphash()方法按照预期工作,提供文件的导入表哈希。
另一个我认为有价值的“get_”函数是get_warnings(),当pefile解析Windows可执行文件时,可能会遇到错误。而 get_warnings()函数的作用就是返回在处理PE文件时生成的警告列表。由于安全性分析都是关于调查异常情况的,因此这个返回信息可以揭示有用的信息,以供进一步审查使用。例如,即使特定packer不能通过寻找packer签名的常用工具(例如,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检测法,它可以帮助你发现导入哈希表中的重复项。比如,在分析大量样本时,通过imphash进行分组可以更容易的识别类似的属性或用于生成二进制文件的通用packer/packaging工具。为了探索这个想法,我编写了一个小脚本(当然是用Pyton编写的),以试图从文件目录中提取imphash。该脚本应完成的任务如下:
1.创建目录(完整路径)中所有文件的列表;
2.打开一个可以编写的XLSX文件(虽然,我经常使用Excel进行查看或排序,但更好的办法是将此信息写入数据库);
3.计算并写入每个文件的sha256哈希并插入到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()<span data-mce-type="bookmark" id="mce_SELREST_start" data-mce-style="overflow:hidden;line-height:0" style="overflow:hidden;line-height:0" ></span> 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在名为“suspect_files”的目录中运行它。为了补充目标的目录表,我专门从VT下载了100个恶意文件。具体来说,我使用了基本的VTI查询“type:peexe positive:50+”。当我在Microsoft Excel中打开时,呈现的数据结果如下所示。
快速浏览前几行时,ImpHas模式就会发挥作用,导入表中的重复项。这就方便了我下一步对大量的哈希集群进行统一分析,以了解为什么这些文件组具有相同的哈希值。另外,我还可以重复访问pefile库的文档,以分析包含在此电子表格中的其他静态特性。 通过更详细的信息,我编写的脚本就可以帮助你对要分析的样本进行分类和优先级分析。
总结
这篇文章提供了一种使用Python脚本分析PE文件的思路。 最重要的是,本文介绍了如何使用内置的Python帮助功能和PE文件的一些基本知识来系统的探索恶意文件的属性。
如果你想了解有关恶意软件分析策略的更多信息,请加入我即将推出的SANS FOR610课程。