Python实现基于卷积神经网络的恶意代码分类系统

目 录
摘 要 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)









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

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shejizuopin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值