“OSError:[WinError 10022] 提供了无效参数”尝试发送 TCP SYN 数据包(python)
Posted
技术标签:
【中文标题】“OSError:[WinError 10022] 提供了无效参数”尝试发送 TCP SYN 数据包(python)【英文标题】:"OSError: [WinError 10022] An invalid argument was supplied" when trying to send TCP SYN packet (python) 【发布时间】:2022-01-07 23:05:18 【问题描述】:目前尝试使用原始套接字在 python 上进行握手过程,但由于某种原因,我无法发送任何带有 TCP 协议接收 OSError: [WinError 10022] 提供的参数无效的数据包。这是我的代码:
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.sendto(packet, ('8.8.8.8', 80))
作为数据包,我尝试使用 scapy 的 TCP 数据包,在与其他库成功发送后来自wireshark 的 TCP 字节以及手工制作的字节字符串:
def chksum(packet: bytes) -> int:
if len(packet) % 2 != 0:
packet += b'\0'
res = sum(array.array("H", packet))
res = (res >> 16) + (res & 0xffff)
res += res >> 16
return (~res) & 0xffff
class TCPPacket:
def __init__(self,
src_host: str,
src_port: int,
dst_host: str,
dst_port: int,
flags: int = 0):
self.src_host = src_host
self.src_port = src_port
self.dst_host = dst_host
self.dst_port = dst_port
self.flags = flags
def build(self) -> bytes:
packet = struct.pack(
'!HHIIBBHHH',
self.src_port, # Source Port
self.dst_port, # Destination Port
0, # Sequence Number
0, # Acknoledgement Number
5 << 4, # Data Offset
self.flags, # Flags
8192, # Window
0, # Checksum (initial value)
0 # Urgent pointer
)
pseudo_hdr = struct.pack(
'!4s4sHH',
socket.inet_aton(self.src_host), # Source Address
socket.inet_aton(self.dst_host), # Destination Address
socket.IPPROTO_TCP, # PTCL
len(packet) # TCP Length
)
checksum = chksum(pseudo_hdr + packet)
packet = packet[:16] + struct.pack('H', checksum) + packet[18:]
return packet
所以真的不知道为什么我的套接字不喜欢任何数据包
【问题讨论】:
我怀疑你需要在你的数据包上调用build
来获取字节:见这里***.com/questions/13999393/python-socket-sendto/…
感谢您的回答,但事实并非如此。我调用构建函数,否则它将是一些关于字符串而不是链接中的字节的异常。
【参考方案1】:
我发现出了什么问题。 Windows 不允许使用原始套接字发送 TCP 数据包,因此此代码将永远无法工作。可能可以使用 scapy 或使用其他库来编写相同的内容,但这不是我需要的,因此使其工作的唯一方法是在 linux 上运行。仍然不确定数据包创建是否正确,但带有原始套接字的 TCP 协议在 linux 上确实可以正常工作。
【讨论】:
以上是关于“OSError:[WinError 10022] 提供了无效参数”尝试发送 TCP SYN 数据包(python)的主要内容,如果未能解决你的问题,请参考以下文章