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