Scapy数据包嗅探器在每个嗅探的数据包上触发一个动作

时间:2015-02-03 05:51:53

标签: python networking scapy packet-sniffers

我使用scapypython嗅探实时流量。

capture=sniff(iface="<My Interface>", filter="tcp")

但是这会嗅探每个数据包并将其添加到列表capture中,以后可以处理。

我想要处理一个数据包,并在它被嗅探后立即显示该数据包的几个字段。即,在嗅探数据包时,它会触发一个我可以分析该数据包的功能。这将继续少量数据包。

我已经准备好了我正在使用捕获的数据包列表的功能。但是我无法将它用于每个实时数据包。

如何实现?可以使用scapy还是我需要安装任何其他软件包?

2 个答案:

答案 0 :(得分:11)

嗅探功能的参数应该类似于下面的代码:

from scapy.all import *

def pkt_callback(pkt):
    pkt.show() # debug statement

sniff(iface="<My Interface>", prn=pkt_callback, filter="tcp", store=0)

store=0表示不存储收到的任何数据包,prn表示将pkt发送给pkt_callback

Source.

Yoel所述,如果只需要执行一项操作,lambda可以与prn一起使用,而不是像这种情况一样的新功能:

sniff(iface="<My Interface>", prn = lambda x: x.show(), filter="tcp", store=0)

答案 1 :(得分:6)

可以使用prn函数的sniff参数完成此操作。 Scapy的教程有一个简单的示例hereScapy的{​​{3}}指定:

  

sniff(prn=None, lfilter=None, count=0, store=1, offline=None, L2socket=None, timeout=None)

     
    

...
    prn:应用于每个数据包的函数。如果返回某些内容,则会显示该内容。例如,您可以使用prn = lambda x: x.summary()     ...

  

修改
official API documentation声称必须将store参数设置为0才能调用prn回调。但是,设置store=0没有任何此类影响。 The accepted answer未设置store=0Scapy's own examples未提及任何此类要求。事实上,检查Scapy的源代码显示storeprn参数之间没有任何关联。以下是相关代码块的摘录:

...
if store:
    lst.append(p)
c += 1
if prn:
    r = prn(p)
    if r is not None:
        print r
...

执行一些简单的测试用例也支持这一发现。