使用python嗅探网络包的最佳方法是什么?
我从几个地方听说,最好的模块是一个名为scapy的模块,不幸的是,它使python.exe在我的系统上崩溃。我会假设这只是我如何安装它的一个问题,除了许多其他人告诉我它在Windows上不能很好地工作。(如果有人感兴趣,我正在运行Windows Vista,这可能会影响到某些事情)。
有人知道更好的解决方案吗?
UPD:
在阅读了告诉我安装Pypcap的答案后,我把它搞得一团糟,发现我曾经尝试过使用的scapy也在告诉我安装Pypcap,只是它是为它的使用而修改的版本。显然是这个修改后的Pypcap导致了问题,因为答案中的示例也导致了挂起。
我安装了Pypcap的原始版本(来自谷歌的网站),然后scapy开始工作得很好(我没有尝试很多东西,但至少在我开始嗅探的时候它没有崩溃)。我给那些狡猾的开发人员发了一张新的缺陷通知单:http://trac.secdev.org/scapy/ticket/166,希望他们能用它做点什么。
不管怎样,我只是想让你们都知道。
最佳答案
使用pypcap:
import dpkt, pcap
pc = pcap.pcap() # construct pcap object
pc.setfilter('icmp') # filter out unwanted packets
for timestamp, packet in pc:
print dpkt.ethernet.Ethernet(packet)
输出样本:
Ethernet(src='\x00\x03G\xb2M\xe4', dst='\x00\x03G\x06h\x18', data=IP(src='\n\x00\x01\x1c',
dst='\n\x00\x01\x10', sum=39799, len=60, p=1, ttl=128, id=35102, data=ICMP(sum=24667,
type=8, data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi'))))
Ethernet(src='\x00\x03G\x06h\x18', dst='\x00\x03G\xb2M\xe4', data=IP(src='\n\x00\x01\x10',
dst='\n\x00\x01\x1c', sum=43697, len=60, p=1, ttl=255, id=64227, data=ICMP(sum=26715,
data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi'))))