python之写报文

这段代码演示了如何使用Scapy库来创建一个HTTP请求报文,并将其写入到一个名为'2.pcap'的pcap文件中。首先,定义了一个HTTP请求报文的字节串,然后通过Scapy构造了以太网/IPv4/TCP/HTTP的数据包结构,并显示了该数据包。接着,通过循环遍历IP地址列表,修改数据包的源IP地址,并将每个数据包写入pcap文件。最后,关闭文件写入操作。主要涉及网络协议解析和数据包构造技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from scapy.all import *
from scapy.layers.inet import *
from scapy.layers.http import *
from scapy.layers.l2 import *

写报文

# def write(fileName, packets):
#     writer = PcapWriter(fileName, append=True)
#     for p in packets:
#         writer.write(p)
#         writer.flush()
#         writer.close()

在这里插入图片描述

http = b'\x50\x4f\x53\x54\x20\x2f\x76\x31\x2f\x62\x65\x73\x2d\x62\x69\x64\x2f\x62\x69\x64\x64\x65\x72\x20\x48\x54\x54\x50\x2f\x31\x2e\x31\x0d\x0a\x43\x6f\x6e\x74\x65\x6e\x74\x2d\x4c\x65\x6e\x67\x74\x68\x3a\x20\x36\x35\x31\x0d\x0a\x41\x63\x63\x65\x70\x74\x3a\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x6f\x63\x74\x65\x74\x2d\x73\x74\x72\x65\x61\x6d\x0d\x0a\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x6c\x69\x62\x75\x62\x2d\x61\x67\x65\x6e\x74\x2f\x31\x2e\x32\x0d\x0a\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x3a\x20\x4b\x65\x65\x70\x2d\x41\x6c\x69\x76\x65\x0d\x0a\x48\x6f\x73\x74\x3a\x20\x67\x64\x2d\x61\x70\x69\x2e\x61\x64\x2e\x6a\x69\x67\x75\x61\x6e\x67\x2e\x63\x6e\x0d\x0a\x43\x6f\x6e\x74\x65\x6e\x74\x2d\x54\x79\x70\x65\x3a\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x6f\x63\x74\x65\x74\x2d\x73\x74\x72\x65\x61\x6d\x0d\x0a\x0d\x0a'
raw = b'\x0a\x10\x64\x31\x39\x61\x63\x39\x32\x35\x34\x38\x37\x61\x66\x61\x33\x64\x12\x0c\x31\x31\x37\x2e\x31\x33\x36\x2e\x34\x2e\x31\x37\x1a\x42\x44\x61\x6c\x76\x69\x6b\x2f\x32\x2e\x31\x2e\x30\x20\x28\x4c\x69\x6e\x75\x78\x3b\x20\x55\x3b\x20\x41\x6e\x64\x72\x6f\x69\x64\x20\x39\x3b\x20\x52\x65\x64\x6d\x69\x20\x36\x20\x4d\x49\x55\x49\x2f\x56\x31\x31\x2e\x30\x2e\x33\x2e\x30\x2e\x50\x43\x47\x43\x4e\x58\x4d\x29\x42\x44\x0a\x40\x37\x39\x35\x37\x37\x66\x62\x34\x38\x35\x35\x32\x33\x66\x62\x36\x38\x35\x66\x34\x38\x35\x37\x63\x62\x31\x62\x33\x39\x34\x38\x64\x65\x62\x66\x33\x38\x36\x65\x62\x63\x39\x62\x32\x38\x32\x30\x66\x30\x66\x37\x65\x66\x38\x33\x34\x31\x33\x31\x34\x62\x66\x32\x32\x10\x02\x5a\x00\x62\x00\x70\x00\x78\x00\x90\x01\x00\xa2\x01\x51\x08\x99\xfe\xb4\xd0\xfb\xaf\xbe\xd7\x21\x10\x01\x18\x0d\x20\xc0\x07\x28\x80\x05\x30\x01\x3a\x02\x01\x04\x50\x00\x58\x00\x71\x53\xa9\x03\x00\x00\x00\x00\x00\x90\x01\xc0\x07\x98\x01\x80\x05\xb0\x01\x01\xb8\x01\x00\xc2\x01\x0c\x08\x07\x2a\x06\x08\xc0\x07\x10\x80\x05\x30\x03\xc8\x01\x00\xe2\x01\x07\x36\x34\x38\x32\x33\x34\x33\xd0\x01\x00\xd8\x01\x00\xe2\x01\x18\x0a\x0c\x08\x03\x15\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x12\x08\x0a\x00\x12\x00\x1a\x00\x22\x00\xea\x01\xb9\x02\x0a\x20\x61\x31\x66\x33\x39\x32\x38\x32\x31\x66\x66\x63\x37\x37\x30\x30\x63\x63\x63\x35\x65\x66\x33\x31\x31\x36\x62\x37\x36\x32\x33\x38\x10\x01\x18\x02\x22\x06\x08\x09\x10\x00\x18\x00\x2a\x06\x78\x69\x61\x6f\x6d\x69\x32\x07\x52\x65\x64\x6d\x69\x20\x36\x38\xd0\x05\x40\xa0\x0b\x48\xb0\xe7\x02\x50\x00\x5a\x20\x33\x65\x63\x34\x66\x61\x31\x32\x63\x65\x38\x33\x37\x31\x66\x63\x39\x65\x30\x32\x66\x32\x65\x63\x64\x63\x35\x38\x65\x63\x34\x37\x62\x2d\x0a\x08\x61\x65\x34\x36\x39\x39\x31\x34\x12\x1a\x63\x6f\x6d\x2e\x79\x67\x6b\x6a\x2e\x63\x68\x65\x6c\x61\x69\x6c\x65\x2e\x73\x74\x61\x6e\x64\x61\x72\x64\x18\xfe\x11\x28\x01\x28\x02\x6a\x24\x08\x01\x12\x20\x35\x30\x62\x35\x39\x64\x61\x64\x61\x30\x34\x36\x66\x31\x38\x36\x34\x35\x31\x32\x31\x36\x39\x38\x64\x65\x63\x66\x36\x36\x32\x36\x6a\x24\x08\x02\x12\x20\x61\x31\x66\x33\x39\x32\x38\x32\x31\x66\x66\x63\x37\x37\x30\x30\x63\x63\x63\x35\x65\x66\x33\x31\x31\x36\x62\x37\x36\x32\x33\x38\x6a\x24\x08\x04\x12\x20\x34\x62\x61\x62\x65\x34\x33\x64\x63\x62\x31\x31\x30\x64\x66\x35\x30\x32\x30\x33\x32\x36\x61\x32\x63\x38\x35\x35\x35\x63\x32\x66\x72\x24\x08\x04\x12\x20\x33\x65\x63\x34\x66\x61\x31\x32\x63\x65\x38\x33\x37\x31\x66\x63\x39\x65\x30\x32\x66\x32\x65\x63\x64\x63\x35\x38\x65\x63\x34\x37\x7d\x00\x00\x00\x40\xf2\x01\x04\x0a\x00\x18\x00\xfa\x01\x1a\x12\x0b\x08\xad\x9d\xfb\xe8\x95\xf5\xd2\xcb\xcc\x01\x12\x0b\x08\xd7\xc3\xb0\x83\xd0\x96\xc7\xc1\xd4\x01'
# pkt = eth / ipv4 / tcp / http / raw
pkt = eth / ipv4 / tcp / http
pkt.show()

# 输出:
#
# print(pcap_name)
writer = PcapWriter("2.pcap", append=True)
for i in range(len(ip_list)):
    pkt[IP].chksum = None
    pkt[IP].src = ip_list[i]
    # print(i)
    # print(pkt[IP].src)
    # pkt.show()
    # write(pcap_name, pkt)

    writer.write(pkt)
    writer.flush()
writer.close()

#######主程序##############################
if name == ‘main’:
# ip_list = [“82.88.37.179”, “107.74.63.105”, “27.254.194.249”, “141.53.170.198”, “246.66.199.205”, “109.183.172.173”,
# “135.37.107.155”, “110.174.223.54”]
ip_list = [“82.88.37.179”, “107.74.63.105”]
createPcap(ip_list)

### 如何根据报文说明在Python中编函数 #### 函数设计原则 当依据报文说明开发Python函数时,需遵循清晰定义输入输出的原则。这不仅有助于提高代码可读性和维护性,还能够减少错误的发生概率[^2]。 #### 报文解析逻辑 对于接收端而言,在处理来自网络的数据包之前,通常要先建立连接并监听指定端口上的消息传入。一旦捕获到新的通信请求,则按照既定协议格式提取有效负载部分,并将其转换成易于后续操作的形式——比如字符串、字典或其他自定义对象结构;而对于发送方来说,则相反地构建好待传输的信息体之后再封装进适当的消息头里一并发出去。 #### 编码实践案例 下面给出一段基于TCP协议简单回声服务器的例子来具体展示上述理论的应用场景: ```python import socket def start_server(host='localhost', port=65432): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((host, port)) s.listen() conn, addr = s.accept() # 接受客户端连接 while True: data = conn.recv(1024).decode('utf-8') # 获取从客户端收到的数据 if not data or data.lower().strip() == 'exit': break response_data = process_message(data) # 处理接收到的数据 conn.sendall(response_data.encode()) # 将响应返回给客户端 print(f"Connection closed by {addr}") def process_message(message: str) -> str: """模拟对报文的具体业务逻辑处理""" processed_msg = f"ECHO:{message.upper()}!" # 假设这里执行了一些必要的变换操作 return processed_msg ``` 此段程序展示了怎样创建一个基本的服务端应用程序,它会等待任何尝试与其建立联系的对象,并针对每一次交互调用`process_message()`方法完成实际的任务需求分析与应答生成工作流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值