【问题标题】:Reading part of pcap file in Scapy在 Scapy 中读取部分 pcap 文件
【发布时间】:2020-02-28 10:03:31
【问题描述】:

我一直在尝试找出一种方法来使用 scapy 读取 pcap 文件的一部分。

例如:我有一个 1000 行的 pcap 文件。

问题:是否可以分 10 条读取,即依次读取 100 行?

场景是:

我正在读取多个 pcap 文件并比较它们之间的数据包。 为了比较数据包,我使用索引并将特定数据包称为pkt = packets_from_pcap_file_7[idx]。要使用索引,我需要使用rdpcap(FILENAME.pcap) 读取 pcap 文件。但是,此函数会读取整个 pcap 文件并导致 MemoryError。

由于我想比较来自不同文件的特定数据包,我发现很难使用 RawPcapReader(FILENAME.pcap) 我可以同时遍历一个特定的数据包:

packets = RawPcapReader(FILENAME.pcap)
for pkt in packets:
    pkt.doThings

我将发布一个非常缓慢的解决方案来解决我们必须为每个数据包遍历整个 pcap 文件并迭代到指定索引的问题:

def get_packet(idx):
    packets = RawPcapReader("FILENAME.pcap")
    counter = 0
    for pkt in packets:
        if counter == idx:
            return pkt
        counter += 1

我可以在 linux 终端中拆分数据包,但由于这也将用于其他人,我希望脚本完成所有工作。 我认为有一个更简单的解决方案,我一直无法找到。提前致谢。

【问题讨论】:

    标签: python scapy pcap


    【解决方案1】:

    您可能会打开所有文件而不读取它们,然后遍历数据包。类似的东西

    files = ["a.pcap", "b.pcap", ......]
    fds = [RawPcapReader(x) for x in files]
    while True:
        try:
            # get the next packets of all files 
            pkts = [next(x) for x in fds]
            # do something with them
        except EOFError:
            # file has ended
            break
    for f in fds:
        f.close()
    

    【讨论】:

    • 问题是我需要将文件 A 中的数据包编号 X 与文件 B 中的数据包编号 Y 进行比较。因此获取下一个数据包是不够的。
    • 然后归结为创建一个符合您需求的算法。也许按照您想要比较它们的顺序对每个文件中的元素进行排序,然后遍历索引(您可以“跳过”您不使用的数据包......)我们真的无能为力
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2013-12-04
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多