我想使用python/scapy遍历pcap文件包中的数据包。该文件具有多种协议(protocol)。当前的迭代是特定于协议(protocol)的,因此如果下一个数据包来自另一个协议(protocol),则迭代会产生“跳跃”。我现在不知道为什么会这样。无论采用哪种协议(protocol),我都希望以包为单位。

小例子:

data = 'new.pcap'
zz = rdpcap(data)
sessions = zz.sessions()

for session in sessions:
  for packet in sessions[session]:
    eth_src = packet[Ether].src
    eth_type = packet[Ether].type

if eth_src == "00:22:97:04:06:b9" and eth_type == 0x8100:
  # do anything
elif eth_src == "00:22:97:04:06:b9" and eth_type == 0x22f0:
  # do anything
else:
  # do anything

有人知道原因吗?

最佳答案

简单尝试:

for pkt in PcapReader('new.pcap'):
    eth_src = pkt[Ether].src
    eth_type = pkt[Ether].type
    if [...]

使用rdpcap()在内存中创建一个列表,而PcapReader()在生成器中创建一个包,在需要时读取数据包,而不将其存储在内存中(这使得处理大型PCAP文件成为可能)。

如果出于某种原因需要列表,请执行以下操作:
packets = rdpcap('new.pcap')
for pkt in packets:
    eth_src = pkt[Ether].src
    eth_type = pkt[Ether].type
    if [...]

10-04 13:22