python的sendto_python中的原始套接字和sendto

我正致力于将scapy与twisted集成,但我在OSX上遇到了一个非常奇怪的bug,我似乎无法理解。

基本上,我无法通过原始套接字发送有效的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

如果你不加零,它就不起作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Python原始套接字(raw sockets)对目标主机进行 ping 测试。具体实现可以使用 Python 内置的 socket 模块进行操作。以下是一个简单的示例代码: ```python import socket import struct import time def ping(host): # 构造 ICMP 报文 seq_num = 1 icmp_type = 8 # ping 请求 icmp_code = 0 icmp_checksum = 0 icmp_id = socket.getpid() & 0xFFFF # 可以自定义 # 构造 ICMP 报文 packet = struct.pack("!BBHHH", icmp_type, icmp_code, icmp_checksum, icmp_id, seq_num) cksum = calculate_checksum(packet) # 重新计算校验和 packet = struct.pack("!BBHHH", icmp_type, icmp_code, cksum, icmp_id, seq_num) # 建立原始套接字并发送 ICMP 报文 sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) sock.sendto(packet, (host, 0)) # 接收并解析响应报文 sock.settimeout(5.0) try: data, addr = sock.recvfrom(1024) icmp_type, icmp_code, icmp_checksum, icmp_id, icmp_seq = struct.unpack("!BBHHH", data[20:28]) return True except socket.timeout: return False finally: sock.close() def calculate_checksum(data): n = len(data) % 2 sum = 0 for i in range(0, len(data)-n, 2): sum += (data[i] << 8) + data[i+1] if n: sum += (data[-1] << 8) sum = (sum >> 16) + (sum & 0xffff) sum += (sum >> 16) return ~sum & 0xffff if __name__ == "__main__": host = "www.google.com" # 目标主机 if ping(host): print(f"{host} is reachable") else: print(f"{host} is unreachable") ``` 注意,在 Windows 平台下,原始套接字需要以管理员权限运行 Python 解释器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值