scapy "Ether ()" не имеет аргумента "chksum" - PullRequest
0 голосов
/ 30 апреля 2019

«Последовательность проверки кадра» представляет собой 32-разрядную «контрольную сумму» CRC по всему кадру Ethernet, начиная с DMAC и охватывая SMAC, тип и полезную нагрузку. Он передается как последние четыре байта кадра Ethernet, перед межпакетным промежутком.

Я ожидаю, что метод Ether () Scapy будет иметь аргумент для атрибута пакета для этого поля. Это не так.

Обратите внимание, что методы Scapy, такие как IP () и TCP () / UDP (), содержат аргумент контрольной суммы ("chksum") для дополнительных контрольных сумм, определенных для этих протоколов.

Например ...

> IP( raw(UDP(chksum=0) / IP(version=4, chksum(0)) )
<IP  version=0 ihl=0 tos=0x35 len=53 id=28 flags= frag=0 ttl=69 proto=hopopt chksum=0x14 src=0.1.0.0 dst=64.0.0.0 |<Raw load='\x7f\x00\x00\x01\x7f\x00\x00\x01' |>>
> ls(Ether)
dst    : DestMACfield    = (None)
src    : SourceMACfield  = (None)
type   : XShortEnumField = (36864)
> Ether( raw(Ether()) )
<Ether dst=ff:ff:ff:ff:ff:ff src=12:34:56:78:9a:bc type=LOOP |>
> Ether.chksum()
AttributeError: chksum

1 Ответ

1 голос
/ 30 апреля 2019

FCS не реализована в кадрах Ethernet в Scapy по двум причинам.

  • Во-первых, исторически Scapy испытывал проблемы с получением FCS, если он был в конце пакета (но этоэто уже не так, потому что FCSField - это дело).
  • Во-вторых, большинство ОС не предоставляют его по умолчанию, и когда это происходит, нет никакого способа узнать, что на самом деле существует FCS, кроме предположения, чтозаполнение в конце пакета - это FCS.Если вы чувствуете, что это должно быть добавлено, вам, вероятно, следует открыть вопрос на их трекере.

Оригинальный ответ:

Похоже, вы новичок вScapy, тебе следует начать с официального документа или учебника .

Scapy автоматически создает аргументы chksum при сборке пакета.Создание пакета означает преобразование его в байты: использование bytes(pkt) или raw(pkt) (или pkt.build())

Например, show2() показывает, как выглядит пакет при сборке:

>>> pkt = IP()/UDP()/ICMP()
>>> pkt.show2()
 ###[ IP ]### 
  version= 4
  ihl= 5
  tos= 0x0
  len= 36
  id= 1
  flags= 
  frag= 0
  ttl= 64
  proto= udp
  chksum= 0x7cc6   <-------
  src= 127.0.0.1
  dst= 127.0.0.1
[...]

Контрольная сумма рассчитывается только в том случае, если она равна None, так что она позволяет вам установить пользовательскую (неправильную), когда вам это нужно.Если вы хотите проверить, что он содержит, вы можете собрать пакет вручную:

>>> pkt = IP(raw(pkt))
>>> pkt[IP].chksum
31942
...