Python使用策略模式生成TCP数据包

news2024/11/24 14:20:10

使用策略模式(Strategy Pattern)来灵活地生成不同类型的TCP数据包。

包括三次握手、数据传输和四次挥手。



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

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)


# 使用示例
if __name__ == "__main__":
    src_ip = "192.168.1.2"
    dst_ip = "192.168.1.1"
    src_port = 12345
    dst_port = 80
    seq_num = 1000
    ack_num = 0

    # 生成三次握手数据包
    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, ["Hello", "World", "Data"])

    # 更新序列号和确认号
    for packet in data_packets:
        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('tcp_traffic.pcap', all_packets)
    print("PCAP file generated: tcp_traffic.pcap")

PCAP file generated: tcp_traffic.pcap

解释:syn = IP(src=src_ip, dst=dst_ip) / TCP(sport=src_port, dport=dst_port, flags='S', seq=seq_num)

这行代码的作用如下:

  1. IP 层部分 IP(src=src_ip, dst=dst_ip)

    • IP 是 Scapy 中用于生成 IP 层数据包的类。
    • src=src_ip 指定了 IP 数据包的源 IP 地址,它是数据包的发送方的 IP 地址。
    • dst=dst_ip 指定了 IP 数据包的目的 IP 地址,它是数据包的接收方的 IP 地址。
  2. TCP 层部分 TCP(sport=src_port, dport=dst_port, flags='S', seq=seq_num)

    • TCP 是 Scapy 中用于生成 TCP 层数据包的类。
    • sport=src_port 指定了 TCP 数据包的源端口号,这是发送方的端口号。
    • dport=dst_port 指定了 TCP 数据包的目的端口号,这是接收方的端口号。
    • flags='S' 设置了 TCP 标志位为 SYN (S),表示这是一个 SYN 数据包,用于发起一个新的 TCP 连接。
    • seq=seq_num 设置了 TCP 数据包的序列号,通常在建立连接时初始值随机生成。
  3. 组合 IP 和 TCP 部分

    • IP(...) / TCP(...) 是 Scapy 中的一个语法,表示将 IP 层和 TCP 层的部分组合在一起,构成一个完整的数据包。
    • 斜杠 / 操作符在 Scapy 中用于将不同层的协议组合在一起,形成一个完整的分层数据包。

这行代码创建了一个源 IP 地址为 src_ip,目的 IP 地址为 dst_ip,源端口为 src_port,目的端口为 dst_port,标志位为 SYN,序列号为 seq_num 的 TCP SYN 数据包。这个数据包用于发起一个新的 TCP 连接,通常是 TCP 三次握手的第一步。

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

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

相关文章

网络安全技术实验六 入侵检测技术实践

一、实验目的和要求 理解基于网络的入侵检测系统的基本原理,掌握snort IDS工作机理; 学习应用snort三种方式工作;熟练编写snort规则; 完成snort数据包记录、日志查看、字符串匹配、ARP欺骗攻击检测、端口扫描工具检测等功能。 …

微信小游戏插件申请,微信小程序插件管理

微信小游戏的插件申请与小程序不一样,官方没有提供一个统一的管理入口进行申请插件,以及查看插件,没有小程序方便的; 小程序申请查看插件入口如下图所示: 小游戏的插件可以通过以下的方式进行申请: 如下…

代码随想录-Day31

455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都…

OpenCV形态学

什么事形态学处理 基于图像形态进行处理的一些基本方法; 这些处理方法基本是对二进制图像进行处理; 卷积核决定着图像出来后的效果。 一 图像二值化 什么是二值化 将图像的每个像素变成两种值,如0,255. 全局二值化。 局部二值化。 thres…

小学奥数-图像找规律之招聘测评题

文章目录 长得差不多平移(1)(2) 旋转规律(1) 翻转规律 长得有点不一样叠加 参考 比如腾讯给他投简历之后会发一个在线测评,这些题目有和公务员考试很像的 长得差不多 几张图长得差不多的时候&a…

TCP/IP协议深入解析,初学者必看!

简介 在信息技术飞速发展的今天,网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础,TCP/IP协议确保了全球范围内的数据交换和信息共享。 TCP/IP(传输控制协议/网际协议)是…

大数据实训项目(小麦种子)-01、VirtualBox安装与Centos7系统安装

文章目录 前言项目介绍项目任务目标一、VirtualBox安装1.1、认识VirtualBox1.2、VirtualBox的下载安装 二、VirtualBox安装Centos7系统2.1、VirtualBox安装Centos72.2、Centos7配置静态IP地址2.3、Centos7环境基础配置 三、Windows安装FinalShell及连接Centos73.1、FinalShell下…

神经网络学习2

张量(Tensor)是深度学习和科学计算中的基本数据结构,用于表示多维数组。张量可以看作是一个更广义的概念,涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说,张量的维度可以是以下几种形式: 标量&am…

环保评A的意义与价值

环保评A,这个看似简单的称谓,背后却蕴藏着深厚的环保理念和实践标准。在当今社会,环保已经成为一项全球性的议题,各国都在努力推动绿色发展,实现可持续发展目标。那么,环保评A究竟是全国性的认证还是地方性…

在VMware中安装CentOS7(超详细的图文教程)

1、CentOS7的下载 官网下载地址:Download。 进入CentOS下载官网,找到64位的CentOS7版本。 点进来后,发现它给我们列出了所在区域可用镜像源(可以说是非常的良心的),我们随便选择一个,这里以阿…

Git使用-gitlab上面的项目如何整到本地的idea中

场景 一般我们在开发项目或者接手某个项目时,基本都要接触Git,比如上传项目代码,下载同事给你的交接代码等等。 这是一个基本功,小小整理一下日常操作中的使用。 第一步:在 GitLab 上找到你要克隆的项目,复…

C#传值参数 -1值类型 -2引用类型

传值参数 -1值类型 -2引用类型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //传值参数-1、值类型 2、引用类型 namespace PamatetersExample {class Program{static void Main(string[] args){St…

【odoo15】前端自定义模态弹窗

概要 在odoo15或者在15之前,odoo前端的owl框架还没完全替换当前前端框架的时候,我们很多时候都是用js或者jq来直接操作dom,那么我们如果需要在前端用到一个模态弹窗,可以怎么解决呢? 方法1 直接用js原生的模态弹窗&am…

CMU最新论文:机器人智慧流畅的躲避障碍物论文详细讲解

CMU华人博士生Tairan He最新论文:Agile But Safe: Learning Collision-Free High-Speed Legged Locomotion 代码开源:Code: https://github.com/LeCAR-Lab/ABS B站实际效果展示视频地址:bilibili效果地址 我会详细解读论文的内容,让我们开始吧…

基于Python+OpenCV+SVM车牌识别系统(GUI界面)【W3】

简介: 随着交通管理的日益复杂化和智能化需求的增加,车牌识别系统在安防、智慧交通管理等领域中扮演着重要角色。传统的车牌识别系统主要基于图像处理和模式识别技术,随着计算机视觉技术的发展,基于Python、OpenCV和机器学习算法的…

用于以太网PLC的跨网段无线WIFI通讯,IP地址转换

产品型号:NET50-NAT-W 使用范围:用于以太网PLC的跨网段无线WIFI通讯 产品介绍 工业通讯桥接器(NET50-NAT-W)用于以太网设备(PLC,数控,机器人等)的IP地址跨网段转换和无线WIFI通讯。…

Java | Leetcode Java题解之第151题反转字符串中的单词

题目: 题解: class Solution {public String reverseWords(String s) {StringBuilder sb trimSpaces(s);// 翻转字符串reverse(sb, 0, sb.length() - 1);// 翻转每个单词reverseEachWord(sb);return sb.toString();}public StringBuilder trimSpaces(S…

去掉eslint

1、在vue.config.js文件里加上下面的代码,然后重启就可以了! 2、vue.config.js文件代码: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,lintOnSave: false })

小数二分个人见解

小数二分 小数二分题目 小数二分 整数二分 是找边界点,而小数二分找的是 近似值。 整数二分是在一个整型数组当中 查找,而小数二分是在数轴中 查找,都是每次可以排除一半的区间,只不过小数二分中while循环内的结束条件和整数二分…

酒店民宿小程序开发,旅游业发展下的商业机遇

随着人们生活水平的日益提高,对各种娱乐方式的需求在不断上升,其中旅游成为了大众的“新宠”。旅游业的快速发展也推动了酒店民宿的蓬勃发展,打造一个便捷高效的线上酒店民宿小程序成为了至关重要的发展趋势! 如今,不…