目 录
摘 要 I
ABSTRACT II
1 绪论 1
1.1 研究背景与意义 1
1.2 国内外研究现状 2
1.3 技术路线 3
2 相关知识背景 5
2.1 恶意代码检测概述 5
2.2 深度学习技术基础 6
2.2.1卷积神经网络基本结构 7
2.2.2激活 7
2.2.3池化 8
3 基于卷积神经网络的恶意代码分类方法 10
3.1 卷积神经网络的恶意代码分类 10
3.1.1卷积网络结构 10
3.1.2 深度学习分类器 11
3.2公共数据集介绍 11
3.3数据预处理 12
3.4 评价指标 16
3.5 实验环境介绍 17
3.6 实验数据展示 18
3.6.1 实验结果与分析 18
3.6.3 TensorBoard可视化 18
4 交互页面展示 21
4.1 界面分析总框架 21
4.2 效果展示系统的设计与实现 21
4.2.1 开发环境 21
4.2.2 系统设计 22
4.2.3 系统功能实现 22
参考文献 26
致 谢 28
利用深度学习中的卷积神经网络对恶意代码图像进行处理,可以实现图像特征的自动化提取,摆脱专家根据经验手工提取特征的缺点,实现端到端的自动检测,同时利用恶意代码图像层面的特征,提取更全面的信息,能够提高检测精度。
1.3 技术路线
经过设计和优化,构建了一个针对恶意代码家族的分类系统。系统采用了以下步骤,包括恶意代码的图像化处理、特征提取以及卷积神经网络建模,显著提升了恶意代码的识别精度和用户的防范意识。
首先,将复杂的代码转化为易于处理的图像形式。这一步骤突破了传统文本分析的局限,使得恶意代码的特征能够更加直观和全面地展现出来。接下来,利用高效的特征提取方法,从转换后的图像中捕捉恶意代码的关键特征。最后,借助卷积神经网络建模技术,对这些特征进行深度学习和分析。通过训练和优化神经网络模型,我们成功地构建了一个能够识别恶意代码家族的智能系统。该系统能够快速准确地识别出恶意代码,还能对其家族归属进行分类。详细技术路线如图1.1所示。
在这里插入图片描述

图1.1 技术路线图

# -*- 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)









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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐