Как рассчитать контрольную сумму пакета, не отправляя ее? - PullRequest
17 голосов
/ 10 мая 2011

Я использую scapy и хочу создать пакет и вычислить его контрольную сумму, не отправляя его.Есть ли способ сделать это?

Спасибо.

Ответы [ 5 ]

29 голосов
/ 25 июля 2012

Я также пытался избежать show2 (), потому что он печатает пакет.В исходном коде я нашел лучшее решение:

del packet.chksum
packet = packet.__class__(bytes(packet))

Этот код регенерирует пакет с правильной контрольной суммой без какой-либо печати, и фактически это то, что show2 () выполняет в фоновом режиме перед печатью.

12 голосов
/ 20 мая 2011

Вам необходимо удалить значение .chksum из пакета после его создания;затем позвоните .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)]
>>>
2 голосов
/ 25 мая 2017

Добавьте этот патч в 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()

Затем, вместо вызова pkt.show2(), просто вызовите эту функцию pkt.checksum_silent(). (не забудьте сначала выполнить del pkt[IP].chksum и del pkt[UDP].chksum и т. Д.) , как показано в предыдущем ответе.

Эта функция должна быть быстрее и молчать.(Могут быть и другие вещи, которые нужно урезать; я взломал этот код вместе и проверил только, чтобы убедиться, что он молчал с правильной контрольной суммой.)

0 голосов
/ 07 июля 2019

Вы также можете использовать packet.build(), который возвращает необработанные байты с правильной контрольной суммой.Затем преобразуйте байты в пакет.

>>> import scapy.all as sp
>>> packet = sp.IP(src='127.0.0.1', dst='8.8.8.8')
>>> packet
<IP  src=127.0.0.1 dst=8.8.8.8 |>
>>> sp.IP(packet.build())
<IP  version=4 ihl=5 tos=0x0 len=20 id=1 flags= frag=0 ttl=64 
proto=hopopt chksum=0xebd8 src=127.0.0.1 dst=8.8.8.8 |>
0 голосов
/ 10 июля 2018

Действительно, функция show2() вычисляет контрольную сумму для вас, но она также печатает содержимое пакета после завершения своей работы.Тем не менее, show2() имеет полезный маленький параметр с именем dump.Источник описывает это так:

: параметр дампа: определить, печатает ли он или возвращает строковое значение

Таким образом, установив dump=True, вы можете избежать неприятныхвывод, который предоставляет функция по умолчанию, и все равно получит необходимые вычисления.

...