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/

Python-Analysis-Malware的更多相关文章

  1. python学习笔记(1):python基础

    python基础回顾 1.Ipython魔术命令 %timeit //多次执行一条语句,并返回平均时间,%%time->多条语句,用于测试一条语句用了多少时间 %time //返回执行一条语句的 ...

  2. Lab 11-2

    Analyze the malware found in Lab11-02.dll. Assume that a suspicious file named Lab11-02.ini was also ...

  3. Ubuntu 14.04 下使用微软的跨平台轻量级开发神器 Visual Studio Code

    因为 Visual Studio Code 不断更新,官方最新 v1.32 的 .deb 包已经不能用于 Ubuntu 14.04 直接安装了. 下载 v1.31 的 deb 包安装即可:https: ...

  4. Lab 11-3

    Analyze the malware found in Lab11-03.exe and Lab11-03.dll. Make sure that both files are in the sam ...

  5. Lab 11-1

    Analyze the malware found in Lab11-01.exe. Questions and Short Answers What does the malware drop to ...

  6. How do I learn machine learning?

    https://www.quora.com/How-do-I-learn-machine-learning-1?redirected_qid=6578644   How Can I Learn X? ...

  7. 【ARTS】01_08_左耳听风-20181231~20190106

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  8. PyTorch环境配置

    PyTorch环境配置 本文档用于记录PyTorch环境配置过程中的要点. PyTorch环境配置 安装Miniconda 安装PyTorch 配置远程开发工具 基于CUDA的张量 导入警告问题 参考 ...

  9. Python Ethical Hacking - Malware Analysis(1)

    WRITING MALWARE Download file. Execute Code. Send Report. Download & Execute. Execute & Repo ...

  10. Python Ethical Hacking - Malware Analysis(4)

    DOWNLOAD_FILE Download files on a system. Once packaged properly will work on all operating systems. ...

随机推荐

  1. 2017-2018-2 1723《程序设计与数据结构》第三周作业 & 实验一 总结

    作业地址 第三周作业:https://edu.cnblogs.com/campus/besti/CS-IMIS-1723/homework/1667 提交情况如图: 实验一:https://edu.c ...

  2. Where To Buy -- proposed by Renqian Luo

    Need 周末在公司加班,公司食堂不开饭,就会想到点外卖.手机里好多外卖APP,同样的店家在不同平台的优惠活动可能不一样,A这边满20减10,B那边满20只减5,但是那边好像有优惠券可以用唉,等等,C ...

  3. Redis的相关问题总结

    一.Redis的优缺点及适用场景 Redis 是一个基于内存的高性能key-value数据库.很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘 ...

  4. 学习Spring Boot:(十二)Mybatis 中自定义枚举转换器

    前言 在 Spring Boot 中使用 Mybatis 中遇到了字段为枚举类型,数据库存储的是枚举的值,发现它不能自动装载. 解决 内置枚举转换器 MyBatis内置了两个枚举转换器分别是:org. ...

  5. BZOJ 3625: [Codeforces Round #250]小朋友和二叉树

    3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 13 ...

  6. 【BZOJ1078】[SCOI2008]斜堆(性质题)

    [BZOJ1078][SCOI2008]斜堆(性质题) 题面 BZOJ 洛谷 题解 考虑一下这道题目的性质吧.思考一下最后插入进来的数是什么样子的.首先因为它是最后插入进来的,所以一定是比某个数小,然 ...

  7. emWin notes

    emwin 学习小记 @2018-7-5 ## 在使用 graph 控件时,需要在坐标上显示波形,波形刷新函数 GRAPH_DATA_YT_AddValue() 放在一个 while(1) 中,这样便 ...

  8. 洛谷乐多赛 yyy loves Maths VI (mode)

    题目描述 他让redbag找众数 他还特意表示,这个众数出现次数超过了一半 一共n个数,而且保证有 n<=2000000 而且每个数<2^31-1 时间限制 1s 空间限制 3.5M(你没 ...

  9. Codeforces 468C/469E 易错点

    #include <stdio.h> #include <stdlib.h> typedef long long ll; int main() { ll x=1e17; ll ...

  10. spring注入时报错::No qualifying bean of type 'xxx.xxMapper'

    做一个小项目,因为有 baseService,所以偷懒就没有写单独的每个xxService接口,直接写的xxServiceImpl,结果在service实现类中注入Mapper的时候,用的 @Auto ...