Я работаю над интеграцией Scapy с Twisted, но столкнулся с этой очень странной ошибкой в OSX, которую, похоже, не могу понять.
По сути, я не могу отправить действительный пакет TCP (включая заголовки IP) через необработанный сокет. Вот что я делаю:
import socket
from scapy.all import IP, TCP
pkt = IP(src='0.0.0.0', dst='127.0.0.1')/TCP()
spkt1 = str(pkt)
outs = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
outs.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
outs.sendto(spkt1, ('127.0.0.1', 0))
Когда я запускаю это, я получаю следующую ошибку:
outs.sendto(spkt1, ('127.0.0.1', 0))
socket.error: [Errno 22] Invalid argument
Если у вас нет scapy, вы не хотите его использовать, это пакет, закодированный base64:
import base64
spkt1 = base64.b64decode("RQAAKAABAABABvvOAAAAAH8AAAEAFABQAAAAAAAAAABQAiAAEH4AAA==")
Очень странно то, что почти идентичный пакет отправляется правильно:
spkt2 = base64.b64decode("RQBAAAWwAAACBgAAAAAAAH8AAAEAyAOEAAAAAAAAAACwAgDIAHsAAAIEBbQBAwMBAQEICk3PUjMAAAAABAIAAA==")
Вот как выглядят два пакета:
SPKT1
0000 45 00 00 28 00 01 00 00 40 06 FB CE 00 00 00 00 E..(....@.......
0010 7F 00 00 01 00 14 00 50 00 00 00 00 00 00 00 00 .......P........
0020 50 02 20 00 10 7E 00 00 P. ..~..
SPKT2
0000 45 00 40 00 05 B0 00 00 02 06 00 00 00 00 00 00 E.@.............
0010 7F 00 00 01 00 C8 03 84 00 00 00 00 00 00 00 00 ................
0020 B0 02 00 C8 00 7B 00 00 02 04 05 B4 01 03 03 01 .....{..........
0030 01 01 08 0A 4D CF 52 33 00 00 00 00 04 02 00 00 ....M.R3........
Проверяя их в wireshark, они отличаются только частью TCP.
Я провел много различных экспериментов, и в конце концов мне удалось установить определенные параметры TCP для отправки пакета, но не имеет смысла, что такой пакет не должен работать.
Кто-нибудь знает, почему это может происходить?
РЕДАКТИРОВАТЬ:
Этот пакет работает:
pkt = IP(len=16384, src='0.0.0.0', dst='127.0.0.1',
id=RandShort(), ttl=2)/TCP(sport=255,
dport=900, flags="S", window=200,
options=[('MSS', 1460), ('WScale', 2)])
spkt = bytes(pkt)
spkt += '\x00'*20
Если вы не добавите нули, это не сработает.
import
в своем первом фрагменте кода? (также забавный факт, когда я читал запрос на ваш вопрос: вы можете использовать"…".decode("base64")
и"…".encode("base64")
вместоimport base64
). Хорошо, извините, с этим помочь не могу. Но у вас есть мой голос. - person David Wolever   schedule 13.06.2012