sniff函数是Scapy中的探嗅函数,定义在sendrecv模块中。下面将给出sniff函数的具体剖析。
官方没有给出sniff文档,下面给出源码:
@conf.commands.register
def sniff(*args, **kwargs):
# type: (*Any, **Any) -> PacketList
sniffer = AsyncSniffer()
sniffer._run(*args, **kwargs)
return cast(PacketList, sniffer.results)
看来重点应该放在AsyncSniffer上。
源码太长,就节选调用的_run方法的函数头(_run方法本身也有207行)
def _run(self,
count=0, # type: int
store=True, # type: bool
offline=None, # type: Any
quiet=False, # type: bool
prn=None, # type: Optional[Callable[[Packet], Any]]
lfilter=None, # type: Optional[Callable[[Packet], bool]]
L2socket=None, # type: Optional[Type[SuperSocket]]
timeout=None, # type: Optional[int]
opened_socket=None, # type: Optional[SuperSocket]
stop_filter=None, # type: Optional[Callable[[Packet], bool]]
iface=None, # type: Optional[_GlobInterfaceType]
started_callback=None, # type: Optional[Callable[[], Any]]
session=None, # type: Optional[_GlobSessionType]
session_kwargs={}, # type: Dict[str, Any]
**karg # type: Any
)
参数解析:
count:
类型为int,默认值为0。抓包的个数,
0
为无限。详见timeout的参数解析。文章来源地址https://www.toymoban.com/news/detail-415286.html
store:
类型为bool,默认值为True。是否存储抓到的包。当该参数为真时,返回一个储存着抓获包的PackeList对象。反之则PackeList为空。
文章来源:https://www.toymoban.com/news/detail-415286.html
offline:
无指定类型,默认值为None。从
pcap
文件读取数据,而不进行探嗅。
quiet:
类型为bool,默认值为False。
prn:
类型为funtion,默认值为None。传入一个任意类型的返回值的回调函数,即作为参数传入并调用的函数。一般是
lambda函数。
值得注意的是,当且仅当prn的返回值为None时,sniff不会打印它,其余情况sniff都会把它打印到显示器上。正因如此,如果想一边抓包一边打印包的梗概,那么可以传入lambda packet:packet.summary();如果想使用ls函数列出所抓版的详情,直接传入ls函数即可。
filter:
类型为str,默认值为None。BPF
过滤规则。BPF:柏克莱封包过滤器(
Berkeley Packet Filter
,缩写BPF
),是类Unix系统上数据链路层的一种原始接口,提供原始链路层封包的收发。如仅需要TCP包,可以向filter参数传入'tcp'来滤包。这样返回的PacketList中就全都是TCP包了。
lfilter:
类型为function,默认值为None。传入一个返回值为bool型的回调函数,一般为lambda函数。会把每一个捕获到的包放入这个函数,当返回值为真时,才会放入返回的PacketList。
这个参数与filter参数不同,前者放入的是字符串,后者放入的是函数,切记不可弄混。
L2socket:
类型为SuperSocket,默认值为None。特定的L2socket。L2socket,即Layer 2 socket。是在网络第二层(链路层)工作的套接字。
timeout:
类型为int或float, 默认值为None。设置抓包的超时时间。
当未传入timeout且未传入count时,会循环抓包直至程序关闭或按下Ctrl+C键阻断程序。当未传入timeout且传入count时,会一直抓包直到满足count的值,当传入timtout且未传入count时,会抓包timeout秒,不限所抓包的数量。当传入timeout和count时,当任意一方满足条件,sniff就会停止抓包。
opened_socket:
类型为socket,默认值为None。对指定socket对象调用recv方法抓包,而不会抓其他的包。
stop_filter:
类型为funcion,默认值为None。传入一个返回值为bool的函数,一般为lambda函数。
会将每一个抓获的包放入这个函数,当返回值为True时,停止抓包。
这可以看做是sniff的中断函数。
iface:
类型为str,默认值为None。传入指定抓包所用网卡的名称,sniff会搞定一切。缺省时会使用所有网卡。
例如,传入'eth0',sniff就会使用eth0这张网卡抓包。
started_callback:
类型为function,默认值为None。sniff在开始运行是会调用的回调函数。
callback即回调函数。
session:
类型为_GlobSessionType,默认值为TCPSession。流处理器。
session_kwargs:
类型为dict,默认值为None。传递给session的参数。
参考文献:
Python Scapy-sniff函数_冰息的博客-CSDN博客_python sniff
Scapy之sniff抓包 - CH3UHX9 - 博客园
到了这里,关于Scapy:sniff函数剖析(参数分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!