2012-08-03 25 views
5

En Scapy, quiero manualmente coinciden los paquetes con sus correspondientes mensajes ICMP excedidos en el tiempo.Scapy: ¿cómo obtengo el encabezado completo del paquete IP?

necesito para que coincida con:

  • IP-en-ICMP campo del paquete ICMP
  • cabecera IP y los primeros 8 bytes de mi paquete de datos El paquete ICMP no es un problema:

    icmpPayload = str (icmpPacket [ICMP] .payload)

en cuanto a los primeros 8 bytes del paquete de datos, I ju st tiene que hacer:

str(myPacket[IP].payload)[:8] 

No sé cómo conseguir solamente la cabecera IP de myPacket. Todo lo que hago ahora es reemplazar la carga en todo el paquete con sus primeros 8 bytes. Esta búsqueda y reemplazo, si se aplica a miles de paquetes, pueden tomar mucho tiempo, me temo:

strOfMyPacket = str(myPacket[IP]) 
strOfMyPacket.replace(str(myPacket[IP].payload),str(myPacket[IP].payload)[:8],1) 

Cualquier forma más rápida que me permita hacer simplemente lo siguiente?

partOfPayload = str(myPacket[IP].payload)[:8] 
fullHeader = _______ 
stringToCompare = fullHeader + partOfPayload 
+0

probablemente sólo : 'str (myPacket [IP]) [28]' –

Respuesta

4
str(myPacket)[:(myPacket[IP].ihl * 4)] 

La longitud de la cabecera IP se encuentra en el campo ihl (Internet Header Length). Se representa como el número de palabras de 32 bits que usa el encabezado. (es variable debido a la sección 'opciones' del encabezado). Entonces, si multiplicamos ese campo por 32 y luego lo dividimos por 8 (o * 4) obtenemos la cantidad de bytes que llena el encabezado, ya sea que tenga opciones o no.

Me sorprende que no haya ningún método (que pueda encontrar) para devolver JUSTO el encabezado IP sin las capas inferiores.

http://en.wikipedia.org/wiki/IPv4_header#Header

3

En caso de que alguien golpes demás en esta pregunta, creo que puede ser capaz de utilizar remove_payload() en función de la clase de paquetes (heredado por IP). Esto debería simplemente dejar el encabezado. Soy nuevo en scapy pero parece que funciona cuando lo probé en el intérprete.

>>> ip = IP(dst='10.0.0.1', src='10.0.0.14', ttl=255)/ICMP() 
>>> hexdump(ip) 
0000 45 00 00 1C 00 01 00 00 FF 01 A7 D1 0A 00 00 0E E............... 
0010 0A 00 00 01 **08 00 F7 FF 00 00 00 00**    ............ 
>>> ip.remove_payload() 
>>> hexdump(ip) 
0000 45 00 00 14 00 01 00 00 FF 00 A7 DA 0A 00 00 0E E............... 
0010 0A 00 00 01          .... 
>>> 
+0

Gracias! No sabía acerca de esta función. –

+1

¿Hay alguna forma de eliminar los encabezados? es decir: Ethernet, IPv4 o TCP – SuB

Cuestiones relacionadas