使用 scapy 读取 PCAP 文件

Kry*_*ian 10 python scapy

我有大约 10GB 的 pcap 数据和 IPv6 流量来分析存储在 IPv6 标头和其他扩展标头中的信息。为此,我决定使用 Scapy 框架。我试过rdpcap函数,但对于这么大的文件,不推荐使用。它试图将所有文件加载到内存中并在我的情况下卡住。我在网上发现在这种情况下建议使用嗅探,我的代码如下:

def main():
   sniff(offline='traffic.pcap', prn=my_method,store=0)


def my_method(packet):
   packet.show()
Run Code Online (Sandbox Code Playgroud)

在名为my_method 的函数中,我分别接收每个数据包,我可以解析它们,但是....当我使用内置框架方法调用show函数时,我得到了这样的东西: 结果

在wireshark中打开时,我得到了正确的数据包: 结果2

你能告诉我如何在 scapy 中解析这个数据包以获得正确的结果吗?

编辑:根据评论中的讨论,我找到了一种用 Python 解析 PCAP 文件的方法。在我看来,最简单的方法是使用 pyshark 框架:

import pyshark
pcap = pyshark.FileCapture(pcap_path) ### for reading PCAP file
Run Code Online (Sandbox Code Playgroud)

可以使用 for 循环轻松迭代读取文件

for pkt in pcap:
    #do what you want
Run Code Online (Sandbox Code Playgroud)

对于解析 IPv6 标头,以下方法可能有用:

pkt['ipv6'].tclass            #Traffic class field
pkt['ipv6'].tclass_dscp       #Traffic class DSCP field
pkt['ipv6'].tclass_ecn        #Traffic class ECN field
pkt['ipv6'].flow              #Flow label field
pkt['ipv6'].plen              #Payload length field
pkt['ipv6'].nxt               #Next header field
pkt['ipv6'].hlim              #Hop limit field
Run Code Online (Sandbox Code Playgroud)

cod*_*der 9

更新

最新的版本现在支持 ipv6解析。因此,要分析一个IPv6的“.pcap”文件scapy现在它可以像这样做:

from scapy.all import *

scapy_cap = rdpcap('file.pcap')
for packet in scapy_cap:
    print packet[IPv6].src
Run Code Online (Sandbox Code Playgroud)

现在,正如我在最初提出这个问题时所评论的那样,对于旧 scapy版本(不支持 ipv6 解析):

  • pyshark可以改为使用(pyshark是一个 tshark 包装器),如下所示:

import pyshark

shark_cap = pyshark.FileCapture('file.pcap')
for packet in shark_cap:
    print packet.ipv6.src
Run Code Online (Sandbox Code Playgroud)
  • 甚至当然tshark(一种wireshark的终端版本):

$ tshark -r file.pcap -q -Tfields -e ipv6.src
Run Code Online (Sandbox Code Playgroud)