8

我正在使用rdpcapScapy 的功能来读取 PCAP 文件。我还使用了Scapy 中的 HTTP 支持链接中描述的模块,这在我的情况下是必需的,因为我必须检索所有 HTTP 请求和响应以及它们的相关数据包。

我注意到解析大型 PCAP 文件时,该rdpcap函数需要花费太多时间来读取它。

有没有pcap更快读取文件的解决方案?

4

4 回答 4

11

Scapy 还有另一种方法sniff,您也可以使用它来读取 pcap 文件:

def method_filter_HTTP(pkt):
    #Your processing

sniff(offline="your_file.pcap",prn=method_filter_HTTP,store=0)

rdpcap将整个 pcap 文件加载到内存中。因此它使用了大量的内存,正如你所说的它很慢。Whilesniff一次读取一个数据包并将其传递给提供的prn函数。该store=0参数确保数据包在处理后立即从内存中删除。

于 2016-06-22T09:41:11.283 回答
4

虽然我同意加载时间比预期的要长,但这可能是因为正在解析文件以生成一组高度组合的对象。我必须做的是editcap用来切碎数据包捕获,以使阅读它们更容易一些。例如:

$ editcap -B 2013-05-2810:05:55 -i 5 -F libpcap inputcapture.pcap outputcapture.pcap

请注意:此处提供了此命令开关的完整说明。

此外,这-F libpcap部分似乎是必要的(至少对我而言)以获得pcap能够解析文件的 scapy 函数。(这应该是默认的 pcap 文件输出格式,但无论出于何种原因,这对我来说不是这种情况。您可以使用capinfos(例如,只需 enter capinfos your_capture.pcap)验证输入和输出文件的文件类型。

两者capinfoseditcap可以在 WireShark 发行版中使用。

于 2013-05-30T14:04:16.847 回答
1

从 Scapy 2.4.3 开始,它内置了解析 HTTP会话的支持。它可以与sniff() 会话功能一起使用。例如

pkts = sniff(offline="http_chunk.pcap.gz", session=TCPSession, store=0)

当使用TCPsessionHTTP/1 捕获的功能时,它会返回一个“数据包”列表,其中包含来自构成每个 HTTPRequest、HTTPResponse 的所有底层数据包的组装数据。它还将返回单个数据包,例如 Ack 数据包。因此,例如,检查“数据haslayer(HTTPResponse)包”是否包含整个响应有效负载。也可以使用该answers()功能来匹配请求和响应。请注意,您可以使用sniff()实时捕获、offline数据包捕获或数据包列表。

于 2020-12-17T12:41:47.200 回答
1

如果您正在寻找响应更快的代码,请考虑使用PcapReader()而不是rdpcap().

PcapReader()创建一个生成器并仅在需要时加载数据包,而不是rdpcap()将整个跟踪加载到内存中。PcapReader()因此,非常适合需要永远加载的大型跟踪rdpcap(),或者抛出 aMemoryError因为它对您的系统来说太大了。

示例代码:

packets = PcapReader('filename.pcap')
for packet in packets:
    mac_src = packet[Ether].src
    mac_dst = packet[Ether].dst
    ...

请参阅PcapReader() 文档以获取更多信息。

如果您只关心获得最终输出需要多长时间,那么rdpcap()可能比 具有优势PcapReader(),尽管我不确定差异的大小。

于 2020-05-16T05:09:07.813 回答