我实际上是想用python嗅探数据包(使用pypcap和dpkt)。
我尝试了以下内容:
import dpkt, pcap
pc = pcap.pcap() # construct pcap object
pc.setfilter('src host X.X.X.X or dst host X.X.X.X')
for timestamp, packet in pc:
print dpkt.ethernet.Ethernet(packet)
但是当我启动脚本时没有任何反应......我错过了什么吗?
使用Python 2.7 在OS X约塞米蒂(10.10)
答案 0 :(得分:8)
这个问题已经过时了,但对于可能会遇到这个问题的新人来说。 github'chain'项目使用pypcap和dpkt来完成这种事情(免责声明:我参与了所有三个项目:) https://github.com/SuperCowPowers/chains
对于那些只想使用pypcap / dpkt的人来说,这是一个有效的代码片段:
import pcap
import dpkt
sniffer = pcap.pcap(name=None, promisc=True, immediate=True)
for timestamp, raw_buf in sniffer:
output = {}
# Unpack the Ethernet frame (mac src/dst, ethertype)
eth = dpkt.ethernet.Ethernet(raw_buf)
output['eth'] = {'src': eth.src, 'dst': eth.dst, 'type':eth.type}
# It this an IP packet?
if not isinstance(eth.data, dpkt.ip.IP):
print 'Non IP Packet type not supported %s\n' % eth.data.__class__.__name__
continue
# Grab ip packet
packet = eth.data
# Pull out fragment information
df = bool(packet.off & dpkt.ip.IP_DF)
mf = bool(packet.off & dpkt.ip.IP_MF)
offset = packet.off & dpkt.ip.IP_OFFMASK
# Pulling out src, dst, length, fragment info, TTL, checksum and Protocol
output['ip'] = {'src':packet.src, 'dst':packet.dst, 'p': packet.p,
'len':packet.len, 'ttl':packet.ttl,
'df':df, 'mf': mf, 'offset': offset,
'checksum': packet.sum}
print output
答案 1 :(得分:0)
你应该看看Scapy。它是一个强大的网络工具,也可以交互使用。它是用python编写的,因此你也可以在你的脚本中使用它。
在scapy中它很简单(但你也可以轻松添加过滤器):
sniff(iface='eth0')
答案 2 :(得分:0)
如果您没有将路径放在pcap.pcap()
中的文件中,则无法解析该文件。
我用我的pcap目录运行你的脚本并用我的网络中的一个替换IP,看起来好像有效。 你确定你安装了pypcap和dpkt?
这就是我对你的剧本的所作所为。
import dpkt, pcap, glob
for i in glob.glob("/pcap/*.pcap"):
pc = pcap.pcap(i)
pc.setfilter('src host 192.168.1.140 or dst host 192.168.1.140')
for timestamp, packet in pc:
print dpkt.ethernet.Ethernet(packet)
它印了很多东西。
答案 3 :(得分:0)
代码没有任何跳出来,所以我想知道它是否只是网络。
您是否可以仔细检查IP地址,也可以运行tcpdump作为完整性检查以确保您能看到流量?
对于像这样的tcpdump
$ sudo tcpdump -i en1 "src host 10.0.0.2 or dst host 10.0.0.2"