Necesito saltear un paquete scapy
. La mayoría de las veces esto funciona, pero a veces el recolector se queja de un objeto de función. Como regla general, los paquetes ARP son muy buenos. Algunos paquetes UDP son problemáticos.Cómo recortar un paquete escaso?
Respuesta
Mi solución (como se inspiró en la lista de correo scapy) es como sigue:
class PicklablePacket:
"""A container for scapy packets that can be pickled (in contrast
to scapy packets themselves)."""
def __init__(self, pkt):
self.contents = bytes(pkt)
self.time = pkt.time
def __call__(self):
"""Get the original scapy packet."""
pkt = scapy.Ether(self.contents)
pkt.time = self.time
return pkt
en cualquier lugar que desee pasar un scapy
Packet
a través de un Queue
simplemente lo envuelve en un PicklablePacket
y __call__
se después. No estoy al tanto de los datos que no se conservan de esta manera. Sin embargo, este enfoque solo funciona con los paquetes Ethernet
. (Todos los paquetes olfateados en una NIC regular (no WLAN) son Ethernet.) Probablemente también podría extenderse para funcionar para otros tipos.
Gracias por publicar de nuevo. Si bien no necesitaba su solución exacta, me ayudó a encontrar la mía. –
(Esto es más de remisión, por lo que no califican espera) Lista
El Scapy [email protected] es bien supervisado y tiende a ser muy sensible. Si no obtiene respuestas aquí, intente allí también.
Oh, ahí es donde la comunicación continúa? El rastreador de problemas parece bastante inactivo. Al menos uno de mis errores se quedó allí durante medio año sin ninguna respuesta. –
como nota al margen, 500 paquetes por segundo podrían ser más que asas Scapy también. Está diseñado para la flexibilidad, no para la velocidad :) Pregunte en la lista.Realmente no lo uso mucho, así que no soy un experto. –
De hecho, puedo confirmar que Scapy maneja muy bien 500 paquetes por segundo. De acuerdo, uso más de un hilo y (después de esta pregunta) más de un proceso. –
Si con pickle te refieres serializar genéricamente siempre puedes usar los métodos de importación/exportación pcap: rdpcap and wrpcap.
wrpcap("pkt.pcap",pkt)
pkt = rdpcap("pkt.pcap")
O podría iniciar su proceso y tomar los paquetes en otro proceso. Si hay algún patrón que puede coincidir, por ejemplo un puerto o fuente conocida tcpdump IP trabajarán:
tcpdump -i eth0 -w FOO.pcap host 172.20.33.12 and \(udp or arp\)
A continuación, puede leer el PCAP generado en el anterior:
pkts = rdpcap('FOO.pcap')
1) Estoy hablando de 500 paquetes por segundo. –
2) Este método en realidad pierde datos. Por ejemplo, la marca de tiempo se redondea. Esto no es necesariamente un problema, pero debe tenerse en cuenta. –
¿Puede scapy incluso sacar 500 paquetes por segundo? Descubrí que al enviar paquetes es mucho menos que eso. Siempre puedes ejecutar un tcpdump en otra terminal. –
Usted puede monkeypatch la Packet
class e inyectar los métodos __getstate__
y __setstate__
que convierten la función en el objeto desde y hacia una representación seleccionable. Vea here para más detalles.
def packet_getstate(self):
# todo
def packet_setstate(self, state):
# todo
from scapy.packet import Packet
Packet.__getstate__ = packet_getstate
Packet.__setstate__ = packet_setstate
Esto es algo obvio para mí. La parte no obvia es la parte de todo. –
La inspección interactiva de un objeto 'Paquete 'que no funciona (' pprint.pprint (paquete .__ dict __)') mostraría fácilmente cuál es la función, si es una lambda, una función o un método de instancia. ¿Ya sabes qué tipo de función es? – piro
El rastreo completo es demasiado largo para un comentario, pero puede reproducirlo usted mismo fácilmente. La última línea es: pickle.PicklingError: no se puede saltear
Como se inspiró en este question se puede usar la biblioteca dill (u otras como sPickle, etc. - ver pypi search pickle) para guardar los paquetes scapy. P.ej. Instale el eneldo usando sudo easy_install dill
o sudo pip install dill
. He aquí un escenario de uso básico:
import dill as pickle
# E.g. Dump an array of packets stored in variable mypackets to a file
pickle.dump(mypackets, open('mypackets.dill-pickle', 'w'))
# Restore them from the file
mypackets = pickle.load(open('mypackets.dill-pickle', 'rb'))
Uno puede también, por supuesto, sólo tiene que utilizar las funciones nativas de Scapy para volcar los paquetes a un archivo pcap (legibles por tcpdump/Wireshark etc) - Si sólo hay una serie de paquetes:
wrpcap("packets_array.pcap",packets_array)
para obtener la clase PicklabePacket trabajar con scapy 3.0.0 se puede utilizar esta definición de clase:
class PicklablePacket:
"""A container for scapy packets that can be pickled (in contrast
to scapy packets themselves).
This works for python 3.5.1 and scapy 3.0.0 """
def __init__(self, pkt):
self.__contents = pkt.__bytes__()
self.__time = pkt.time
def __call__(self):
"""Get the original scapy packet."""
pkt = scapy.all.Ether(self.__contents)
pkt.time = self.__time
return pkt
- 1. Almacenamiento eficiente para un octree escaso?
- 2. ¿Cómo hacer que el archivo sea escaso?
- 3. Solve * escaso * sistema triangular superior
- 4. Recortar/recortar un archivo JPG con espacio vacío con Java
- 5. Cómo recortar el UIImage?
- 6. Recortar UIImage como un camscanner
- 7. Recortar un UIImage en iPhone
- 8. ¿Cómo serializar un paquete?
- 9. Cómo recortar una imagen enorme
- 10. Escaso eigsh de Scipy() para valores propios pequeños
- 11. Recortar un CAShapeLayer recuperar la ruta externa
- 12. json_encode matriz PHP escaso como array JSON, no objeto JSON
- 13. Paquete de rieles: ¿cómo deshacer paquete paquete?
- 14. imagen Matplotlib savefig recortar
- 15. cómo documentar un paquete python
- 16. TextMate - ¿Cómo instalar un paquete?
- 17. Cómo recortar automáticamente un borde blanco de imagen en Java?
- 18. iPhone - ¿Cómo se hace un rectángulo redimensionable para recortar imágenes?
- 19. Cómo recortar un rectángulo de una imagen en android
- 20. php cómo recortar cada línea en un heredoc (cadena larga)
- 21. Cómo recortar y rellenar un lienzo con una máscara alfa
- 22. Cómo recortar texto cuando se muestra un resumen del artículo?
- 23. Recortar audio con iOS
- 24. Recortar con PHP
- 25. Recortar páginas de un archivo .pdf
- 26. Recortar un CALayer en una ruta arbitraria
- 27. Recortar imagen en PHP
- 28. ¿Cuál es el sistema operativo bare-bone más escaso disponible?
- 29. ¿Cómo puedo recortar una imagen con Pygame?
- 30. Java: ¿Cómo "recortar" una matriz de bytes?
fondo es el uso en combinación con el módulo 'multiprocessing'. Requiere que los objetos sean seleccionables si desea transferirlos a través de 'Queue'. –
¿Podría alguien responder esta pregunta, así que puedo otorgar la recompensa? –