首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dpkt和Python解析数据包捕获时出现问题

使用dpkt和Python解析数据包捕获时出现问题
EN

Stack Overflow用户
提问于 2013-12-26 07:44:58
回答 2查看 5.7K关注 0票数 1

我已将Cisco路由器配置为将流量的pcap文件转储到我尝试使用dpkt和Python (2.7)解析的特定接口上。基本代码是:

代码语言:javascript
复制
f = open('pktrace1.pcap','rb')
pcap = dpkt.pcap.Reader(f)

for ts,buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    ip = eth.data
    tcp = ip.data

f.close()

现在,不幸的是,无论出于什么原因,来自路由器的pcap转储将第2层信息留空,并且帧被封装为原始IP格式。上面的代码在第7行失败,出现以下数据:'str‘对象没有属性’AttributeError‘

我猜这是有意义的,因为它希望解析不存在的第2层以太网信息。

我对Python比较陌生,dpkt文档对我帮助不大。有人知道我如何让dpkt处理这些缺少以太网信息的数据包吗?或者,如何让路由器(Cisco 2911、IOS 15.0)准确地将它们与以太网信息一起导出?

我觉得必须有一种简单的方法来让dpkt处理这些转储,因为Wireshark可以完美地读取它们。非常感谢您的帮助!:)

EN

回答 2

Stack Overflow用户

发布于 2014-06-18 11:22:40

要解析原始IP pcap,我发现(从逻辑上讲)必须跳过dpkt以太网解码,直接跳到IP解码,如下所示:

代码语言:javascript
复制
f = open('tun0.pcap')
pcap = dpkt.pcap.Reader(f)

for ts,buf in pcap:
    ip = dpkt.ip.IP(buf)
    tcp = ip.data

f.close()

我在tun0虚拟隧道接口上运行tcpdump时遇到了同样的问题

unix ' file‘命令将捕获文件类型显示为:

代码语言:javascript
复制
tun0.pcap: tcpdump capture file (little-endian) - version 2.4 (raw IP, capture length 8192)

而来自真实接口的转储给出了:

代码语言:javascript
复制
eth0.pcap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 65535)

我相信你现在已经找到了答案,但我在这里贴出这篇文章,以防其他人有同样的问题。这是我第一次“回馈”,所以我希望它是正确的和有用的!

票数 4
EN

Stack Overflow用户

发布于 2013-12-26 22:31:38

我的名声太低,不能发表评论,但我想我可能有一些相关的数据可以分享,所以在答案框中

顺便说一句,您能提供一些关于您使用什么工具来生成pcap文件的详细信息,以及您的示例"pktrace1.pcap“数据吗?另外:如果使用AirPCAP适配器捕获,则可以根据自己的设置配置它捕获数据的方式。如果您需要访问数据,则需要确保已为AirPCAP加密狗正确启用网络密钥(否则您的思科路由器必须禁用网络安全),否则也无法访问数据。

那么写这篇文章的主要原因是:我之前使用过impacket库,我想这也会对你有帮助。下面是一个示例:

代码语言:javascript
复制
'''
Packet sniffer in python using the pcapy python library
python filter compile from http://carnivore.it/2010/06/12/python3_-_ctypes
pcapy compile from http://www.salstar.sk/pub/salpack/usr/sbin/httop.py and http://bytes.com/topic/python/answers/681254-python-packet-filter-pcapy
actual filtering answer on https://github.com/LeonB/dabbler/blob/master/pcapy-test.py ??
'''

import socket
from struct import *
import datetime
import sys
import radiotap
import pcapy
from impacket import ImpactDecoder, ImpactPacket

AIRPCAP_ADAPTER = '\\\\.\\airpcap00'
filter_string = '' # do not use with airpcap00 as this requires adapter to be on network so it seems (decryption key etc)

def main(argv):
    cap = pcapy.open_live(AIRPCAP_ADAPTER, 65536, 1, 0)
    #bpf = pcapy.compile (cap, 1500, filter_string, 0, 1)
    cap.setfilter(filter_string)
    print "Listening on %s: net=%s, mask=%s, linktype=%d" % (AIRPCAP_ADAPTER, cap.getnet(), cap.getmask(), cap.datalink())

    # Read packets -- header contains information about the data from pcap,
    # payload is the actual packet as a string
    # callback for received packets
    def recv_pkts(hdr, data):
        decoder = ImpactDecoder.EthDecoder()
        ether = decoder.decode(data)
        print ether
        # Parse the IP packet inside the Ethernet packet

    packet_limit = -1 # infinite
    cap.loop(packet_limit, recv_pkts) # capture packets


if __name__ == "__main__":
    main(sys.argv)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20777697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档