2011-05-10 24 views

Respuesta

12

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)] 
>>> 
+3

Gracias. Encontré otra opción: convertir el paquete en cadena y volver a crearlo con esa cadena. –

+1

@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'. –

+0

@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' –

21

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.

0

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).

Cuestiones relacionadas