Python构造TCP三次握手、传输数据、四次挥手pcap数据包并打乱顺序

Python构造数据包,包含:

TCP三次握手、

传输数据、

四次挥手

实现 随机乱序TCP数据包

from scapy.all import *
from scapy.all import Ether, IP, TCP, UDP, wrpcap
from abc import ABC, abstractmethod
import random
import dpkt
from scapy.all import *

class TcpPacketStrategy(ABC):
    @abstractmethod
    def generate_packets(self, src_ip, dst_ip, src_port, dst_port, seq_num, ack_num, data=None):
        pass


class ThreeWayHandshakeStrategy(TcpPacketStrategy):
    def generate_packets(self, src_ip, dst_ip, src_port, dst_port, seq_num, ack_num, data=None):

        syn = IP(src=src_ip, dst=dst_ip) / TCP(sport=src_port, dport=dst_port, flags='S', seq=seq_num)
        syn_ack = IP(src=dst_ip, dst=src_ip) / TCP(sport=dst_port, dport=src_port, flags='SA', seq=1000,ack=syn.seq + 1)
        ack = IP(src=src_ip, dst=dst_ip) / TCP(sport=src_port, dport=dst_port, flags='A', seq=syn.seq + 1,ack=syn_ack.seq + 1)
        return [syn, syn_ack, ack]


class DataTransferStrategy(TcpPacketStrategy):
    def generate_packets(self, src_ip, dst_ip, src_port, dst_port, seq_num, ack_num, data_list=None):
        packets = []
        for data in data_list:
            packet = IP(src=src_ip, dst=dst_ip) / TCP(sport=src_port, dport=dst_port, flags='PA', seq=seq_num,ack=ack_num) / Raw(load=data)
            packets.append(packet)
            seq_num += len(data)  # 假设数据长度即为字节数
        return packets


class FourWayTeardownStrategy(TcpPacketStrategy):
    def generate_packets(self, src_ip, dst_ip, src_port, dst_port, seq_num, ack_num, data=None):
        # 客户端发送 FIN
        fin = IP(src=src_ip, dst=dst_ip) / TCP(sport=src_port, dport=dst_port, flags='FA', seq=seq_num, ack=ack_num)
        # 服务器收到 FIN 后发送 ACK
        ack1 = IP(src=dst_ip, dst=src_ip) / TCP(sport=dst_port, dport=src_port, flags='A', seq=ack_num, ack=fin.seq + 1)
        # 服务器发送 FIN
        fin2 = IP(src=dst_ip, dst=src_ip) / TCP(sport=dst_port, dport=src_port, flags='FA', seq=ack_num,ack=fin.seq + 1)
        # 客户端发送 ACK 确认
        ack2 = IP(src=src_ip, dst=dst_ip) / TCP(sport=src_port, dport=dst_port, flags='A', seq=fin.seq + 1,ack=fin2.seq + 1)
        return [fin, ack1, fin2, ack2]


class TcpPcapGenerator:
    def __init__(self, strategy: TcpPacketStrategy):
        self._strategy = strategy

    def set_strategy(self, strategy: TcpPacketStrategy):
        self._strategy = strategy

    def generate(self, src_ip, dst_ip, src_port, dst_port, seq_num, ack_num, data=None):
        return self._strategy.generate_packets(src_ip, dst_ip, src_port, dst_port, seq_num, ack_num, data)


class WriteTcpPcap:
    def writeTcpPcap(self,array):
        src_ip = array[0]
        dst_ip = array[1]
        src_port = array[2]
        dst_port = array[3]
        seq_num = array[4]
        ack_num = array[5]
        data =  array[6]

        src_ip_lastTwoDigits = "".join(array[0].split('.')[-2:])
        dst_ip_lastTwoDigits = "".join(array[1].split('.')[-2:])
        fileName = f'{src_ip_lastTwoDigits}_{dst_ip_lastTwoDigits}_{src_port}_{dst_port}_{seq_num}'
        print(fileName)

        # 生成三次握手数据包
        generator = TcpPcapGenerator(ThreeWayHandshakeStrategy())
        handshake_packets = generator.generate(src_ip, dst_ip, src_port, dst_port, seq_num, ack_num)

        # 计算初始序列号和确认号
        seq_num += 1
        ack_num = 1001

        # 生成数据传输数据包
        generator.set_strategy(DataTransferStrategy())
        data_packets = generator.generate(src_ip, dst_ip, src_port, dst_port, seq_num, ack_num,data)

        # 更新序列号和确认号
        seqAndLen = []
        for packet in data_packets:
            seqAndLen.append(seq_num)        # 表示:Sequence Number (raw), 而非:Sequence Number
            seq_num += len(packet[Raw].load)


        # 生成四次挥手数据包
        generator.set_strategy(FourWayTeardownStrategy())
        teardown_packets = generator.generate(src_ip, dst_ip, src_port, dst_port, seq_num, ack_num)

        # 合并所有数据包
        all_packets = handshake_packets + data_packets + teardown_packets

        # 写入到PCAP文件
        wrpcap(f'{fileName}.pcap', all_packets)
        print(f"PCAP file generated: {fileName}.pcap")
        print(f"seqAndLen : length:{len(seqAndLen)}, value:{seqAndLen}")


class RandomPcap:
    def randomPcap(self, file, seed, index):
        pass


class SeedRandomPcap(RandomPcap):
    def randomPcap(self, file,seed, index):
        packets =  rdpcap(file)

        packet_indices = index

        random.seed(seed)              # 随机种子
        random.shuffle(packet_indices) # 打乱列表后值固定[8, 3, 6, 14, 11, 15, 2, 12, 0, 1, 13, 10, 16, 9, 5, 4, 7]

        print(packet_indices)

        selected_packets = [packets[i] for i in packet_indices]

        for i, packet in enumerate(selected_packets, start=1):
            print(f"Packet {i}: {packet.summary()}")

        # 如果你想要将截取的报文写入新的pcap文件
        shuffledName = file.split('.')[0]

        # 使用 join() 函数拼接字符串列表
        result = ''.join([str(num) for num in packet_indices])

        wrpcap(f'{shuffledName}_{result}.pcap', selected_packets)

class SeedNoneRandomPcap(RandomPcap):
    def randomPcap(self, file,seed, index):
        packets =  rdpcap(file)

        packet_indices = index

        random.seed(seed)              # 随机种子
        random.shuffle(packet_indices) # 打乱列表后值不固定

        print(packet_indices)

        selected_packets = [packets[i] for i in packet_indices]

        for i, packet in enumerate(selected_packets, start=1):
            print(f"Packet {i}: {packet.summary()}")

        # 如果你想要将截取的报文写入新的pcap文件
        shuffledName = file.split('.')[0]

        # 使用 join() 函数拼接字符串列表
        result = ''.join([str(num) for num in packet_indices])

        wrpcap(f'{shuffledName}_{result}.pcap', selected_packets)

class ExtractRandomPcap(RandomPcap):
    def randomPcap(self, file,seed, index):
        packets =  rdpcap(file)

        packet_indices = index

        selected_packets = [packets[i] for i in packet_indices]

        for i, packet in enumerate(selected_packets, start=1):
            print(f"Packet {i}: {packet.summary()}")

        # 如果你想要将截取的报文写入新的pcap文件
        shuffledName = file.split('.')[0]

        # 使用 join() 函数拼接字符串列表
        result = ''.join([str(num) for num in index])

        wrpcap(f'{shuffledName}_{result}.pcap', selected_packets)


# 使用示例
if __name__ == "__main__":

    array = [ "192.168.1.2","192.168.1.1", 12345,80,1000,0,["Data1", "Data12", "Data123", 'Data1234', "Data12345",'Data123456','Data1234567','Data12345678','Data123456789','Data1234567890']]
    WriteTcpPcap().writeTcpPcap(array)

    array = [ "192.168.2.2","192.168.1.1", 12345,80,1000,0,["Data1", "Data12", "Data123", 'Data1234', "Data12345",'Data123456','Data1234567','Data12345678','Data123456789','Data1234567890']]
    WriteTcpPcap().writeTcpPcap(array)

    array = [ "192.168.1.2","192.168.1.1", 12345,81,1000,0,["Data1", "Data12", "Data123", 'Data1234', "Data12345",'Data123456','Data1234567','Data12345678','Data123456789','Data1234567890']]
    WriteTcpPcap().writeTcpPcap(array)

    array = [ "192.168.2.2","192.168.1.1", 12345,81,1000,0,["Data1", "Data12", "Data123", 'Data1234', "Data12345",'Data123456','Data1234567','Data12345678','Data123456789','Data1234567890']]
    WriteTcpPcap().writeTcpPcap(array)

    filePcap = '12_11_12345_80_1000.pcap'

    SeedRandomPcap().randomPcap(filePcap, 3, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])
    SeedNoneRandomPcap().randomPcap(filePcap, None, [3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

    ExtractRandomPcap().randomPcap(filePcap, 0, [3]) # 0,1,2 三次握手, 3第1个数据包
    ExtractRandomPcap().randomPcap(filePcap, 0, [12])# 12最后一个数据包
    ExtractRandomPcap().randomPcap(filePcap, 0, [4])
    ExtractRandomPcap().randomPcap(filePcap, 0, [5, 6, 7])
    ExtractRandomPcap().randomPcap(filePcap, 0, [4, 6, 10])
    ExtractRandomPcap().randomPcap(filePcap, 0, [3,9,6,7,4])




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

训练营第四十二天| 583. 两个字符串的删除操作72. 编辑距离647. 回文子串516.最长回文子序列

583. 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 示例: 输入: "sea", "eat"输出: …

QT6不自动生成pro文件

安装了QT的新版本结果他不自动生成pro文件了导致下次打开很复杂 记得在创建时选择qmake,因为新版默认cmake

宝塔软件默认安装位置

自带的JDK /usr/local/btjdk/jdk8Tomcat 各个版本都在bttomcat这个文件夹下面,用版本区分。tomcat_bak8是备份文件 /usr/local/bttomcat/tomcat8nginx /www/server/nginxnginx配置文件存放目录 /www/server/panel/vhost/nginxredis /www/server/redismysql /…

财讯杂志财讯杂志社财讯编辑部2024年第6期目录查询

财税研究 “互联网税务”模式在企业税务管理中的应用 陈飞; 1-3 国有企业税务稽查的问题与对策研究 梁涵瑜; 4-6 税务师事务所执业质量内部控制优化路径及风险防范 万晓玲; 7-9《财讯》投稿:cnqikantg126.com 基于全过程的新能源电力投资企业税务筹…

宝塔面板使用技巧(pure-FTP)上传文件和文件夹默认权限644的修改

前言 科技在进步各种各样的开源软件和库让我们应接不暇,我估计现在所有做php开发的人员都知道宝塔面板,我就经常用,但是不知道大家出现过一个问题不就是在我们开发过程中需要实时的给服务器上传我们开发的文件那么就涉及到了宝塔自带的pure-F…

BC-Linux 8.6最小化安装的服务器启用GNOME图形化界面

本文记录了BC-Linux 8.6最小化安装的服务器如何启用GNOME图形化界面的过程。 一、服务器环境 1、系统版本 [rootlocalhost ~]# cat /etc/os-release NAME"BigCloud Enterprise Linux" VERSION"8.6 (Core)" ID"bclinux" ID_LIKE"rhel fe…

央国企财务专家的“专家课”——中国总会计师协会联合实在智能举办RPA专项培训

近日,中国总会计师协会正式举办了为期五天的「财务数字化思维与实用IT技能提升」专项培训,吸引了来自中铁十五局集团有限公司、中国航空工业规划设计院、中核核电运行管理有限公司、中国北方车辆有限公司、一汽物流有限公司等国企、事业单位及民营企业共…

eclipse宝刀未老

Theia 是一个高度可定制的、开源的、基于 Web 的集成开发环境(IDE)框架。它由 Eclipse Foundation 主导,旨在为云和本地环境提供现代化的、全功能的 IDE 解决方案。Theia 的核心目标是提供一个灵活的平台,开发者可以根据自己的需求…

【ARM】MDK自动备份源文件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决MDK在编写文档的时候需要找回上一版代码的问题。 2、 问题场景 目前大部分情况下对于源代码的管理都是使用的Git等第三方的代码管理平台。这样的第三方代码管理平台都是针对与代码的版本更新进行管理。对于本地…

帕金森患者宜居环境指南,温馨舒适助康复

🌸帕金森病,优质的居住环境能极大地提升患者的生活质量。今天,就为大家分享一下帕金森患者宜居环境的几个关键点,希望每位患者都能拥有一个温馨舒适的康复空间。 🛋️首先,布局要合理。对于帕金森患者来说&…

XMLXXE实体注入

XML&XXE实体注入 原理 XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSO…

【面试干货】Java方法重写的规则

【面试干货】Java方法重写的规则 1、Java方法重写的规则2、示例代码3、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java中,方法重写(Overriding)是面向对象编程中的一个核心概念,它…

具备智能灵敏度校准并可Pin to Pin替代TSM12的电容式触摸芯片GTX312L

电容式触摸芯片 - GTX312L是一款具有智能灵敏度校准功能的12通道电容式触摸芯片,采用I2C通信协议,对各种噪音和环境的变化可靠性有保障,低功率发动机可以增加产品的使用时间,内部控制寄存器可以使用I2C读写接口。 GTX312L具有内部…

记一次 .NET某机械臂上位系统 卡死分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序会偶发性的卡死一段时间,然后又好了,让我帮忙看下怎么回事?窗体类的程序解决起来相对来说比较简单,让朋友用procdump自动抓一个卡死时的dump&#x…

windows anaconda 安装 Labelme

安装 # 创建环境 conda create -n labelme python3.6 #激活环境 conda activate labelme # 安装依赖 conda install pyqt conda install pillow # 安装labelme conda install labelme3.16.2 # 启动labelme labelme右键选择标注类型,从上到下为多边形(常…

Git分支的状态存储——stash命令的详细用法

文章目录 6.6 Git的分支状态存储6.6.1 git stash命令6.6.2 Git存储的基本使用6.6.3 Git存储的其他用法6.6.4 Git存储与暂存区6.6.5 Git存储的原理 6.6 Git的分支状态存储 有时,当我们在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态&am…

机器学习课程复习——朴素贝叶斯

1. 定义 是一种基于贝叶斯定理与特征条件独立假设的生成式分类方法。 2. 公式 原版公式 简化版公式 由于上述公式无法计算,引入条件独立假设 条件独立版公式 3. 贝叶斯分类器 由上述公式可得贝叶斯分类器 化简为 4. 参数估计 4.1. 极大似然估计 4.2. 学习与分…

电子竞赛5——作息时间控制器

一 . 题目要求 用单片机制作作息时间控制器;用四位数码管显示实时时钟(时、分,24小时制、12小时制),有秒闪,小时十位有零消隐;可用数字键或、-键校时(可快速、-)被校位&…

离线安装zabbix-agent,自制yum源方式安装

1,机器准备 现在有2台机器 机器A,能上网,ip:192.168.10.131; 机器B,不能上网,ip:192.168.10.133。 我想在机器B上面安装zabbix-agent-5.0.42版本。 大致思路 在机器A上面制作好我…

Midjourney和Stable Diffusion哪个更适合商业应用?

midjourney的绘画,在撰写有效的prompt需要精确地定义你想要展现的画面,详细描述越准确,生成出的图片结果也会越吻合你的预期。为了提升你midjourney的写作prompt的技巧,可以通过模仿他人的成功案例,亲自尝试编写&#…