2011-06-03 75 views
3

我已经看到了创建套接字使用嗅探IP数据包,例如几个例子:Python原始套接字(Windows)中:嗅探以太网帧

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

我所试图实现的,是嗅探以太网框架并分析Windows中收到的数据。我感兴趣的数据包是PPPoE帧不包含IP

的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)) 

现在由于betweeen Linux的插座的WinSock2 API的差异,我有以下兼容性问题:

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

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

注:我知道像Scapy的库可用于嗅探,但如果我们试图做到这一点失去了包任何精心过滤(或使用prn函数),并不适合我想要做的。原始插座完全符合我的需求。

回答

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包装。

相关问题