基于深度学习检测恶意流量识别框架(80+特征/99%识别率)

news2024/11/23 10:44:30

基于深度学习检测恶意流量识别框架

目录

    • 基于深度学习检测恶意流量识别框架
    • 简要
    • 示例
      • a.检测攻击类别
      • b.模型训练结果输出参数
      • c.前端检测页面
      • d.前端训练界面
      • e.前端审计界面(后续更新了)
      • f.前端自学习界面(自学习模式转换)
        • f1.自学习模式
    • 核心代码示例
      • a.代码结构
      • b.数据预处理
      • c.抓包模块
      • d.数据库操作
      • e.全局变量实现

简要

内容说明
使用语言Python
训练数据2800w
支持检测攻击方式26种
深度学习库keras
Loss值0.0023
准确值99.9%
检测方式实时检测
数据库Sqlite
呈现方式CS架构/web页面
附加功能流量自学习训练模式(工作模式:对应正常流量,攻击模式:对应?ATTACK)

示例

a.检测攻击类别

在这里插入图片描述

b.模型训练结果输出参数

在这里插入图片描述

c.前端检测页面

在这里插入图片描述

d.前端训练界面

在这里插入图片描述

e.前端审计界面(后续更新了)

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

f.前端自学习界面(自学习模式转换)

f1.自学习模式

这里解释下:这里有两个模式,开启工作模式后,确保当前流量为正常流量,系统会自动标记并在达到阈值后进行训练,从而增加泛化能力,反之。

在这里插入图片描述

进度条显示内容解释:当前|总进度|训练轮数|源数据
在这里插入图片描述

核心代码示例

a.代码结构

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

b.数据预处理

def __serial(self,debug=0):
        self.data['Timestamp'] = self.data['Timestamp'].apply(lambda x: self.__timestamp_to_float(x))
        self.data['Dst_IP'] = self.data['Dst_IP'].apply(self.__ip_to_float)
        self.data['Src_IP'] = self.data['Src_IP'].apply(self.__ip_to_float)
        if debug:
            self.__pull(self.data,"d1.txt")
        self.data["Label"] = self.data["Label"].apply(self.__label_to_float)
        columns_to_convert = [col for col in self.data.columns if col not in ['Timestamp', 'Dst_IP', 'Src_IP',"Label"]]
        for col_name in columns_to_convert:
            self.data[col_name] = pd.to_numeric(self.data[col_name], errors='coerce')
        self.data = self.data.apply(pd.to_numeric, errors='coerce')
        self.data = self.data.fillna(0)
        inf_values = ~np.isfinite(self.data.to_numpy())
        self.data[inf_values] = np.nan  # 替换为NaN,您也可以选择替换为其他合理值
        self.data = self.data.dropna()  # 删除包含缺失值的行
        self.features = self.data.iloc[:, :-1]
        self.labels = self.data.iloc[:, -1]  # 标签
        if debug:
            self.__pull(self.data,"d2.txt")
        self.scaler = StandardScaler()
        self.features = self.scaler.fit_transform(self.features)
    

c.抓包模块

def packet_to_dict(packet):
    packet_dict = {}
    if const.cdist[const.pkg_id] > const.cdist[const.max_pkgn]:
        const.cdist[const.pkg_id] = 0
    packet_dict["data"] = packet
    packet_dict["id"] = const.cdist[const.pkg_id]
    const.cdist[const.pkg_id] +=1
    if IP in packet:
        packet_dict["src_ip"] = packet[IP].src
        packet_dict["dst_ip"] = packet[IP].dst
    else:
        packet_dict["src_ip"] = ""
        packet_dict["dst_ip"] = ""
    return packet_dict

def write_packet_summary(filename, packet_summary):
    with open(filename, 'a') as file:
        file.write(packet_summary + '\n')

def listen(key,qkey,filename):

    # 定义回调函数来处理捕获到的数据包
    def packet_callback(packet):
        try:
            packet_info = packet_to_dict(packet)
            if packet_info != {}:
                const.cdist[qkey].put(packet_info)
        except Exception as e:
            log.Wlog(3,f"listen* {e}")
        try:
            timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S:%f')[:-3]
            summary = packet.summary()
            packet_with_timestamp = f"[{timestamp}] >> {summary}"
            write_packet_summary(filename, packet_with_timestamp)
            maintain_packet_summary(filename, max_lines=20)
        except Exception as e:
            log.Wlog(3, f"listen* {e}")
        # return packet.summary()

    # 定义停止条件函数
    def stop_condition(packet):
        # print(const.cdist[key],key)
        return const.cdist[key]

    # 开始捕获数据包,使用 stop_filter 参数指定停止条件
    sniff(
        iface=const.cdist[const.net_interface],
        prn=packet_callback,
        stop_filter=stop_condition
    )

d.数据库操作

def data_init():
    # 连接到数据库,如果不存在则创建
    conn = sqlite3.connect(const.cdist[const.sql_dbp])

    # 创建游标对象
    cur = conn.cursor()

    # 创建数据表
    cur.execute('''CREATE TABLE IF NOT EXISTS pkg_data (
                    id INTEGER PRIMARY KEY,
                    src_ip TEXT,
                    dst_ip TEXT,
                    data TEXT,
                    time1 INTEGER,
                    label INTEGER
                    )''')
    cur.close()
    conn.close()
    
def get_sql_cur():
    # 连接到数据库,如果不存在则创建
    conn = sqlite3.connect(const.cdist[const.sql_dbp])

    # 创建游标对象
    cur = conn.cursor()
    return cur,conn
def close_sql(cur,conn):
    try:
        cur.close()
        conn.close()
    except:
        pass
# 添加数据pkg_data
def add_data(src_ip, dst_ip, data, time1, label):
    cur,conn = get_sql_cur()
    cur.execute("INSERT INTO pkg_data (src_ip, dst_ip, data, time1, label) VALUES (?, ?, ?, ?, ?)", (src_ip, dst_ip, data, time1, label))
    conn.commit()
    close_sql(cur,conn )

# 删除指定 src_ip 的数据
def delete_data(src_ip):
    cur,conn = get_sql_cur()
    cur.execute("DELETE FROM pkg_data WHERE src_ip=?", (src_ip,))
    conn.commit()
    close_sql(cur,conn )

# 查询指定时间戳范围内的域名及出现次数
def query_data_k1(start_timestamp, end_timestamp):
    cur,conn = get_sql_cur()
    cur.execute("SELECT src_ip, COUNT(*) FROM pkg_data WHERE time1 BETWEEN ? AND ? GROUP BY src_ip", (start_timestamp, end_timestamp))
    rows = cur.fetchall()
    close_sql(cur,conn )
    return rows

e.全局变量实现

# const.py
cdist = {}
def _const_key_(key, value):
    cdist[key] = value

# run.py
def init():
    odir = os.getcwd()
    signal.signal(signal.SIGINT, quit)                                
    signal.signal(signal.SIGTERM, quit)
    const._const_key_(const.log_path, f"{odir}/plug/utils.log")
    const._const_key_(const.temp_pkg, f"{odir}/plug/temp.pkg")
    const._const_key_(const.out_csv_d, f"./temp_pkg_data/csv/")
    const._const_key_(const.out_pcap_d, f"./temp_pkg_data/pcap/")
    const._const_key_(const.train_info,f"{odir}/plug/train.info")
    const._const_key_(const.sql_dbp,f"{odir}/plug/pkg_data.db")
    const._const_key_(const.out_atrain_d,f"./temp_pkg_data/atrain/")
    const._const_key_(const.Base_h5,f"{odir}/2800w-base.h5")
    const._const_key_(const.deeps,deep_s.DeepS())
    const._const_key_(const.AddTrain_Stream_Mode,{"mode":0,"args":"","key":"","label":"","csvp":"","echo":0}) # 0不进行模式,1进行正常流量训练
    const._const_key_(const.Pkg_DATA_List,[])
    const._const_key_(const.max_pkgn,2000)
    const._const_key_(const.MAX_ADDTrain_n,10241)
    const._const_key_(const.pkg_id,0)
    const._const_key_(const.log_level, 3)
    const._const_key_(const.queue1, Queue(maxsize=65535))  # 创建队列
    data.data_init()
    f= open(const.cdist[const.train_info], 'w')
    f.close()
    CronWork(100,odir)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1640475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 element-plus 让el-container占满屏幕

在刚开始用element-plus的布局时&#xff0c;发现无法占满屏幕&#xff1a; 在App.vue中添加如下css代码&#xff1a; <style>html, body, #app {margin: 0;padding: 0;height: 100%;} </style>同时布局代码所在的component如下所示&#xff1a; <template&g…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-8.1--C语言LED驱动程序

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

对stm32F103RCT6原理图解析(详细)

最近想了解一下原理图为什么这样设计&#xff0c;又发现网上虽然有相关的解析&#xff0c;但是不全面&#xff0c;所以唉还是自己动手&#xff0c;丰衣足食吧。 MCU部分 核心芯片STM32F103RCT6 (8条消息) stm32命名规则_BachelorTse的博客-CSDN博客 这里有芯片相关的命名规则…

在Windows中,matplotlibcpp的使用

0 前言 本篇文章记录一个c库的使用&#xff1a;matplotlib-cpp&#xff0c;其作用是在c中调用python的matplotlib&#xff0c;实现绘图操作。 对于Windows环境下使用该库的文章&#xff0c;发现文章依然存在一些问题&#xff0c;总是存在报错不能解决&#xff0c;花费了较多的…

QT的TcpServer

Server服务器端 QT版本5.6.1 界面设计 工程文件&#xff1a; 添加 network 模块 头文件引入TcpServer类和TcpSocket&#xff1a;QTcpServer和QTcpSocket #include <QTcpServer> #include <QTcpSocket>创建server对象并实例化&#xff1a; /*h文件中*/QTcpServer…

Python根据预设txt生成“你画我猜”题目PPT(素拓活动小工具)

Python根据预设txt生成“你画我猜”题目PPT&#xff08;素拓活动小工具&#xff09; 场景来源 去年单位内部的一次素拓活动&#xff0c;分工负责策划设置其中的“你画我猜”环节&#xff0c;网络上搜集到题目文字后&#xff0c;想着如何快速做成对应一页一页的PPT。第一时间想…

观察者模式实战:解密最热门的设计模式之一

文章目录 前言一、什么是观察者模式二、Java实现观察者模式2.1 观察者接口2.2 具体观察者2.3 基础发布者2.4 具体发布者2.5 消息发送 三、Spring实现观察者模式3.1 定义事件类3.2 具体观察者3.3 具体发布者3.4 消息发送 总结 前言 随着系统的复杂度变高&#xff0c;我们就会采…

Google 发布 CodeGemma 7B,8K上下文,性能超CodeLlama 13B

CodeGemma简介 CodeGemma模型是谷歌的社区开放编程模型&#xff0c;专门针对代码领域进行优化。一系列功能强大的轻量级模型&#xff0c;能够执行多种编程任务&#xff0c;如中间代码填充、代码生成、自然语言理解、数学推理和指令遵循。CodeGemma模型是在大约500B个主要为英语…

【算法入门教育赛1D】环形密码 - 字符串 | C++题解与代码

题目链接&#xff1a;https://www.starrycoding.com/problem/161 题目描述 小 e e e有一个宝箱&#xff0c;这个宝箱有一个长度为 n n n的密码&#xff0c;但是这个密码校验器是一个环形&#xff0c;意思是只要密码从任意一位开始读&#xff08;读到最后一位回到第一位继续&a…

每日OJ题_贪心算法二⑤_力扣870. 优势洗牌(田忌赛马)

目录 力扣870. 优势洗牌&#xff08;田忌赛马&#xff09; 解析代码 力扣870. 优势洗牌&#xff08;田忌赛马&#xff09; 870. 优势洗牌 难度 中等 给定两个长度相等的数组 nums1 和 nums2&#xff0c;nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引…

Redis - Zset 有序集合

前言 它保留了集合不能有重复成员的特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数&#xff08;score&#xff09;与之关联&#xff0c;有序集合中的元素是可以维护有序性的&#xff0c;但这个有序不是⽤下标作为排序依据⽽是…

笔记13-OSError: [Errno 24] Too many open files

文章目录 参考文献失败尝试系列查看发现&#xff0c;似乎是因为线程数有限制 修改配置先查查看 增加文件数限制&#xff0c;然后使用命令运行&#xff08;成功&#xff09; 参考文献 Linux 最大可以打开多少文件描述符&#xff1f; OSError: [Errno 24] Too many open files错…

Redis-单机安装

试图从官网注册不了我也不知道什么情况。 网盘自取吧&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1KERBQaH9gCT10AGt9z0_jg?pwdyjen 安装比较简单&#xff0c;照着敲就完了每一步都试过了&#xff0c;先单机安装&#xff0c;后面搭建集群。 1.将安装包放到/usr/…

一文带你了解MySQL的索引分类

文章目录 ☃️分类☃️演示图☃️思考☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开…

C++之set/map相关实现

看着上面的图片&#xff0c;你可能对set和map的多样变化产生疑惑&#xff0c;下面我们就来详细讲解他们的区别以及实现 一.set/map 首先&#xff0c;在这里我们要声明&#xff0c;如果你对二叉搜索树一点都不了解的话&#xff0c;建议你先去将搜索二叉树学会再来学习这里的内…

MFC 列表控件删除实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载) 》 2、程序功能选中列表控件某一项&#xff0c;删除按钮由禁止变为可用&#xff0c;点击删除按钮&#xff0c;选中的项将删除。 3、首先在主界面添加一个删除参数按钮。 4、在myDlg.cpp 文件…

Python语言零基础入门——文件

目录 一、文件的基本概念 1.文件 2.绝对路径与相对路径 3.打开文件的模式 二、文件的读取 三、文件的追加 四、文件的写入 五、with语句 六、csv文件 1.csv文件的读取 2.csv文件的写入 七、练习题&#xff1a;实现日记本 一、文件的基本概念 1.文件 文件是以计算…

win10禁止自动更新的终极方法

添加注册表值 1.运行&#xff0c;输入regedit 2.打开注册表编辑器依次进入以下路径“计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”。 3.在Settings项中&#xff0c;新建DWORD&#xff08;32位&#xff09;值(D)&#xff0c;重命名为以下命名“Fl…

python判断大图中包含小图并输出位置总结

python判断大图中包含小图并输出位置总结 没啥可说的&#xff0c;项目遇到了就直接上代码&#xff0c;可以减轻劳动力&#xff0c;花最少得时间实现应用功能。 import cv2 # 读取大图片和小图片的路径 img_big cv2.imread(big_image.png) img_small cv2.imread(small_image…

使用protoc-jar-maven-plugin生成grpc项目

在《使用protobuf-maven-plugin生成grpc项目》中我们使用protobuf-maven-plugin完成了grpc代码的翻译。本文我们将只是替换pom.xml中的部分内容&#xff0c;使用protoc-jar-maven-plugin来完成相同的功能。总体来说protoc-jar-maven-plugin方案更加简便。 环境 见《使用proto…