如何存储scapy数据包数据?

时间:2017-01-31 02:10:43

标签: python scapy

我有一个使用Scapy构建的DNS数据包嗅探器,我想存储来自的数据包数据。

我知道数据包数据存储为字典,这应该使其成为存储在另一个字典或数组中的理想选择。我可以看到使用pkt [0] .summary数据是正确的,我收到数据包,但我无法弄清楚如何正确存储它。

由于我是Python / Scapy的新手,我的问题是如何在数据包通过时将此数据包数据存储/附加到字典或数组中。

这就是代码的样子:

#!/usr/bin/env python

from scapy.all import *
from datetime import datetime
import time
import datetime
import sys

# Select interface and ports of interest
interface = 'ens33'
bpf = 'udp and port 53'

# SELECT/FILTER MSGS
def select_DNS(pkt):
    pkt_time = pkt.sprintf('%sent.time%')


# SELECT/FILTER DNS MSGS
    try:

        dict = []

        # queries
        if DNSQR in pkt and pkt.dport == 53:
            domain = pkt.getlayer(DNS).qd.qname.decode() # .decode() gets rid of the b''
            print('Q - Time: ' + pkt_time + ' , source IP: ' + pkt[IP].src + ' , domain: ' + domain)

        # responses
        elif DNSRR in pkt and pkt.sport == 53:
            domain = pkt.getlayer(DNS).qd.qname.decode()
            print('R - Time: ' + pkt_time + ' , source IP: ' + pkt[IP].src + ' , domain: ' + domain)

    except:
        pass

# START SNIFFER
sniff(iface=interface, filter=bpf, store=0,  prn=select_DNS)

1 个答案:

答案 0 :(得分:1)

我很确定数据包结构不是字典,即使它提供了一些类似字典的功能(覆盖切片表示法)。

如果要将数据包存储在list(数组)中,只需将其追加即可。

cache = []
def select_DNS(pkt):
    cache.append(pkt)

如果要将数据包存储到磁盘,我建议使用wrpacp function将其写出来以“pcap”格式保存。

wrpcap("temp.cap",pkts)