论文名称 | 发表时间 | 发表期刊 | 期刊等级 | 研究单位 |
Improving ransomware detection based on portable executable header using xception convolutional neural network | 2023年 | Computers & Security | SCI 2区 | 帕拉联邦大学 |
0. 概述
勒索软件攻击在 COVID-19 大流行期间显着增加,并且由于其高盈利能力,这种增长可能会持续下去。为了应对这些攻击,作者应用静态分析来检测勒索软件,方法是将可移植可执行 (PE) 头文件转换为顺序矢量模式的彩色图像,并通过 Xception 卷积神经网络 (CNN) 模型对这些图像进行分类。这种方法简化了特征提取,减少了处理负载,并且对规避技术和勒索软件的演变更具弹性。使用两个数据集评估所提出的方法在二分类任务与多分类任务中的表现(仅针对二分类任务进行复现)。
1. 相关工作
最近的工作在基于PE文件头的一般恶意软件检测方面取得了进展,此类研究的典型建议包括从恶意软件的标头中提取特征,并使用机器学习对其进行分类。这些研究的结果是有希望的,因为它们达到了良好的准确性水平。然而,这些研究并未关注特定类型的恶意软件,这可能导致检测结果不准确。勒索软件的重点是用户文件中的信息,由于其无形价值,这些信息对于个人和组织来说是最优价值的资产。因此,由于文件丢失的巨大危险,用于勒索软件检测的专门方案至关重要。
Poudyal等人提出一种PEFile分析技术,用于使用二进制可执行文件的标头信息来研究勒索软件。他们的研究证实,通过静态分析获得的特征,包括加壳状态、编译日期和时间、加密函数和动态链接库(DLL),可以获得有关勒索软件行为和特征的有价值信息。他们的工作可以帮助开发勒索软件检测系统,但缺点是它只调查一个勒索软件家族:Locky。
Vidyarthi等人根据PE文件的判别特征调查了勒索软件,其他恶意软件和良性可执行文件的特定属性。在静态分析中,对PE文件进行反汇编,从头字段中提取元数据。他们识别了60个静态属性以实现分类,并发现了特定的勒索软件属性,包括加壳程序的存在、文件的熵、文本和数据部分、常见字符串的存在、注册表项修改命令以及用于网络通信的DLL。使用随机森林、决策树、朴素贝叶斯进行分类。
Manavi等人(1)构建了一个长短期记忆网络来处理标头的字节序列,以实现勒索软件的检测。(2)提出一种基于图嵌入的静态分析方法来检测勒索软件,该方法使用PE标头形成一个图,然后使用幂迭代方法将其映射到特征空间中,最终实现勒索软件的检测。(3)提出一种使用CNN检测勒索软件的静态分析方法,其中主要步骤是从可执行文件中提取标头,使用提取的标头构建灰度图,最后通过CNN网络实现勒索软件检测。
Zahoora等人在两阶段过程中探索了零样本学习的能力,提出了一种新的基于深度收缩自编码器的属性学习技术和基于异构投票集成的推理阶段方法。他们的研究重点是检测零日勒索软件攻击,特别是检测新的勒索软件。
2. 研究内容
首先从可执行样本中提取原始标头信息,然后按照顺序模式将其从一维向量转化为二维方阵,之后将得到的矩阵转化为彩色图像,最后将生成的图像作为Xceptin CNN的输入实现勒索软件检测。
图1. 主要研究内容
PE文件的完整标头包括MS-DOS标头、MS-DOS存根、PE签名、COFF文件标头、可选标头、节标头,这些标头包含不同级别的元数据,可以现实文件结构并提供有意义的信息。然而,有些字段是不必要的,例如Section Headers与Optional Header的部分内容。具体来说,首先在每个标头中提取1024字节,之后将各个字节转为0~255,最后对转换的值进行归一化。
通过上一步操作可得到长度为1024的特征,这个特征可以很容易的转换为32×32的特征矩阵,转换方法有四种分别是,Sequential、Zigzag、Spiral、Diagonal Zigzag,如图二所示。
图2. 特征矩阵生成方法
得到特征矩阵之后作者通过Seaborn API将32×32的特征矩阵调整为256×256的特征矩阵,之所以这么做是为了适应Xception的输入。由于我并不准备使用Xception,而是准备使用原始的CNN,因此并未对特征矩阵进行进一步处理,而是直接将生成的特征矩阵作为CNN的输入进行二分类任务。
3. 具体实现
样本收集
需要收集足够多的勒索软件样本与良性软件样本,勒索软件样本包括34个勒索软件家族(AvosLocker、BlackBasta、BlackCat等)的279个勒索软件,良性软件样本包含970各种常用软件,需要注意的是这些软件均为PE格式文件。具体来说,勒索软件样本的收集包括四个步骤,分别是勒索软件威胁情报收集、勒索软件威胁情报处理、勒索软件样本下载、勒索软件样本清洗,如图1所示。良性软件的收集直接从DikeDataset抽取1000个良性软件样本,并筛选出970个PE格式的良性软件样本。
图2. 勒索软件样本收集
针对所有收集到的样本,分析PE文件IMAGE_FILE_HEADER中Machine信息,并统计所有样本的指令集信息,发现绝大部分样本均为x86指令集。
file.seek(0x3C)
pe_offset = int.from_bytes(file.read(4), 'little')
file.seek(pe_offset + 0x04)
machine_type = int.from_bytes(file.read(2), 'little')
if machine_type == 0x014C:
return "x86"
elif machine_type == 0x0200:
return "Itanium"
elif machine_type == 0x8664:
return "x64"
else:
return "Unknown machine type"
特征提取
首先提取所有可执行文件(勒索软件、良性软件)的机器码,之后通过pefile库获取各可执行文件PE头的起始偏移地址和结束偏移地址,然后基于偏移地址提取可执行文件PE头对应的机器码。
pe = pefile.PE(data=data)
dos_header_size = pe.DOS_HEADER.e_lfanew
pe_header_start = dos_header_size
if pe.sections:
pe_header_end = pe.sections[0].PointerToRawData
pe_header_data = data[pe_header_start:pe_header_end]
从机器码中提取1024个字节,对于字节数大于1024的样本对样本进行截取,对于字节数小于1024的样本对样本进行补零。将样本的字节映射到0到255,并进行归一化。
header_binary = header[:1024] if len(header) >= 1024 else header.ljust(1024, b'\x00')
header_mapped = np.frombuffer(header_binary, dtype='uint8')
header_normalized = scaler.fit_transform(header_mapped.reshape(-1, 1)).flatten()
header_with_label = np.hstack((header_normalized, np.array([Label], dtype='uint8')))
all_features.append(header_with_label) # 将header添加到all_features列表中
勒索软件分类
将样本的特征从1×1024转换为32×32,并生成与之对应的灰度图。将生成的灰度图作为卷积神经网络的输入,实现勒索软件的检测,检测精度达到94.44%。