You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pyshark修改pcap文件数据包并保存为新pcap文件?

解决Pyshark修改数据包后无法用Scapy保存的问题

你遇到的核心问题是Pyshark的Packet对象和Scapy的Packet对象不兼容,wrpcap只能识别Scapy自身的数据包结构或者原始二进制字节流,直接传入Pyshark的数据包自然会保存失败。以下是两种可行的解决方法:

方案一:全程使用Scapy处理(推荐)

Scapy原生支持读取pcapng格式,且数据包修改、保存的流程更统一,不需要跨库适配。示例代码如下:

from scapy.all import rdpcap, wrpcap

# 读取pcapng文件
packets = rdpcap('input.pcapng')

modified_packets = []
for pkt in packets:
    # 对应你原有的修改逻辑,Scapy层操作方式调整如下
    if len(pkt) > 7:
        # 定位Ether层位置
        eth_index = None
        for i, layer in enumerate(pkt.layers()):
            if layer.name == 'Ether':
                eth_index = i
                break
        if eth_index is not None:
            # 重构数据包,保留Ether及之后的层
            new_pkt = pkt[eth_index:]
            modified_packets.append(new_pkt)
    else:
        modified_packets.append(pkt)

# 保存修改后的数据包
wrpcap('output.pcap', modified_packets)

方案二:Pyshark处理后转原始字节再用Scapy保存

如果必须使用Pyshark处理数据包,可以将Pyshark的Packet对象转换为原始二进制字节,再传入wrpcap:

import pyshark
from scapy.utils import wrpcap

input_capture = pyshark.FileCapture('input.pcapng', keep_packets=True)
packets_raw = []

for packet in input_capture:
    # 你的原有修改逻辑
    if len(packet.layers) > 7:
        packet.layers.pop(0)
        count = 0
        for i, layer in enumerate(packet.layers):
            count += 1
            if layer.layer_name == 'eth':
                break
        packet.layers = packet.layers[count-1:]
    
    # 将修改后的数据包转为原始字节流
    raw_data = packet.get_raw_packet()
    packets_raw.append(raw_data)

# 保存原始字节流
wrpcap('output.pcap', packets_raw)

input_capture.close()

内容的提问来源于stack exchange,提问作者bhalachandra bhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:02:15