Python原始套接字(Windows):嗅探以太网帧

时间:2011-06-03 00:26:35

标签: 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界面上的所有内容?
  • 我应该在socket()构造函数中使用什么协议选项,因为我不想将它限制为IPPROTO_IP。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

FTR

  

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

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

如果您确实不想使用Scapy的解剖,则可以像普通套接字一样在其上调用recv()recv_raw()