Scapy сниффер пакетов инициирующее действие на каждого обнюхал пакет
Я использую scapy с python, чтобы нюхать живой трафик.
capture=sniff(iface="<My Interface>", filter="tcp")
Но это обнюхивает каждый пакет и добавляет его в список capture, который может быть обработан позже.
Я хочу обработать пакет и отобразить несколько полей пакета, как только он будет обнюхан. то есть, обнюхав пакет, он запустит функцию, в которой я смогу проанализировать этот пакет. И это продолжалось бы в течение нескольких пакетов.
У меня готова функция, которую я использую с захваченным списком пакетов. Но я не могу использовать это для каждого живого пакета.
Как этого добиться? Возможно ли это с помощью scapy или мне нужно установить какой-либо другой пакет?
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 ...Выполнение нескольких простых тестовых случаев поддерживает этот вывод как хорошо.