-
-
[翻译]使用Python开始恶意软件分析
-
发表于:
2018-9-25 23:26
24246
-
原文链接:https://malwology.com/2018/08/24/python-for-malware-analysis-getting-started/
翻译:看雪翻译小组 wanrin
提高你的Python编程技能很可能在你想要做的事的列表上——就像清理你的衣柜,粉刷墙壁,或者拧紧那个松动的螺丝(你知道我说的是哪个)。
一般来说,脚本编写是跨越大多数安全主题的有用技能。编写脚本可以帮助您自动化一个琐碎的任务,将分析扩展到大量数据,并且可以分享您的工作。
尽管有多种编程语言可供选择,但Python是最受欢迎的语言,原因之一是它是跨平台的,读和写都相对容易。同时许多现有的开源安全工具也是用Python编写的,因此学习这种语言有助于更好地理解现有工具的功能。
这篇博文介绍了Python编程来用于分析可移植执行文件(PE文件)。在这种情况下,脚本可以让您快速解析单个文件并提取关键特征,或者扩展到多个文件之间工作,以帮助对我们对工作进行优先排序。
注意,本文假设读者对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
对于我们的环境,我们将使用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的名称及其相应的导入函数名称。我们可以使这个输出更加优雅,但是我们需要的信息都已经在这里了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)