我正在使用Scapy的rdpcap
函数来读取PCAP文件。
我还使用了link to HTTP support in Scapy中描述的模块,这在我的案例中是必需的,因为我必须检索所有HTTP请求和响应及其相关数据包。
我注意到解析大型PCAP文件rdpcap
函数需要花费太多时间来阅读它。
是否有更快地阅读pcap
文件的解决方案?
答案 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.pcap
和capinfos
。
答案 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
数据包捕获或数据包列表。