【问题标题】:Scapy packet sniffer triggering an action up on each sniffed packetScapy 数据包嗅探器触发对每个嗅探数据包的操作
【发布时间】:2015-04-02 06:05:50
【问题描述】:

我正在使用 scapy 和 python 来嗅探实时流量。

capture=sniff(iface="<My Interface>", filter="tcp")

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

我想处理一个数据包并在嗅探到数据包后立即显示该数据包的几个字段。即在嗅探一个数据包时,它会触发一个函数,我可以在其中分析该数据包。这将持续几个数据包。

我已经准备好与捕获的数据包列表一起使用的功能。但我无法为每个实时数据包使用它。

如何做到这一点?是否可以使用scapy 或者我需要安装任何其他软件包?

【问题讨论】:

    标签: python networking scapy packet-sniffers


    【解决方案1】:

    sniff 函数的参数应该像下面的代码:

    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。

    Source.

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

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

    【讨论】:

    • 请阅读this answer关于您对设置store=0的声明。
    • @Yoel 它不会对程序的执行产生任何影响。但是您不认为,在我们使用prn 处理每个数据包时,将每个数据包附加到列表 (store=1) 是额外的开销。我们真的需要存储这些数据包吗?
    • 这不是您最初所说的回答。我同意设置store=0 会稍微提高空间和时间效率,我什至在对my answer 的评论中争辩说,当您实际上声称相反时。现在您已经编辑了答案,这是正确的,尽管我看不到它对讨论的补充,因为很久以前发布的我的答案及其 cmets 已经说明了上述所有内容。
    • 我猜这个例子展示了prn 的扩展使用,通过调用一个函数并删除了一些参数,如果不存在,则采用默认值。我从来没有说过你的答案是错误的。上面那个比较适合我的问题。
    【解决方案2】:

    这可以通过sniff 函数的prn 参数来完成。 Scapy的教程有一个简单的例子here。 Scapy 的official API documentation 指定:

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

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


    编辑:
    The accepted answer 声称store 参数必须设置为0 才能调用prn 回调。但是,设置store=0 没有任何此类效果。 Scapy's own examples 不要设置 store=0 和 official API documentation 没有提到任何这样的要求。事实上,检查Scapy 的源代码发现store 和prn 参数之间没有任何联系。以下是相关代码块的摘录:

    ...
    if store:
        lst.append(p)
    c += 1
    if prn:
        r = prn(p)
        if r is not None:
            print r
    ...
    

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

    【讨论】:

    • 谢谢。我已经找到了它,我必须将store 参数设置为0 我猜是为了处理实时流量。但是到处都提到它很耗时,因此,我会尝试其他一些方法。无论如何,谢谢。
    • 哦,这太令人惊讶了。我希望设置store=0 会更有效率,如果有的话。你在哪里读到的?
    • FTR,不设置store=1意味着你将每个数据包存储在一个巨大的列表中。通常这用于嗅探几个数据包,但如果你永远不会停止嗅探(这里:没有超时也没有数据包计数),当你 ctrl^c 时,你最终会得到一个巨大的列表
    • @Cukic0d,感谢您的意见。但是我认为您的意思可能是 "setting store=1" 或 "not setting store=0" 而不是 "not setting store=1"对吧?
    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2021-06-03
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多