Самый простой способ «заполнить» полезную нагрузку?

#python #sockets #udp #scapy

#python #сокеты #udp #scapy

Вопрос:

Я не хочу отправлять UDP-пакет с произвольным размером пакета в зависимости от моего входного аргумента, поэтому всякий раз, когда моих «данных» недостаточно для заполнения требуемой полезной нагрузки пакета, я хочу просто «заполнить» остальное пустыми данными.

Поэтому, если я отправляю 123 , но хочу, чтобы пакет имел размер 100 байт, метод дополнит пакет данными доступа, я не хочу повторять и добавлять пробелы, чтобы заполнить его вручную.

Какие-нибудь советы?

Ответ №1:

Попробуйте этот способ:

 >>> from scapy.all import *
WARNING: No route found for IPv6 destination :: (no default route?)
>>> p = IP(dst="62.21.20.21")/UDP()
>>> p = p/Raw('a'*(100-len(p)))
>>> send(p)
.
Sent 1 packets.
>>>

# tcpdump -ni cplane0 udp -e -v -X
tcpdump: listening on cplane0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:15:31.904204 54:ab:3a:56:59:1e > fa:16:3e:e1:9e:14, ethertype IPv4 (0x0800), length 114: (tos 0x0, ttl 62, id 1, offset 0, flags [none], proto UDP (17), length 100)
    44.60.11.3.53 > 62.21.20.21.53: 24929 updateM  [b2amp;3=0x6161] [24929a] [24929q] [24929n] [24929au][|domain]
        0x0000:  4500 0064 0001 0000 3e11 f31f 2c3c 0b03  E..d....>...,<..
        0x0010:  3e15 1415 0035 0035 0050 c3c9 6161 6161  >....5.5.P..aaaa
        0x0020:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa
        0x0030:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa
        0x0040:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa
        0x0050:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa
        0x0060:  6161 6161                                aaaa
  

Пожалуйста, обратите внимание на «proto UDP (17), длина 100» в выводе tcpdump.

Ответ №2:

Вы можете создать дополнение bytearray() и просто добавить (или добавить) его к своей полезной нагрузке:

 payload = b'123'
padding_length = 100 - len(payload)
padding_byte = b' '
return bytearray(padding_byte * padding_length)   payload
  

Ответ №3:

Я не специалист по сетевым технологиям, но вы можете взглянуть на struct.pack()

Это приведет к обнулению длины символов и должно быть быстрым:

 from struct import pack

result = pack('!100s', 'input_value')
  

Это также позволяет вам учитывать порядковый номер ваших данных, если это важно в вашем домене. В этом случае данные отображаются с дополнением к нулю.

Надеюсь, это поможет!