【问题标题】:Python raw socket frames never received从未收到 Python 原始套接字帧
【发布时间】:2018-12-27 14:22:05
【问题描述】:

我正在使用 RHEL6 计算机并尝试通过 RAW 套接字与 Windows XP 计算机通信。

当我在 RHEL 计算机上收到特定帧时,使用 RAW 套接字的 Python 2 脚本会处理该帧并更改以下字段,然后再将其发送到 Windows 计算机:

  • 目标 MAC
  • 目标 IP
  • IP ID
  • 校验和

数据包到达我的 Windows XP 计算机,因为我在 Wireshark 中看到了数据包,但它从未到达应用层,因为需要数据包的软件没有反应。

这就是我创建发送数据包的方式:

import socket, binascii, optparse
s=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
s.bind(('eth1',0))
while True:

    result =  s.recv(65535)
    if binascii.hexlify(result[30:34]).decode() == "<WANTED FRAME IP>":
        result2 = "<DEST_MAC>".decode("hex") +  result[6:18] + "<IP_ID>".decode("hex") + result[20:24] + "<CHECKSUM>".decode("hex") + result[26:30] + "<DEST_IP>".decode("hex") + result[34:]
    s.send(result2)

当我尝试使用“经典”套接字时,目标软件正确接收数据包,但这不是我想要的行为,因为我必须使用 RAW 套接字来发送它们。

我尝试使用相同的代码发送其他简单的 UDP 数据包,结果我得到了相同的行为,数据包在 Wireshark 上正确看到,但从未到达我的 Windows XP 上的应用程序层。

知道为什么我的 RAW 套接字数据包没有被目标正确处理吗?

【问题讨论】:

  • 如果您的应用程序需要特定端口上的 TCP 或 UDP 数据报,则原始套接字将无法工作。

标签: python windows-xp wireshark rhel raw-sockets


【解决方案1】:

您需要在操作系统上启用混杂模式,否则它只会在数据包到达您的应用程序之前将其杀死。看起来像这样:

sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)
sniffer.bind((host, 0))
if os.name == “nt”:
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

这是一个关于如何在 linux 和 Windows 上使用 python 启用它的教程:https://codingsec.net/2016/05/packet-sniffing-windows-linux-using-python/

【讨论】:

  • 我已经在目标计算机上使用wireshark,以混杂模式捕获数据包,所以这还不足以让数据包到达应用程序吗?
  • Wireshark 为自己打开了混杂模式。您的应用程序必须这样做,否则该套接字将一无所获(就像您描述的那样)
  • 好的,我会尽量让它工作,即使我没有目标应用程序的源代码。
  • 您知道 Windows XP 如何丢弃从 RAW 套接字而不是经典套接字发送的数据包吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
相关资源
最近更新 更多