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 ...
Выполнение нескольких простых тестовых случаев поддерживает этот вывод как хорошо.