使用Scapy读取Wireshark抓包后重写,Wireshark部分字段无法显示
Scapy读写pcap后Wireshark字段显示异常的解决办法
用Scapy读取Wireshark抓取的pcap文件,重写成新pcap后,Wireshark打开发现部分字段显示不正常,用到的代码如下:
from scapy.all import * PKT_List = [] pkts = rdpcap("E:\\test.pcap") for pkt in pkts: PKT_List.append(pkt) wrpcap("E:\\output.pcap", pkts)
原始与处理后的数据包对比:
- 原始数据包:

- 处理后数据包:

问题根源
Scapy解析数据包的逻辑和Wireshark存在差异,部分协议字段被解析后再写入时格式发生改变,导致Wireshark无法识别。另外如果原始pcap使用了非默认链路类型,Scapy未自动保留该类型也会引发显示异常。
解决方法
方法1:指定链路类型写入
写入时明确使用原始pcap的链路类型,确保Wireshark能正确识别链路层信息:
from scapy.all import * pkts = rdpcap("E:\\test.pcap") # 取第一个包的链路类型,无数据包时用默认以太网类型 wrpcap("E:\\output.pcap", pkts, linktype=pkts[0].linktype if pkts else DLT_EN10MB)
方法2:直接读写原始帧
让Scapy跳过协议解析环节,直接读取原始数据包字节并写入,完全保留原文件格式:
from scapy.all import PcapReader, PcapWriter with PcapReader("E:\\test.pcap") as reader, PcapWriter("E:\\output.pcap", linktype=reader.linktype) as writer: for pkt in reader: writer.write(pkt)
方法3:排查字节差异
使用Wireshark的「对比数据包」功能,定位原始与处理后数据包的字节差异,确认具体被修改的字段,再针对性调整Scapy的解析逻辑(比如手动指定协议层)。
内容的提问来源于stack exchange,提问作者feng
相关产品推荐
相关产品推荐

