基于深度学习的恶意PE检测软件设计与实现

目 录
摘 要 I
ABSTRACT II
1 引言 1
1.1 研究背景与意义 1
1.1.1 研究背景 1
1.1.2 研究意义 1
1.2 国内外研究现状 2
1.2.1 国内研究现状 2
1.2.2国外研究现状 2
1.2.3发展趋势 3
1.3 技术路线 3
1.3.1 技术引线规划 3
1.3.2 数据收集与预处理 4
1.3.3 特征提取与模型设计 4
1.3.4 模型训练与优化 4
1.3.5 软件实现与应用 5
1.3.6 总结与展望 5
2 相关知识背景 6
2.1 恶意PE概述 6
2.1.1 定义 6
2.1.2 特点 6
2.1.3 分类 6
2.2 深度学习技术 7
2.2.1 神经网络原理 7
2.2.2 卷积神经网络(CNN) 7
2.2.3 自动编码器(Autoencoder) 7
2.2.4 空间金字塔池化层原理 7
2.2.5 模型的构建、训练及评价 8
3 基于卷积神经网络的恶意PE分类方法 9
3.1 基于卷积神经网络与多特征融合的恶意PE分类方法 9
3.1.1 生成灰度图像 9
3.1.2 提取序列特征 9
3.1.3 深度学习分类器 9
3.2 实验设计与结果分析 10
3.2.1 数据集、实验环境介绍 10
3.2.2 实验结果与分析 10
3.2.3 方法对比 11
4 恶意PE检测软件的设计与实现 12
4.1 实现概述 12
4.2 实现思路 12
4.3具体实现方法 12
4.3.1恶意PE图像的生成 14
4.3.2聚类存放 14
4.3.3图像标准化处理 15
4.4.4图像归一化处理 16
4.4数据集、训练设备及结果说明 20
4.4.1数据集 20
4.4.2训练设备环境配置 21
4.2.3 结果 21
4.4.4 TensorBoard可视化 22
4.4.5 缺陷及限制 23
5 结论与展望 24
5.1 结论 24
5.2 展望 24
参考文献 25
谢 辞 27
1.3 技术路线
1.3.1 技术引线规划
在构建基于深度学习的恶意PE文件检测软件时,技术路线的规划至关重要。它涉及了从数据收集、预处理、模型设计、训练与优化,到最终软件实现与应用的全过程。本文将详细阐述这一技术路线,以期为相关研究人员提供有益的参考。
1.3.2 数据收集与预处理
(1)数据收集
数据是深度学习模型训练的基础,因此,首先需要收集大量的恶意PE文件样本和正常PE文件样本。这些数据可以从公开的恶意软件库、安全机构发布的威胁情报、以及实际网络环境中捕获的样本中获得。在收集过程中,需要确保样本的多样性和代表性,以覆盖各种类型和变种的恶意软件。
(2)数据预处理
收集到的原始数据往往需要进行一系列的预处理操作,以便后续的特征提取和模型训练[3]。这包括去除无关信息、格式化数据、提取特征等步骤[3]。具体来说,可以将PE文件转换为二进制序列或灰度图像,以便利用深度学习模型进行特征学习。同时,还可以提取PE文件的元数据、导入表、导出表等信息作为辅助特征[5]。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'MainUI.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
import shutil
import predict as pd
import cv2
import B2M as bm
import sqrt_deal_pic as sp
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.pic_filename = None
        self.byte_filename = None
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(500, 80, 81, 31))
        font = QtGui.QFont()
        font.setFamily("方正姚体")
        font.setPointSize(12)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.toolButton = QtWidgets.QToolButton(self.centralwidget)
        self.toolButton.setGeometry(QtCore.QRect(435, 80, 45, 31))
        self.toolButton.setObjectName("toolButton")
        self.comboBox = QtWidgets.QLineEdit(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(200, 80, 220, 31))
        self.comboBox.setObjectName("comboBox")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(200, 45, 121, 21))
        font = QtGui.QFont()
        font.setFamily("方正姚体")
        font.setPointSize(13)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(190, 230, 111, 51))
        font = QtGui.QFont()
        font.setFamily("方正姚体")
        font.setPointSize(13)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(330, 145, 260, 210))
        self.graphicsView.setObjectName("graphicsView")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(190, 410, 111, 21))
        font = QtGui.QFont()
        font.setFamily("方正姚体")
        font.setPointSize(13)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect(190, 370, 401, 16))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.line_2 = QtWidgets.QFrame(self.centralwidget)
        self.line_2.setGeometry(QtCore.QRect(190, 120, 401, 16))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit.setGeometry(QtCore.QRect(330, 410, 260, 31))
        self.plainTextEdit.setObjectName("plainTextEdit")
        #self.plainTextEdit.setEnabled(False)
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(200, 480, 101, 41))
        font = QtGui.QFont()
        font.setFamily("方正姚体")
        font.setPointSize(13)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.plainTextEdit_2 = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit_2.setGeometry(QtCore.QRect(330, 455, 260, 100))
        self.plainTextEdit_2.setObjectName("plainTextEdit_2")
        #self.plainTextEdit_2.setEnabled(False)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        self.menu_2 = QtWidgets.QMenu(self.menu)
        self.menu_2.setObjectName("menu_2")
        self.menu_3 = QtWidgets.QMenu(self.menubar)
        self.menu_3.setObjectName("menu_3")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action_2 = QtWidgets.QAction(MainWindow)
        self.action_2.setObjectName("action_2")
        self.action_3 = QtWidgets.QAction(MainWindow)
        self.action_3.setObjectName("action_3")
        self.action = QtWidgets.QAction(MainWindow)
        self.action.setObjectName("action")
        self.menu_2.addAction(self.action_2)
        self.menu.addAction(self.menu_2.menuAction())
        self.menu.addAction(self.action_3)
        self.menu_3.addAction(self.action)
        self.menubar.addAction(self.menu_3.menuAction())
        self.menubar.addAction(self.menu.menuAction())

        self.pic_filename = None
        self.predict = None
        self.score = None

        self.retranslateUi(MainWindow)
        self.toolButton.clicked.connect(self.showDialog)
        self.pushButton.clicked.connect(self.show_pre)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "恶意代码家族标注系统"))
        self.pushButton.setText(_translate("MainWindow", "ok"))
        self.toolButton.setText(_translate("MainWindow", "..."))
        self.label.setText(_translate("MainWindow", "请上传您的样本"))
        self.label_2.setText(_translate("MainWindow", "恶意代码图像"))
        self.label_3.setText(_translate("MainWindow", "恶意代码家族"))
        self.label_4.setText(_translate("MainWindow", "家族描述"))
        self.menu.setTitle(_translate("MainWindow", "查看"))
        self.menu_2.setTitle(_translate("MainWindow", "可视化"))
        self.menu_3.setTitle(_translate("MainWindow", "主功能"))
        self.action_2.setText(_translate("MainWindow", "恶意代码图像"))
        self.action_3.setText(_translate("MainWindow", "恶意代码家族介绍"))
        self.action.setText(_translate("MainWindow", "预测家族属性"))

    def showDialog(self):
        fname = QtWidgets.QFileDialog.getOpenFileName(self.centralwidget, 'Open file', './example', "All Files (*);;Byte Files (*.bytes);;Exe Files(*.exe)")
        if fname[0].split('/')[-1].split('.')[-1] == 'bytes':
            self.comboBox.setText(fname[0])
            self.byte_filename = fname[0].split('/')[-1]
            #print(self.pic_filename)
            shutil.copyfile(fname[0], './test_file/bytes/' + self.byte_filename)
            self.pic_filename = sp.change_to_pic('./test_file/bytes',self.byte_filename,'./test_file/pic')
        elif fname[0].split('/')[-1].split('.')[-1] == 'exe':
            self.comboBox.setText(fname[0])
            self.byte_filename = fname[0].split('/')[-1]
            # print(self.pic_filename)
            shutil.copyfile(fname[0], './test_file/exe/' + self.byte_filename)
            self.pic_filename = bm.exe_to_pic('./test_file/exe',self.byte_filename,'./test_file/pic')
        elif fname[0]:
            QtWidgets.QMessageBox.information(self.centralwidget, "警告", "只能上传以bytes或者exe结尾的文件", QtWidgets.QMessageBox.Yes)
    def show_pre(self):
        if self.pic_filename:
            pic_dir = './test_file/pic'
            wdir = './test_file/deal_pic'
            self.score, self.predict = pd.read_model(pic_dir, self.pic_filename, wdir)

            if self.score <= 12:
                self.predict = 9

            img_path = './test_file/pic/' + self.pic_filename
            #print(img_path)
            image = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
            image = cv2.resize(image, (250, 200))

            frame = QtGui.QImage(image, 250, 200, QtGui.QImage.Format_Indexed8)
            pix = QtGui.QPixmap.fromImage(frame)
            self.item = QtWidgets.QGraphicsPixmapItem(pix)  # 创建像素图元
            self.scene = QtWidgets.QGraphicsScene()  # 创建场景
            self.scene.addItem(self.item)
            self.graphicsView.setScene(self.scene)  # 将场景添加至视图

            malware_family = ['Ramnit', 'Lollipop', 'Kelihos_ver3', 'Vundo', 'Simda', 'Tracur', 'Kelihos_ver1', 'Obfuscator.ACY', 'Gatak', '其他']
            self.plainTextEdit.setPlainText(malware_family[self.predict])

            describle_falmily = ['Virus:Win32 / Ramnit.B:是对感染Windows可执行文件和HTML文件并尝试允许远程访问的病毒的检测。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Virus:Win32/Ramnit.B',
                                 'Adware:Win32/Lollipop:此广告软件程序会在您浏览网页时显示广告。它还可以重定向搜索引擎结果,监控您在PC上执行的操作,下载应用程序以及将有关PC的信息发送给黑客。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Adware:Win32/Lollipop&threatId=198706',
                                 'Win32/Kelihos:是一个发布垃圾邮件的木马家族。垃圾邮件可能包含指向安装程序的超链接Win32/Kelihos恶意软件。恶意软件可以与远程服务器通信以交换用于执行各种任务的信息,包括发送垃圾邮件,捕获敏感信息或下载和执行任意文件。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Win32/Kelihos&threatId=',
                                 'Win32 / Vundo:这种威胁是其一个组成部分 - 一系列程序可以提供“脱离上下文”的弹出式广告。他们还可以下载和运行文件。Vundo经常作为DLL文件传播,并在未经您同意的情况下作为浏览器帮助对象(BHO)安装在您的PC上。该系列还使用先进技术来避免检测和移除。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Vundo&threatId=100135',
                                 'MSIL / Simda:威胁可以为您的PC提供恶意黑客后门访问和控制。然后,他们可以窃取您的密码并收集有关您PC的信息。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=MSIL/Simda&threatId=',
                                 'Trojan:VBS / Tracur:是由TrojanDownloader:Win32 / Tracur.A删除的VBS组件。运行时,此脚本会将“ explorer.exe ”进程添加到Windows防火墙例外列表中,以故意降低系统安全设置。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:VBS/Tracur&threatId=-2147338377',
                                 'Win32/Kelihos:是一个发布垃圾邮件的木马家族。垃圾邮件可能包含指向安装程序的超链接Win32/Kelihos恶意软件。恶意软件可以与远程服务器通信以交换用于执行各种任务的信息,包括发送垃圾邮件,捕获敏感信息或下载和执行任意文件。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Win32/Kelihos&threatId=',
                                 'Win32/Obfuscator:这种威胁一直是“obfuscated“,这意味着它试图隐藏其目的,因此您的安全软件无法检测到它。混淆之下的恶意软件几乎可以用于任何目的。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Win32/Obfuscator&threatId=',
                                 'Trojan:Win32/Gatak:这个木马收集有关您的PC的信息并将其发送给黑客。它可以作为密钥生成器应用程序的一部分到达您的PC,或者看起来是合法应用程序的更新。详情请访问:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Gatak&threatId=-2147289564',
                                 '拟合度小于阈值,属于未知文件类型'
            ]
            self.plainTextEdit_2.setPlainText(describle_falmily[self.predict])
            if self.score <= 12:
                self.score = None
        else:
            QtWidgets.QMessageBox.information(self.centralwidget, "警告", "请上传文件",
                                              QtWidgets.QMessageBox.Yes)









在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shejizuopin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值