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

Rat*_*Don 11 python networking scapy packet-sniffers

我正在使用scapypython来嗅到实时流量.

capture=sniff(iface="<My Interface>", filter="tcp")
Run Code Online (Sandbox Code Playgroud)

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

我想要处理一个数据包并显示数据包的几个字段,只要它被嗅到.即,在嗅探数据包时,它将触发一个我可以分析该数据包的功能.对于少数数据包,这将继续.

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

怎么实现呢?有可能scapy或者我需要安装任何其他包吗?

Rat*_*Don 12

嗅探功能的参数应如下面的代码:

from scapy.all import *

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

sniff(iface="<My Interface>", prn=pkt_callback, filter="tcp", store=0)
Run Code Online (Sandbox Code Playgroud)

store=0说不要存储收到的任何数据包,并prn说发送pktpkt_callback.

资源.

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

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


Yoe*_*oel 7

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

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

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


编辑:
接受的答案声称store必须将参数设置0prn调用回调.但是,设置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
...
Run Code Online (Sandbox Code Playgroud)

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