Red de conocimiento informático - Material del sitio web - ¿Cómo capturar todos los paquetes TCP en la tarjeta de red en Python en Linux?

¿Cómo capturar todos los paquetes TCP en la tarjeta de red en Python en Linux?

Ethereal viene con decodificadores para múltiples protocolos, que son simples y fáciles de usar. Es un software de código abierto basado en winpcap. Pero su arquitectura no es flexible. Para agregar un decodificador autodefinido, es necesario modificar el código Ethereal y volver a compilarlo, lo cual es muy tedioso. Para los protocolos de texto sin formato ordinarios, no hay problema, pero para los protocolos cifrados, como los juegos en línea, generalmente el programa cliente enviará una clave aleatoria cuando se conecte por primera vez y luego usará esta clave para cifrar el mensaje. Entonces, si quieres descifrarlo, debes tener un capturador de paquetes programable.

Libpcap es una buena opción, pero requiere "pruebas-> repetidas; el lenguaje C obviamente no es una buena opción para modificar el funcionamiento de este programa.

Python proporciona varios libpcapbind. En la plataforma Windows, primero debe instalar winpcap, lo cual es muy útil si ya ha instalado Ethereal

Proceso de captura de paquetes estandarizado

Importar pcap

Importar dpkt

Pc=pcap.pcap() #Tenga en cuenta que el parámetro puede ser el nombre de la tarjeta de red, como eth0

Pc.setfilter('tcp port 80. ') #Establecer filtrado de escucha

Para ptime, pdata en pc: # ptime es la hora de recepción, pdata son los datos recibidos

Imprimir ptime, pdata #...

p>

Descomprimir paquetes Ethernet V2 capturados

p=dpkt.ethernet.Ethernet(pdata)

Si p.data.__class__=='IP':

ip = ' d. d. d ' tupla(mapa(ord, lista(p.data.dst)))

if p.data.data.__class__. >Si data.dport==80:

Impreso por gashero p.data.data.data #

Algunos parámetros de visualización

nrecv, ndrop, nifdrop= pc.stats()

En la tupla devuelta, el primer parámetro es el paquete recibido y el segundo parámetro es el paquete descartado por el kernel.