基本上,我无法通过原始套接字发送有效的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
)。好的,抱歉,我无法帮助您解决这个问题。但是您已经得到了我的赞同。 - David Wolever