我使用scapy
与python
嗅探实时流量。
capture=sniff(iface="<My Interface>", filter="tcp")
但是这会嗅探每个数据包并将其添加到列表capture
中,以后可以处理。
我想要处理一个数据包,并在它被嗅探后立即显示该数据包的几个字段。即,在嗅探数据包时,它会触发一个我可以分析该数据包的功能。这将继续少量数据包。
我已经准备好了我正在使用捕获的数据包列表的功能。但是我无法将它用于每个实时数据包。
如何实现?可以使用scapy
还是我需要安装任何其他软件包?
答案 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
。
如Yoel所述,如果只需要执行一项操作,lambda
可以与prn
一起使用,而不是像这种情况一样的新功能:
sniff(iface="<My Interface>", prn = lambda x: x.show(), filter="tcp", store=0)
答案 1 :(得分:6)
可以使用prn
函数的sniff
参数完成此操作。 Scapy
的教程有一个简单的示例here。 Scapy
的{{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=0
,Scapy
's own examples未提及任何此类要求。事实上,检查Scapy
的源代码显示store
和prn
参数之间没有任何关联。以下是相关代码块的摘录:
...
if store:
lst.append(p)
c += 1
if prn:
r = prn(p)
if r is not None:
print r
...
执行一些简单的测试用例也支持这一发现。