Python Scapy wrpcap - 怎么将数据包添加至 pcap 文件?

2024-04-28 19:46:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些软件可以模拟网络上的误码率和延迟。我需要一种方法来测试软件的误码率模块,以确保它实际工作正常。我的解决方案是创建一个程序,发送原始以太网帧,并将type字段设置为未使用的类型。以太网帧内部只是随机位。对于发送的每个帧,我需要将帧记录到一个pcap文件中。在网络链路的另一端是一个接收应用程序,它只需将看到的每个包写入自己的pcap日志。测试完成后,运行两个pcap日志进行比较以获得BER。

我正在使用python模块Scapy,目前为止它已经完成了我需要的所有工作。我可以发送带有随机数据的原始以太网帧,并在Wireshark中看到它们。但是,我不知道如何让wrpcap()方法附加到pcap文件,而不是覆盖。我知道我可以向wrpcap写入一个数据包列表,但是这个应用程序需要能够无限期地运行,我不想等到应用程序退出将所有发送到硬盘的数据包写入。因为这需要存储在内存中,如果发生了什么事情,我将不得不从头开始测试。

我的问题是:如何使用scapy附加到pcap文件,而不是覆盖pcap文件?有可能吗?如果不是,那么什么模块可以做我需要的?

在寻找具有Scapy功能的东西时,我遇到了dpkt,但是没有找到很多文档。dpkt能按我的要求做吗?如果能,我在哪里能得到一些好的文档?


Tags: 模块文件方法文档网络应用程序软件pcap
3条回答

有一种方法可以做你想做的事,但它意味着:

  • [Memory hog with one bigpcap]:从带有rdpcap()的磁盘中将现有的pcap读入scapyPacketList(),然后在接收到帧时将其写入PacketList。您可以随意选择将中间PacketList保存到pcap,但我认为scapywrpcap()中没有任何类似附加功能的功能。正如您所提到的,这种技术还意味着您将整个PacketList保存在内存中,直到完成。

  • [将单个pcap文件粘合在一起]:只在内存中保留数据包的小快照。。。您应该每X分钟将pcap快照保存到磁盘,然后在脚本完成时将这些单独的文件聚合在一起。

您可以将linux中的pcap文件与wireshark包中的^{}组合在一起。。。以下命令将把pak1.pcappak2.pcap组合成all_paks.pcap

mergecap -w all_paks.pcap pak1.pcap pak2.pcap

至于^{},我查看了它们的源代码,它可能能够以增量方式编写数据包,但我无法说明它们的代码基础有多稳定或维护有多好。。。在提交日志中,它看起来有点被忽略了(上一次提交是2011年1月9日)。

对于后人来说,PcapWriter或RawPcapWriter看起来是在scapy 2.2.0中处理这个问题的更简单的方法。不过,除了浏览源代码外,找不到太多文档。一个简单的例子:

from scapy.utils import PcapWriter

pktdump = PcapWriter("banana.pcap", append=True, sync=True)

...
pktdump.write(pkt)
...

我想我在这里跟踪你,因为包是嗅探你想让他们都写在一个单一的pcap文件?虽然不能追加到pcap,但可以将数据包追加到列表,然后一次将它们全部写入pcap。

我不确定这是否能回答你的问题或有任何帮助,如果不让我知道,我可以让它满足你的需要。在这个例子中,我设置了一个阈值来创建一个新的pcap,用于监听500个包。如果您运行此命令两次,请小心,因为第二次运行时您的PCAP可能会被重写。

#!/usr/bin/python -tt

from scapy.all import *

pkts = []
iter = 0
pcapnum = 0

def makecap(x):
    global pkts
    global iter
    global pcapnum
    pkts.append(x)
    iter += 1
    if iter == 500:
        pcapnum += 1
        pname = "pcap%d.pcap" % pcapnum
        wrpcap(pname, pkts)
        pkts = []
        iter = 0

while 1:
    sniff(prn=makecap)

这应该会给你一点优势,但是最后几个数据包可能会丢失(降低if语句中的值以减轻这种情况)。建议同时在两边使用它,这样每个pcap都应该排好队,以后你可以像Mike建议的那样使用mergepcap,如果你喜欢的话。如果这对你有用,请告诉我。

相关问题 更多 >