Преобразовать тип scapy "IP" в "Bytes" - PullRequest
1 голос
/ 07 апреля 2020

Я использую python3 и nfqueue для изменения пакетов на лету.

Фон

Версия Scapy: 2.4.1

Python ' s NetfilterQueue ( PyPi ) имеет методы для преобразования пакетов в «scapy-совместимые» строки / байты и наоборот:

  • get_payload, что возвращает совместимый со scapy string in python 2, BYTES in python 3.

  • set_payload, который устанавливает полезную нагрузку пакета после того, как мы закончили со scapy.

Проблема

После того, как я использую get_payload, я могу использовать метод IP() scapy для приятного изменения разделов пакета. Однако, когда я закончу, у меня останется объект типа «IP», который я хочу преобразовать в тип «байты» (чтобы иметь возможность использовать set_payload на нем).

Вывод кода при печати IP-адресов

(в данном случае 'nnnn' - это фактические данные пакетов)

running...

<class 'scapy.layers.inet.IP'>

b'E\x00\x008\x82\x00@\x00@\x06\xba\xbd\x7f\x00\x00\x01\x7f\x00\x00\x01\xeaj\x1f\x91(\x02\xb9\xffq\xa4\xd6\xbe\x80\x18\x02\x00\xf2W\x00\x00\x01\x01\x08\n\xa8b\x11*\xa8b\x11*nnnn'

b'nnnn'

Argument 'payload' has incorrect type (expected bytes, got IP)

Q

Как преобразовать тип scapy.layers.inet.IP в введите "байты" в python3?

1 Ответ

2 голосов
/ 07 апреля 2020

Из исходного кода вы можете либо вызвать метод build , либо передать IP объект в bytes напрямую, как IP реализует __bytes__ dunder метод:

from scapy.layers.inet import IP

p = IP(dst="github.com")

print(p)         # b'E\x00\x00\x14\x00\x01\x00\x00@\x00l\x82\n\x0c\x02\x05\x8cRv\x04'
print(p.build()) # b'E\x00\x00\x14\x00\x01\x00\x00@\x00l\x82\n\x0c\x02\x05\x8cRv\x04'
print(bytes(p))  # b'E\x00\x00\x14\x00\x01\x00\x00@\x00l\x82\n\x0c\x02\x05\x8cRv\x04'
...