使用Python构造数据包

article/2025/10/8 14:18:01

一、socket函数

在这里插入图片描述

1、socket函数参数及方法

1)参数

Python 中,用 socket()函数来创建套接字,语法格式如下

socket.socket([family[, type[, proto]]])

· family: 套接字家族可以使 AF_UNIX 或者 AF_INET。
· type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM。
· protocol: 一般不填默认为 0。
https://gist.github.com/kevinkindom/108ffd675cb9253f8f71

2)方法

https://www.runoob.com/python/python-socket.html

2、TCP/UDP通讯

该方法自动补充MAC、IP、TCP包头,意味着我们需要填充的是包结构图中的 [ 数据 ]

1)send_udp_tcp.py

import argparse
import socket  parser = argparse.ArgumentParser(description='Client')
parser.add_argument('--TCP_UDP', type=str, default='UDP')
parser.add_argument('--src_ip', type=str, default='172.16.200.1')
parser.add_argument('--dst_ip', type=str, default='172.16.200.2')
parser.add_argument('--dst_port', type=int, default=31500)
parser.add_argument('--send_times', type=int, default=10)
args = parser.parse_args()if args.TCP_UDP == 'UDP':s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# s.bind((args.src_ip,0))                                                   # in windowss.setsockopt(socket.SOL_SOCKET, 25, 'ens3f0'.encode(encoding="utf-8"))      # in linuxprint("now using:"+str(args.TCP_UDP))print("src_ip:"+str(args.src_ip))print("dst_ip:"+str(args.dst_ip))print("dst_port:"+str(args.dst_port))print("send_times"+str(args.send_times))print("send data begin")for i in range(args.send_times):  s.sendto("test udp".encode(encoding="utf-8"), (args.dst_ip, args.dst_port)) print("send ok")  s.close() elif args.TCP_UDP == 'TCP' : # TCP尚未测试print("now using:"+str(args.TCP_UDP))print("src_ip:"+str(args.src_ip))print("dst_ip:"+str(args.dst_ip))print("dst_port:"+str(args.dst_port))print("send_times"+str(args.send_times))print("send data begin")s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  try:s.connect((args.dst_ip, args.dst_port)) except Exception:print("server port not connect!")for i in range(args.send_times):s.send('test tcp')print("send ok")s.close()else:print("error TCP/UDP type")

2)recv_udp_tcp.py

import argparse
import socket  parser = argparse.ArgumentParser(description='Server')
parser.add_argument('--TCP_UDP', type=str, default='UDP')
parser.add_argument('--my_ip', type=str, default='172.16.200.2')
parser.add_argument('--my_port', type=int, default=31500)
args = parser.parse_args()if args.TCP_UDP == 'UDP':s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind((args.my_ip, args.my_port))print("now using:"+str(args.TCP_UDP))print("my_ip:"+str(args.my_ip))print("my_port:"+str(args.my_port))print("recv data begin")while True:  data, addr = s.recvfrom(2048)datas = str(data,encoding='utf-8')print("received:" + datas + "\n")# print("received:" + data + "\nfrom:" + addr)s.close()elif args.TCP_UDP == 'TCP' : # TCP尚未测试s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  s.bind((args.my_ip, args.my_port)) print("now using:"+str(args.TCP_UDP))print("my_ip:"+str(args.my_ip))print("my_port:"+str(args.my_port))print("recv data begin")s.listen(5)ss, addr = s.accept() # 被动接受TCP客户端连接,(阻塞式)等待连接的到来print('got connected from',addr)ra = ss.recv(512)print(ra)ss.close()s.close()else:print("error TCP/UDP type")

3、自行构造数据包

1)自行构造TCP部分及后面数据

意味着我们需要填充的是包结构图中的 [ TCP包头 | 数据 ]

需要使用RAW SOCKET 通信,AF_INET表示使用IPv4协议(自动补充以太网和IPv4部分),socket.SOCK_RAW指TCP及后面自行构造,NGA_TYPE指IPv4部分协议类型,6表示下一个部分为TCP,17表示下一个部分为UDP,一般自行构造NGA_TYPE=18

import socket  s = socket.socket(socket.AF_INET, socket.SOCK_RAW, NGA_TYPE) 
nga = struct.pack( # ngaa包头部分'!IbbIbI',  # I 表示unsigned int(4byte), b表示signed char(1byte), !表示顺序解析worker_id,degree,0,aggindex,switch_id,sequence + pkt_id)
s.sendto(nga, (self.dst_ip, 0))

2)自行构造IP部分及以后

也即是说,需要填充的是上图中的 [ IP包头 | TCP包头 | 数据 ] 的内容

socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))

3)完全自行构造

意味着我们需要填充的是上图中的 [ MAC包头 | IP包头 | TCP包头 | 数据 ] 的内容

socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))

4、指定网卡

https://stackoverflow.com/questions/8437726/can-python-select-what-network-adapter-when-opening-a-socket

二、参考资料

https://www.cnblogs.com/JenningsMao/p/9487465.html


http://chatgpt.dhexx.cn/article/dZCoc6HU.shtml

相关文章

30、IP数据包结构

本节来学习IP数据包的结构,前面我们一直在说数据包,IP数据包是网络层的PDU。PDU的概念我们在本专栏第2节的内容中谈到过,忘记了就赶快去复习。数据包也被称为“IP数据报”或者“IP分组”,这三个概念是通用的,到任何一本…

ipv4数据包结构

第一行: 1.version,IP协议版本号,代表IPV4,大小为4个bit 2.IHL,代表IP包头的大小,大小为4个bit(其中一个bit代表32bit),IHL最小值为4最大值为15,所以IPV4大小在20个字节…

scapy定制数据包详解

今天继续给大家介绍渗透测试相关知识,本文主要内容是scapy定制数据包详解。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 一、scapy介绍 scapy是一个可以让…

OSPF——数据包

OSPF的数据包协议 OSPF协议是一个跨四层封装协议,三层协议号为 — 89 OSPF头部内容 版本 — OSPF的版本 — 在ipv4网络环境下,一般使用OSPFV2,所以,对应的版本字段为2 类型 — OSPF数据包的类型 hello — 1 DBD — 2 LSR — 3 LS…

IPV4数据包

IPV4数据包: 中文版本: 共6行,每一行是32个bit,也就是4个字节。 Version:版本 所占空间4bit 默认值为0100 IHL: ip header length ip头部长度 4bit ip包头一般来说是20字节 最后一行options和padding在默认的ipv4数据包中是空的 Ihl中每一个数值的单位是32bit 默认值0101…

IP数据包格式

目录 网络层功能 ICMP协议 ICMP作用 ICMP功能 冲突域 广播域 arp协议 工作原理 网络层功能 定义了基于 IP 协议的逻辑地址,就是 ip 地址 连接不同的媒介类型 选择数据通过网络的最佳路径,完成逻辑地址寻址 数据封装的时候在网络层会封装 ip 地址…

linux网络数据包流程

一、介绍 对于调试linux网卡驱动或者wifi驱动性能,或者排查网络数据丢包的时候,需要对内核处理包要与基本的了解,从而排查出丢包出现在哪个环节,这里给出大致流程和常用排查方法 二、基本框架 1、硬件连接 1)以太网口…

篡改数据包

工具简介 BurpSuite:是一个用于测试 Web 应用程序安全性的图形化工具。该工具使用Java编写,由PortSwigger Web Security开发。 功能 模块 HTTP代理它作为一个 Web 代理服务器运行,并且位于浏览器和目标 Web 服务器之间。这允许拦截、检查和…

数据包覆盖Android,安卓数据包怎么安装 安卓游戏数据包安装教程

安卓数据包怎么安装?安卓数据包放在哪?这是很多安卓单机游戏爱好者经常问的问题,下面小编就为各位玩家带来:安卓游戏数据包安装教程,诸如数据包存放好后,为什么还是不能正常玩都能为您解答~ 安卓数据包怎么安装? 在回答这个问题之前玩家们应该知道,数据包分为两种,一种…

数据包解析

数据包解析 数据包理解七层协议详解OSI七层协议中每一层的特征数据包解析如何改变文本的样式TCP数据包结构: 数据包理解 从专业的角度来说,(网络协议)OSI就是一个开放的通信系统互联参考模型,也是一个定义的很好的协议规范。OSI模型有7层结构…

HTTP数据包详解

1. HTTP报文格式 HTTP由请求和响应两部分组成,所以对应的也有两种报文格式。下面分别介绍HTTP请求报文格式和HTTP响应报文格式。 HTTP请求报文格式 以上表格中,第1行为“请求行”,第2、3、4行为“请求头部”,第5行为空行&#xff…

python构造数据包库_scapy构造数据包

一、进入scapy交互界面 在终端下输入:scapy ,进入交互界面: 二、查看scapy已经实现的网络协议 ls()         列出scapy中已实现的网络协议 ls(协议类型)     查看某个协议头部字段格式 lsc()        列出scapy中可以使用的命令或函数,比如嗅探时,我们经常…

Netty自定义数据包

自定义数据包 粘包现象:两个数据包连在一起,导致无法区分。 分包现象:一个数据包中的数据被间隔。 粘包和分包出现的原因是:没有一个稳定数据结构。 数据包的结构: 自定义数据包包头模块号命令号长度数据 包头&#…

数据包知识

ARP 全称:Address Resolution Protocol 地址解析协议 ARP请求 数据包的目的地址是(ff:ff:ff:ff:ff:ff),这是以太网中的广播地址, 所有发送到这个地址的数据包都会被广播到当前网段中的所有设备。这个数据 包中以太网…

数据帧和数据包解读

数据帧和数据包解读 文章目录 数据帧和数据包解读一、数据帧1.什么是数据帧2.数据帧的组成 二、数据包1.什么是数据包2.数据包的组成 一、数据帧 1.什么是数据帧 就是数据链路层的协议数据单元,它包括三部分:帧头,数据部分,帧尾…

路径规划(一) —— 环境描述(Grid Map Feature Map) 全局路径规划(最优路径规划(DijkstraA*star) 概率路径规划(PRMRRT))

路径规划问题就是把机器人的工作环境量化的描述出来,让机器人知道哪里可以走,哪里不可以走,从而规划出一条可行的轨迹,并且对于轨迹本身进行优化 环境的描述 对于环境的描述,我们一般使用两种方法——Grid map 和 Fe…

路径规划基本理论

路径规划有三个组成部分:空间表示、搜索和启发式算法, 空间表示 空间表示意思就是在执行路径规划之前,为目标构建地图环境。执行任何类型的路径规划,都需要先将地图环境离散化为图形。为了提高路径规划的效果,可以将地…

导航和路径规划

导航技术前言: 导航技术的移动机器人技术的核心和关键技术。自主移动机器人的导航就是让机器人可以自主按照内部预定的信息,或者依据传感器获取外部环境进行相应的引导,从而规划出一条适合机器人在环境中行走的路径。定位,就是机器…

基于采样的路径规划方法

与基于图搜索的方法相比,基于采样的路径规划算法不需要显式构建整个配置空间和边界。 0.概念 Complete Planner(完备规划器) Probabilistic Complete Planner(概率完备的规划器) Resolution Complete Planner&#xf…

路径规划算法:动态规划

如上图所示的实例中,寻找点A到点E代价最小的路径,这是典型的动态规划的应用场景,逆向寻优,正向求解一般分为3步,即三层循环: 第一层循环:遍历每一个阶段; 第二层循环:遍…