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

news2024/11/25 4:34:33

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.coloradmin.cn/o/1835593.html

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

相关文章

全氟己酮自动灭火材料表现亮眼!手把手教你自动灭火毯的使用方法

灭火毯的使用方法是什么?很多朋友在购买灭火毯之前,都比较关心这个问题。在这里,我们可以把灭火毯分为两种。一种是传统灭火毯,还有一种是近年来兴起的高科技产品—全氟己酮自动灭火毯。这两种灭火毯的使用方法大有不同&#xff0…

图解ZGC

ZGC(Z Garbage Collector) 是一款性能比 G1 更加优秀的垃圾收集器。ZGC 第一次出现是在 JDK 11 中以实验性的特性引入,这也是 JDK 11 中最大的亮点。在 JDK 15 中 ZGC 不再是实验功能,可以正式投入生产使用了,使用 –X…

智能网站管理系统

智能网站管理系统,即智能化的网站管理工具,是为了提高网站管理效率和简化操作流程而开发的一种软件系统。它集合了各种先进的技术和功能,为网站管理员提供了一套强大而可靠的解决方案。 智能网站管理系统的核心功能是网站内容管理。传统的网站…

tqdm 进度可视化

下载安装包 pip install tqdmor conda install tqdm代码案例 from tqdm import tqdm # 直接传入参数 for i in tqdm([1s,2s,3s,4s]):print(i)# 结合range for i in tqdm(range(100)):print(i)应用 可视效果

idea intellij 2023打开微服务项目部分module未在左侧项目目录展示(如何重新自动加载所有maven项目model)

项目场景: springcloud微服务项目,部分模块暂时不需要用到,就在pom.xml文件中注释掉相应的模块,突然有一天打开项目,部分项目module 在idea intellij工具左侧文件夹找不到了,重新file->open本地项目也还是部分模块…

最短路径和最小生成树

一眼看,求最小生成树的 prim 算法和求单源最短路径的 dijkstra 算法非常像,事实上它们也确实是一回事,贪心策略,不同的是,dijkstra 算法每次加入一个到达源 S 最短的点,而 prim 则加入到达已生成 tree 最短…

【C语言】初阶指针

目录 Ⅰ、指针是什么? 总结: Ⅱ、指针和指针类型 1 .指针-整数 2.指针的解引用 Ⅲ、野指针 1 .野指针成因 2 如何规避野指针 Ⅳ、指针运算 1 .指针 - 整数 2. 指针 - 指针 3. 指针的关系运算 Ⅴ、指针和数组 Ⅵ、二级指针 Ⅶ、指针数组 指针 1. 指针是…

mysql下载安装教程(图文详细版)

如果一次没成功的话,就删掉重安(前提是清理干净)(up就下了好几次,在错误中找到答案) navicat(可视化工具)在其他文章里 一、mysql下载 进入官网地址https://www.mysql.com/downloads/ 然后就开始下载了&…

Git的3个主要区域

一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区 Index / Stage:暂存区 Reposito…

Nginx 搭建 lnmp

一.编译安装Nginx 1.新建用户前期准备 官网下载nginx安装包 https://nginx.org/en/download.html yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel #安装依赖包 useradd -M -s /sbin/nologin nginx #新建nginx用户便于管理 2.切换到/opt…

idea插件开发之一起来开发个map转对象的插件吧!

写在前面 源码 。 在实际工作中,经常有这样的场景,从map中获取值来赋值到某个对象上,这无疑是一个重复的劳动,本文来尝试通过编写一个这样的插件,让插件来帮我们写代码,不管是有1个属性,还是有…

创维超充车辆交付仪式暨参观座谈会圆满举行

6月14日,创维超充车辆交付仪式暨参观座谈会在南京成功举行。苏舜集团副总经理程璟一行以及近多出行东部大区总经理张显春一行齐聚一堂。创维汽车总裁、联合创始人吴龙八等领导亲临现场,对各位尊贵嘉宾的到来表示热烈欢迎,并与众人共同见证了这…

RAM和ROM

1,RAM和ROM区别 RAM和ROM都是由来存储的,比如CPU缓存,电脑和手机内存等属于RAM,而固态硬盘,U盘,手机的128G,256G存储空间等都属于ROM。他们的最主要区别是RAM在断电后存储数据就没有了,而ROM在断电后存储数…

Java基础面试题自测

文章目录 一、Java 中有哪 8 种基本数据类型?说说这 8 种基本数据类型对应的包装类型?二、包装类型的常量池技术了解么?三、为什么要有包装类型?四、什么是自动拆装箱?原理?四、遇到过自动拆箱引发的 NPE 问…

Ps:脚本与动作

有三种脚本语言可用于编写 Photoshop 脚本:AppleScript(macOS)、JavaScript 和 VBScript(Windows)。 Photoshop 脚本文件默认文件夹 Win:C:\Program Files\Adobe\Adobe Photoshop 2024\Presets\Scripts Mac…

无线麦克风推荐哪些品牌?一文读懂家用无线麦克风哪个牌子好!

​在这个充满创意与表达的时代,无线领夹麦克风以其独特的魅力,成为了声音创作者们的得力助手。它小巧便携,功能强大,无论是日常拍摄、直播互动还是专业演出,都能轻松应对,让你的声音随时随地清晰传递。那么…

PIL保存后的图像莫名的失真,部分不失真部分很失真

原图片是这样的: PIL会自行**“自救”被正则化的图片,导致自救过曝,部分颜色非常失真,但是部分又保存的还行。现象如下: 这里你检查一下你保存的是不是被正则化的图片**,如果是,改改。 查看一…

长难句打卡6.17

At a time when Thomas Piketty and other economists are warning of rising inequality and the increasing power of inherited wealth, it is bizarre that wealthy aristocratic families should still be the symbolic heart of modern democratic states. 在托马斯皮凯…

基于Java的二手手机回收平台系统

开头语: 你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JavaJSPServlet 工具:IDEA/Eclipse、Navicat、Maven 系统展…

Postman接口测试之postman设置接口关联,实现参数化

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结…