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

标签 python networking tcp ip scapy

我正在努力将 scapy 与 twisted 集成,但我在 OSX 上遇到了这个我似乎无法弄清楚的非常奇怪的错误。

基本上我无法通过原始套接字发送有效的 TCP 数据包(包括 IP header )。这就是我正在做的:

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] 无效参数

如果你没有 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

如果您不添加零,它将不起作用。

最佳答案

我最终决定 Raw Sockets 只是为了使用而被窃听。特别是由于该软件需要跨平台,OSX 的怪癖可能不适用于其他操作系统。

目前我只是简单地包装了 scapy 提供的“套接字”。将来我会写一些只依赖于 libdnet 的东西(因为那是 scapy 编写原始帧的方式)。

你可以在这里找到这个实现:

https://github.com/hellais/txscapy

关于python - python中的原始套接字和sendto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11004249/

相关文章:

python - 如何修复[Errno 111]连接被拒绝

python - 使用python去除重复字符之间的部分字符串

linux - 当 firestarter 防火墙在 ubuntu 上启动时,winbindd 无法解析本地网络名称

jquery - 如何从通过ajax调用接收到的json数组动态生成html列表?

azure - 未通过点到站点 VPN 连接解析私有(private) DNS 区域到 Azure

c# - NetworkStream.Write 和 Flush 成功,尽管远程套接字已关闭

c++ - 可以读取 'select' 调用保持查找客户端套接字

java - 我的java代码经常陷入循环 "while ((line = rd.readLine()) != null) {"。如何优化代码

调用 print 语句中函数的 Python 顺序?

python - 如何在一个 View 中处理两个表单?