Python-Analysis-Malware

Python恶意软件分析应用-PEfile

0x1、前言

要想对恶意代码快速分析,Python是一门必须要掌握的编程技能。因为它是跨平台的,而且容易阅读和编写。许多开源安全工具也是用Python写的。这篇博客文章介绍利用Python对(PE)文件分析的编程思路,快速解析单个文件并提取关键特征 。

如果想要学习Python的安全编程,下面有一套课程可以了解一下。

https://www.sans.org/course/automating-information-security-with-python

恶意代码分析Linux系统

https://remnux.org/

0x2、工具介绍

使用许多基于Python的恶意软件分析工具。这些工具可以有助于理解Python,产生有用的输出。通过简单地查看源代码并根据需要进行研究,可以了解作者编写的内容并修改代码以满足自己的目的。遇到现有工具无法满足需求的情况,可以依赖现有的Python库来提取数据并以特定于需求的方式操作输出。

pyew
AnalyzePE
pescanner
peframe
pecheck

一个PE文件分析库 [pefile](https://github.com/erocarrera/pefile)。写好了代码,可以轻松地遍历出可执行文件的结构。pefile是第三方模块,而不是内置标准Python安装的模块。必须先安装pip install pefile

0x3、Pefile基础

查看帮助信息 help(pefile)。 以下是输出的内容。

除了模块的概述之外,我们还看到了模块中包含的类的描述。向下滚动提供有关每个类的信息。目前只需要关注PE类:

这个类能够访问PE文件的结构。输出还说明了如何创建PE类的实例。

使用emotet样本

https://www.virustotal.com/en/file/9c6dcc1772b076f930b2bae4b9ddccec81660a4f9a633cb129eb27dd19d5d81a/analysis/

可以返回帮助菜单来阅读有关PE类的方法和属性的更多信息,或者通过键入dir(pefile.PE)来查看此信息的摘要 下面是该输出的摘录。

以“get_”开头的多个方法的引用,这些方法有助于收集有关文件的一些基本静态信息。例如 get_impash() 返回导入地址表(IAT)的MD5 hash。文件示例:

get_imphash()方法提供文件的导入表哈希。

有价值的另一个“get_” 函数是 get_warnings()。 当pefile解析Windows可执行文件时可能会遇到错误。get_warnings()函数返回在处理PE文件时生成的警告列表。安全性分析是检查异常的,所以这个输出可以展现有用的起点以供进一步检测。

使用Pefile还可以查看可执行文件导入哪些DLL和函数。输出help(pefile.PE)查看相关属性。

“DIRECTORY_ENTRY_”属性指向文件关键构成要素。要查看导入哪些DLL和函数就需要关注导入表,我们可以看到DIRECTORY_ENTRY_IMPORT,它的描述是ImportDescData实例的列表。

遍历此列表以查看它提供的信息:

输入 help(pefile.ImportDescData)查看帮助说明:

如上所示,此结构包含DLL的名称和导入的符号列表。写个循环确认下:

图中有一个新的结构ImportData。输入help(pefile.ImportData)查看帮助:

目前只关注导入表的符号名称,因此name属性包含了符号名称的信息。合并到代码中使输出更具可读性。

代码输出可执行文件导入的DLL名称及其对应的导入函数名称。也可以使这个输出更优雅,但目前所需的信息已经输出了。

0x3、多个样本使用场景

使用脚本自动执行工作可以扩展处理更大量的数据分析任务。上面代码执行的是单个文件分析。如果日常工作涉及恶意软件分析可能需要筛选数百或数千个文件,然后再选择一个文件进行仔细分析。从所有文件中提取关键信息可以对样本进行分组和优先级排序,以便进行更有效的分析。

在大量样本中,通过imphash进行分组可以更容易地识别类似的功能或用于生成二进制文件的通用打包器/打包工具。可以通过编写一个小脚本来从文件目录中提取imphash:

1、创建目录中所有文件的列表(完整路径)。
2、打开一个XLSX/CSV文件进行写入
3、计算并写入每个文件的sha256哈希并插入到XLSX/CSV文件中。
4、自动过滤数据。

pe_stats.py代码示例:

#~/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:加粗,num_format:数字格式
    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()

使用命令python pe_stats.py suspect_files在名为“suspect_files”的目录中运行它 。为了填充目标目录,从VT下载了100个高危风险的文件(使用基本的VTI查询“type:peexe positives:50+”) 在Microsoft Excel中打开时,数据结果如下所示。

快速浏览前几行会立即显示imphash值中的模式。下一步研究最大的导入表HASH集群,了解为什么这些文件组具有相同的导入HASH。

0x4、参考

https://malwology.com/2018/08/24/python-for-malware-analysis-getting-started/

posted @ 2018-11-02 10:45  17bdw  阅读(1267)  评论(0编辑  收藏  举报