我正在使用rdpcap
Scapy 的功能来读取 PCAP 文件。我还使用了Scapy 中的 HTTP 支持链接中描述的模块,这在我的情况下是必需的,因为我必须检索所有 HTTP 请求和响应以及它们的相关数据包。
我注意到解析大型 PCAP 文件时,该rdpcap
函数需要花费太多时间来读取它。
有没有pcap
更快读取文件的解决方案?
我正在使用rdpcap
Scapy 的功能来读取 PCAP 文件。我还使用了Scapy 中的 HTTP 支持链接中描述的模块,这在我的情况下是必需的,因为我必须检索所有 HTTP 请求和响应以及它们的相关数据包。
我注意到解析大型 PCAP 文件时,该rdpcap
函数需要花费太多时间来读取它。
有没有pcap
更快读取文件的解决方案?
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
参数确保数据包在处理后立即从内存中删除。
虽然我同意加载时间比预期的要长,但这可能是因为正在解析文件以生成一组高度组合的对象。我必须做的是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
)验证输入和输出文件的文件类型。
两者capinfos
都editcap
可以在 WireShark 发行版中使用。
从 Scapy 2.4.3 开始,它内置了解析 HTTP会话的支持。它可以与sniff()
会话功能一起使用。例如
pkts = sniff(offline="http_chunk.pcap.gz", session=TCPSession, store=0)
当使用TCPsession
HTTP/1 捕获的功能时,它会返回一个“数据包”列表,其中包含来自构成每个 HTTPRequest、HTTPResponse 的所有底层数据包的组装数据。它还将返回单个数据包,例如 Ack 数据包。因此,例如,检查“数据haslayer(HTTPResponse)
包”是否包含整个响应有效负载。也可以使用该answers()
功能来匹配请求和响应。请注意,您可以使用sniff()
实时捕获、offline
数据包捕获或数据包列表。
如果您正在寻找响应更快的代码,请考虑使用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()
,尽管我不确定差异的大小。