Scapy сниффер пакетов инициирующее действие на каждого обнюхал пакет


Я использую scapy с python, чтобы нюхать живой трафик.

capture=sniff(iface="<My Interface>", filter="tcp")
Но это обнюхивает каждый пакет и добавляет его в список capture, который может быть обработан позже.

Я хочу обработать пакет и отобразить несколько полей пакета, как только он будет обнюхан. то есть, обнюхав пакет, он запустит функцию, в которой я смогу проанализировать этот пакет. И это продолжалось бы в течение нескольких пакетов.

У меня готова функция, которую я использую с захваченным списком пакетов. Но я не могу использовать это для каждого живого пакета.

Как этого добиться? Возможно ли это с помощью scapy или мне нужно установить какой-либо другой пакет?

2 6

2 ответа:

Параметры функции 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.

Источник.

Как упоминал Йоэль , если требуется только одно действие, lambda можно использовать с prn вместо новой функции, как в этом случае:

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

Это можно сделать с помощью аргумента prn функции sniff. В учебнике Scapy есть простой пример здесь. Scapy'S официальная документация API определяет:

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
...

Выполнение нескольких простых тестовых случаев поддерживает этот вывод как хорошо.