2

我实际上是在尝试用 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)

但是当我启动脚本时没有任何反应......我错过了什么吗?

在 OS X Yosemite (10.10) 上使用 Python 2.7

4

4 回答 4

8

这个问题很老,但对于可能会遇到这个问题的新人来说。github 'chains' 项目同时使用 pypcap 和 dpkt 来完成这种事情(免责声明:我参与了所有三个项目 :) https://github.com/SuperCowPowers/chains

  • chains/sources/packet_streamer.py(显示使用 pypcap 进行“嗅探”的代码)
  • chains/links/packet_meta.py(显示使用 dpkt 进行数据包解析的代码)

对于那些只想使用 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
于 2016-01-02T00:04:28.800 回答
1

你应该看看Scapy。它是一个强大的网络工具,也可以交互使用。它是用 python 编写的,因此您也可以在脚本中使用它。

在 scapy 中它很简单(但您也可以轻松添加过滤器):

sniff(iface='eth0')
于 2014-11-27T02:36:17.367 回答
0

代码没有跳出任何内容,所以我想知道它是否只是网络。

您能否仔细检查 IP 地址并运行 tcpdump 作为健全性检查以确保您可以看到流量?

对于 tcpdump 类似这样的东西

$ sudo tcpdump -i en1 "src host 10.0.0.2 or dst host 10.0.0.2" 
于 2014-11-27T03:30:31.077 回答
0

If you didn't place the path to a file in pcap.pcap(), there's no pcap for it to parse.

I ran your script with a glob of from a pcap directory I have and replaced the IP with one in my network, seemed like it worked. You sure you installed pypcap and dpkt?

Here's exactly what I did with your script.

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)

It printed a lot of stuff.

于 2014-11-27T03:16:02.563 回答