Scapy和rdpcap功能

时间:2012-05-29 13:42:21

标签: python networking pcap packet-capture scapy

我正在使用Scapy的rdpcap函数来读取PCAP文件。 我还使用了link to HTTP support in Scapy中描述的模块,这在我的案例中是必需的,因为我必须检索所有HTTP请求和响应及其相关数据包。

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

是否有更快地阅读pcap文件的解决方案?

4 个答案:

答案 0 :(得分:7)

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参数可确保在处理完数据包后立即将其从内存中删除。

答案 1 :(得分:4)

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

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

请注意:有关此命令开关的完整说明here

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

WireShark发行版提供capinfos your_capture.pcapcapinfos

答案 2 :(得分: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() documentation

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

答案 3 :(得分:1)

自Scapy 2.4.3起,它内置了对parse HTTP个会话的支持。它可以与sniff() sessions功能一起使用。例如

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

在HTTP / 1捕获中使用TCPsession功能时,它会返回“数据包”列表,其中包含组成每个HTTPRequest,HTTPResponse的所有基础数​​据包中的组合数据。它还将返回单个数据包,例如Ack数据包。因此,例如,检查是否有“数据包” haslayer(HTTPResponse),然后该“数据包”包含整个响应有效负载。也可以使用answers()功能来匹配请求和响应。请注意,您可以将sniff()用于实时捕获,也可以用于offline数据包捕获或数据包列表。