【问题标题】:Python Raw Sockets (Windows): Sniffing Ethernet FramesPython 原始套接字 (Windows):嗅探以太网帧
【发布时间】:2011-06-03 00:26:34
【问题描述】:

我见过几个创建套接字以嗅探 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 接口上的所有内容?
  • socket() 构造函数中的协议选项应该使用什么,因为我不想将其限制为 IPPROTO_IP。

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

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

【问题讨论】:

    标签: python sockets winsock sniffing


    【解决方案1】:

    如果没有 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 包装器)之类的东西。

    【讨论】:

      【解决方案2】:

      FTR

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

      如果你获得 Scapy 并设置 conf.use_pcap = False,你可以使用 sock = conf.L2socket() 创建一个 Windows 原始套接字,根据你自己不会“丢失数据包”。

      如果你真的不想使用 Scapy 的解剖,你可以像普通套接字一样调用 recv()recv_raw()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-16
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多