Python 原始套接字 (Windows) : Sniffing Ethernet Frames

标签 python sockets winsock sniffing

我见过几个创建套接字来嗅探 IP 数据包的示例,例如使用:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

我想要实现的是嗅探以太网帧并分析在 Windows 中接收到的数据。我感兴趣的数据包是 不包含 IP 的 PPPoE 帧

Linux(使用 python)中,我能够使用:

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(3))
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, struct.pack("%ds"%(len("eth0")+1,),"eth0"))
while condition:
    pkt = s.recvfrom(1500)
    addToQueue(filter(pkt))

现在由于 linux 套接字和 WinSock2 API 之间的差异,我遇到了以下兼容性问题:

  • 没有用于 windows 的 IN 包。这意味着 SO_BINDTODEVICE 不存在。 如何嗅探 eth0 接口(interface)上的所有内容?
  • 我应该在 socket() 构造函数中使用什么协议(protocol)选项,因为我不想将它限制为 IPPROTO_IP。

谁能指出我正确的方向?我遇到了类似的问题,但没有一个真正解决了我的问题,因为它们都与 IP 数据包嗅探有关

注意:我知道像 Scapy 这样的库可以用于嗅探,但如果我们尝试进行任何精细的过滤(或使用 prn 函数)它会丢失数据包并且不适合我正在尝试做的事情。原始套接字非常适合我的需要。

最佳答案

我无法在没有 Windows 框的情况下验证这一点,但我认为你所需要的只是......

HOST = socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
s.bind((HOST, 0))
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
while condition:
    pkt = s.recvfrom(1500)
    addToQueue(filter(pkt))

此外,我建议您改用 pypcap(或其他 libpcap 包装器)之类的东西。

关于Python 原始套接字 (Windows) : Sniffing Ethernet Frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6221842/

相关文章:

python - 具有 Python 特定过滤器的 OpenCV 不一样

c++ - 带有 MSG_PEEK 的 recv() 显示完整消息,但正常返回 'would block'

c++ - 中断接收套接字

python - FigureCanvasAgg' 对象没有属性 'invalidate' ? python 绘图

python - Pytorch - 推断线性层 in_features

Python 总结器 Sumy

java - 服务器端收到 UDP 错误数据

c - libncurses : non-blocking STDIN + select on socket

java - 聊天服务器 - 实现选项

c++ - Winsock 2 可移植性