如何使用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
相关产品推荐
相关产品推荐

