Python原始套接字(Windows)中:嗅探以太网帧
问题描述:
我已经看到了创建套接字使用嗅探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函数),并不适合我想要做的。原始插座完全符合我的需求。
答
没有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包装。