Scapy:sniff函数剖析(参数分析)

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的参数解析。

store:

         类型为bool,默认值为True。是否存储抓到的包。当该参数为真时,返回一个储存着抓获包的PackeList对象。反之则PackeList为空。

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 - 博客园

猜你喜欢

转载自blog.csdn.net/m0_71713477/article/details/128642628