首页
社区
课程
招聘
[翻译]使用Python开始恶意软件分析
2018-9-25 23:26 23688

[翻译]使用Python开始恶意软件分析

2018-9-25 23:26
23688

原文链接: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直播授课

收藏
点赞1
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  junkboy   +1.00 2018/09/26
最新回复 (5)
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junkboy 2018-9-26 10:30
2
0
支持
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wxhui 2018-9-26 12:33
3
0
谢谢分享!
雪    币: 1219
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
诸葛默默 2018-9-26 20:45
4
0
谢谢分享,学习了很多。
雪    币: 38
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
IceMaker 2020-5-12 16:04
5
0
雪    币: 3542
活跃值: (239)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
xunbu 2021-9-6 10:37
6
0
谢谢
游客
登录 | 注册 方可回帖
返回