Scapy和rdpcap函数

8
我正在使用Scapy的rdpcap函数来读取PCAP文件。我还使用了一个模块,描述在Scapy中HTTP支持的链接,这在我的情况下是必需的,因为我需要检索所有HTTP请求和响应及其相关数据包。
我注意到,在解析大型PCAP文件时,rdpcap函数花费了太多时间来读取它。
是否有一种更快的方法来读取pcap文件?

你的pcap文件有多大?读取它需要多长时间?它真的太长了吗(即使只加载一次)?你想读取它多少次(反问)? - Dr. Jan-Philip Gehrcke
我的文件超过了300MB,我必须多次启动Python脚本。 - auino
@auino,读取时间的具体问题是什么?是当您每次更改时解析一个300MB文件耗费太长时间来开发脚本,还是存在某些实时处理要求?此外,请告诉我们可接受的解析时间范围。 - Mike Pennington
大约需要1个小时...这不太好,因为我必须解析刚加载的数据... - auino
请使用点赞来表示感谢,不要在问题中表达感谢。 - Piotr Kula
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文件加载到内存中。因此它使用大量的内存,正如你所说的那样它很慢。而sniff一次读取一个数据包并将其传递给提供的prn函数。参数store=0确保数据包在处理完后立即从内存中删除。


4

虽然我同意加载时间比预期的长,但这很可能是因为文件正在被解析以生成一组高度复杂的对象数组。我所做的是使用editcap来切割数据包捕获文件,以使其更易于阅读。例如:

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

请注意:此命令的全部开关说明在这里提供。
同时,-F libpcap部分似乎是必需的(至少对我来说),以使scapy的pcap函数能够解析该文件。 (这应该是默认的pcap文件输出格式,但对于我来说并非如此。您可以使用capinfos验证输入和输出文件的文件类型(例如,只需输入capinfos your_capture.pcap)。
WireShark发行版均提供capinfoseditcap

1
如果你想要一个更加响应的代码,考虑使用 PcapReader() 代替 rdpcap()PcapReader() 创建了一个生成器,并且只在需要时加载数据包,与 rdpcap() 加载整个跟踪文件不同。因此,PcapReader() 非常适合于需要很长时间才能用 rdpcap() 加载或因为系统容量不足而抛出 MemoryError 的大型跟踪文件。
示例代码:
packets = PcapReader('filename.pcap')
for packet in packets:
    mac_src = packet[Ether].src
    mac_dst = packet[Ether].dst
    ...

请参考文档了解更多关于PcapReader()的信息。
如果您只关心获取最终输出所需的时间,那么rdpcap()可能比PcapReader()更具优势,尽管我不确定差异的大小。

1
自Scapy 2.4.3以来,它已经内置了解析HTTP会话的支持。它可以与sniff()会话功能一起使用。例如:
pkts = sniff(offline="http_chunk.pcap.gz", session=TCPSession, store=0)

使用HTTP/1捕获时,使用TCPsession功能将返回一个包含所有底层数据组成的每个HTTPRequest、HTTPResponse的已组装数据的“数据包”列表。它仍然会返回单独的数据包,如Ack数据包。因此,例如,检查一个“数据包”haslayer(HTTPResponse),那么该“数据包”包含整个响应有效载荷。还可以使用answers()功能匹配请求和响应。请注意,您可以使用sniff()进行实时捕获,或使用离线数据包捕获,或使用数据包列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接