2015-02-03 5 views
6

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

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

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

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

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

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

ответ

7

Параметрами функции нюхать должны быть как ниже код .:

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) 
+0

Пожалуйста, прочтите [этот ответ] (http://stackoverflow.com/a/28296641/3903832) относительно вашего требования при установке 'store = 0'. – Yoel

+0

@Yoel Это не повлияет на выполнение программы. Но вы не думаете, что добавление каждого пакета в список ('store = 1') является дополнительным издержком, в то время как мы обрабатываем каждый пакет с помощью' prn'. Нужно ли нам хранить эти пакеты? – RatDon

+0

Это не то, что вы отвечаете изначально изложил. Я согласен с тем, что установка 'store = 0' немного улучшит эффективность пространства и времени, и я даже утверждал, что в комментарии к [моему ответу] (http://stackoverflow.com/a/28296641/3903832), когда вы действительно утверждали, что напротив. Теперь, когда вы отредактировали свой ответ, это правильно, хотя я не вижу, что он добавляет к обсуждению, так как мой ответ и его комментарии, которые были опубликованы давно, уже изложили все вышесказанное. – Yoel

5

Это можно сделать с помощью аргумента prn функции sniff. Учебник Scapy имеет простой пример here. Scapy «s official API documentation указывает:

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

...
prn: функция применяется к каждому пакету. Если что-то возвращается, оно отображается. Например, вы можете использовать prn = lambda x: x.summary().
...


EDIT:
The accepted answer утверждает, что store аргумент должен быть установлен в 0 для prn обратного вызова, который будет вызван. Однако установка store=0 не имеет такого эффекта. Scapy's own examples не устанавливаются store=0 и official API documentation не упоминает о таком требовании. Фактически, при проверке исходного кода Scapy не обнаружено никакого соединения между аргументами и prn. Вот выдержка из соответствующего кодового блока:

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

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

+0

Спасибо. Я уже нашел это, и я должен установить параметр 'store' в' 0', я думаю, обрабатывать прямой трафик. Но везде упоминается, что это требует много времени, и, следовательно, я попытаюсь использовать другие средства. В любом случае, спасибо. – RatDon

+0

О, это удивительно. Я бы ожидал, что установка 'store = 0' будет более эффективной, если угодно. Где вы это читали? – Yoel