#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')
Это также позволяет вам учитывать порядковый номер ваших данных, если это важно в вашем домене. В этом случае данные отображаются с дополнением к нулю.
Надеюсь, это поможет!