Estoy usando scapy, y quiero crear un paquete y calcular su 'suma de comprobación sin enviarlo. ¿Hay una manera de hacerlo?¿Cómo calcular una suma de comprobación de paquete sin enviarlo?
Gracias.
Estoy usando scapy, y quiero crear un paquete y calcular su 'suma de comprobación sin enviarlo. ¿Hay una manera de hacerlo?¿Cómo calcular una suma de comprobación de paquete sin enviarlo?
Gracias.
Debe eliminar el valor .chksum
del paquete después de crearlo; a continuación, llamar .show2()
>>> from scapy.layers.inet import IP
>>> from scapy.layers.inet import ICMP
>>> from scapy.layers.inet import TCP
>>> target = "10.9.8.7"
>>> ttl = 64
>>> id = 32711
>>> sport = 2927
>>> dport = 80
>>> pak = IP(dst=target, src = "100.99.98.97", ttl=ttl, flags="DF", id=id, len=1200, chksum = 0)/TCP(flags="S", sport=sport, dport=int(dport), options=[('Timestamp',(0,0))], chksum = 0)
>>> del pak[IP].chksum
>>> del pak[TCP].chksum
>>> pak.show2()
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 1200
id = 32711
flags = DF
frag = 0L
ttl = 64
proto = tcp
chksum = 0x9afd
src = 100.99.98.97
dst = 10.9.8.7
\options \
###[ TCP ]###
sport = 2927
dport = www
seq = 0
ack = 0
dataofs = 8L
reserved = 0L
flags = S
window = 8192
chksum = 0x2c0e
urgptr = 0
options = [('Timestamp', (0, 0)), ('EOL', None)]
>>>
También he intentado evitar show2(), ya que imprime el paquete. que he encontrado en la fuente de una mejor solución:
del packet.chksum
packet = packet.__class__(str(packet))
Este código regenerar el paquete con la suma de comprobación correcta sin ningún tipo de impresión y de hecho es lo que show2 run() en el fondo antes de imprimir.
Añadir este parche a Scapy/packet.py:
+ def checksum_silent(self):
+ """
+ Internal method that recalcs checksum without the annoying prints
+ **AFTER old checksums are deleted.**
+ """
+
+ for f in self.fields_desc:
+ if isinstance(f, ConditionalField) and not f._evalcond(self):
+ continue
+ fvalue = self.getfieldval(f.name)
+ if isinstance(fvalue, Packet) or (f.islist and f.holds_packets and type(fvalue) is list):
+ fvalue_gen = SetGen(fvalue,_iterpacket=0)
+ for fvalue in fvalue_gen:
+ fvalue.checksum_silent()
+ if self.payload:
+ self.payload.checksum_silent()
A continuación, en lugar de llamar pkt.show2()
, simplemente llamar a esta función pkt.checksum_silent()
. (Recuerde hacer primero del pkt[IP].chksum
y del pkt[UDP].chksum
, etc.) como se muestra en la respuesta anterior.
Esta función debe ser más rápida y silenciosa. (También puede haber cosas adicionales para recortar, pirateé este código y solo lo probé para asegurarme de que fuera silencioso con la suma de comprobación correcta).
Gracias. Encontré otra opción: convertir el paquete en cadena y volver a crearlo con esa cadena. –
@Dima, gracias por la sugerencia. Quería evitar 'show2()' porque todo el resultado era innecesario. Tal vez debería ser simplemente una función de paquete 'recalc'. –
@Mr. Shickadance, puede silenciar fácilmente 'stdout' por un momento al reasignarlo ... es decir' stdout, null = sys.stdout, open ('/ dev/null', 'w'); sys.stdout = null'. Cuando haya terminado reasigne de nuevo con 'sys.stdout = stdout' –