J'utilise scapy
avec python
pour renifler le trafic en direct.
capture=sniff(iface="<My Interface>", filter="tcp")
Mais cela renifle chaque paquet et l'ajoute à la liste capture
qui peut être traitée plus tard.
Je veux traiter un paquet et afficher quelques champs du paquet, dès qu'il est reniflé. c'est-à-dire qu'en reniflant un paquet, il déclenchera une fonction où je pourrai analyser ce paquet. Et cela continuerait pour quelques paquets.
J'ai la fonction prête que j'utilise avec la liste des paquets capturés. Mais je ne peux pas l'utiliser pour chaque paquet en direct.
Comment y parvenir? Est-ce possible avec scapy
ou dois-je installer un autre package?
Les paramètres de la fonction sniff doivent être comme le code ci-dessous:
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
dit de ne stocker aucun paquet reçu et prn
dit d'envoyer le pkt
à pkt_callback
.
Comme mentionné par Yoel , si une seule action est requise, lambda
peut être utilisé avec prn
au lieu d'une nouvelle fonction comme dans ce cas:
sniff(iface="<My Interface>", prn = lambda x: x.show(), filter="tcp", store=0)
Cela peut être fait avec l'argument prn
de la fonction sniff
. Le tutoriel de Scapy
a un exemple simple ici . Scapy
's documentation officielle de l'API spécifie:
sniff(prn=None, lfilter=None, count=0, store=1, offline=None, L2socket=None, timeout=None)
...
prn
: fonction à appliquer à chaque paquet. Si quelque chose est retourné, il s'affiche. Par exemple, vous pouvez utiliserprn = lambda x: x.summary()
.
...
MODIFIER:
La réponse acceptée affirme que l'argument store
doit être défini sur 0
pour que le rappel prn
soit appelé. Cependant, la définition de store=0
n'a pas un tel effet. Scapy
propres exemples ne pas définir store=0
et le documentation officielle de l'API ne mentionne pas une telle exigence. En fait, inspecter le code source de Scapy
ne révèle aucune connexion entre les arguments store
et prn
. Voici un extrait du bloc de code correspondant:
...
if store:
lst.append(p)
c += 1
if prn:
r = prn(p)
if r is not None:
print r
...
L'exécution de quelques cas de test simples prend également en charge cette constatation.