从pcap文件读取数据包时出现问题。dpkt模块。怎么回事?

0 投票
4 回答
6190 浏览
提问于 2025-04-15 20:40

我正在运行一个测试脚本,想从我下载的一个示例.pcap文件中读取数据包。但这个脚本似乎无法运行。我已经安装了所有需要的模块,但没有一个示例能够正常工作。

import socket
import dpkt
import sys
pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))
for ts, data in pcapReader:
    ether = dpkt.ethernet.Ethernet(data)
    if ether.type != dpkt.ethernet.ETH_TYPE_IP: raise
    ip = ether.data
    src = socket.inet_ntoa(ip.src)
    dst = socket.inet_ntoa(ip.dst)
    print "%s -> %s" % (src, dst)

不知道为什么,这个脚本没有被正确解析。当我运行它时,出现了

KeyError: 138

module body   in test.py at line 4
function __init__     in pcap.py at line 105
Program exited.

这是为什么呢?哪里出了问题?我的安装有问题吗?我在一台Mac上使用Python 2.6。

4 个回答

-2

看起来你需要一些帮助……我对pcap一无所知,所以我只能尽量帮你自己解决问题。这里有几点建议:

(1) 你有没有查看一下pcap.py文件的第105行?我猜“KeyError: 138”意味着它在尝试访问一个字典,但这个字典里没有138(或者“138”)这个键。那138是什么变量呢?是来自某个数据包的字节吗?

(2) 可以考虑问问pcap的作者或者维护者。

(3) 也可以考虑提供一个pcap的链接。

1

在dpkt.pcap模块的第105行,使用了pcap文件的链接类型来访问一个链接类型映射的字典:

        self.dloff = dltoff[self.__fh.linktype]

这个dltoff字典在模块的顶部定义,但它没有包含键138,所以你看到的异常就是这个原因。根据tcpdump的链接类型页面,值138代表的是LINKTYPE_APPLE_IP_OVER_IEEE1394的链接类型。如果这不是你期望的链接类型,那么pcap文件可能已经损坏。否则,你可以尝试更新dltoff字典,给138添加一个条目。根据它的数据包结构,它的头部长度是18个字节。所以在dkpt/pcap.py的第40行后添加以下指令应该可以解决问题:

        LINKTYPE_APPLE_IP_OVER_IEEE1394 = 138
        dltoff[LINKTYPE_APPLE_IP_OVER_IEEE1394 ] = 18
1

做这个:


pcapReader = dpkt.pcap.Reader(open('test1.pcap'))

而不是做这个:


pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))

撰写回答