Scapy 数据包嗅探器触发对每个嗅探数据包的操作



我正在使用scapypython来嗅探实时流量。

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

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

我想处理一个数据包,并在嗅探数据包

后立即显示数据包的几个字段,即在嗅探数据包时,它将触发一个函数,我可以在其中分析该数据包。这将持续几个数据包。

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

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

嗅探函数的参数应类似于以下代码:

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

源。

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

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

可以通过sniff函数的prn参数来完成。 Scapy的教程在这里有一个简单的例子。 Scapy的官方API文档指定:

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


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


编辑:
接受的答案声称必须将store参数设置为0才能调用prn回调。但是,设置store=0没有任何此类效果。 Scapy自己的例子没有设置store=0,官方API文档也没有提到任何这样的要求。事实上,检查Scapy的源代码会发现storeprn参数之间没有任何联系。以下是相关代码块的摘录:

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

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

最新更新