【发布时间】:2012-06-15 18:47:58
【问题描述】:
我正在努力将 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
如果你不添加零,它就不起作用。
【问题讨论】:
-
你能在你的第一个代码 sn-p 中修复
import吗? (另外,当我阅读您的问题请求时,有趣的事实是:您可以使用"…".decode("base64")和"…".encode("base64")而不是import base64)。好吧,对不起,这个帮不了了。但你有我的赞成票。 -
FWIW,我在您的代码上遇到了同样的错误。
标签: python networking tcp ip scapy