Rat*_*Don 11 python networking scapy packet-sniffers
我正在使用scapy它python来嗅到实时流量.
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说发送pkt给pkt_callback.
正如Yoel所提到的,如果只需要一个动作,lambda可以使用prn而不是像这种情况下的新功能:
sniff(iface="<My Interface>", prn = lambda x: x.show(), filter="tcp", store=0)
Run Code Online (Sandbox Code Playgroud)
这可以通过函数的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必须将参数设置0为prn调用回调.但是,设置store=0没有任何这样的效果.Scapy自己的例子没有设置store=0,官方API文档没有提到任何这样的要求.事实上,检查Scapy源代码显示store和prn参数之间没有任何联系.以下是相关代码块的摘录:
...
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)
执行一些简单的测试用例也支持这一发现.