发出从pcap文件中读取数据包的问题。 dpkt模块。是什么赋予了?

时间:2010-03-22 00:09:10

标签: python packet pcap packet-mangling

我正在运行以下测试脚本,尝试从我下载的示例.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 个答案:

答案 0 :(得分:1)

待办事项


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

而不是:


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

答案 1 :(得分:1)

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

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

dltoff字典在模块的顶部定义,它不包含密钥138,因此您看到了异常。 根据{{​​3}},值为138是LINKTYPE_APPLE_IP_OVER_IEEE1394的链接类型。如果这不是您期望的链接类型,那么pacp文件可能已损坏。否则,您可以尝试更新dltoff字典并为138添加条目。根据其tcpdump's link types page,其标头长度为18个字节。因此,在dkpt / pcap.py第40行之后添加以下说明应该有效:

        LINKTYPE_APPLE_IP_OVER_IEEE1394 = 138
        dltoff[LINKTYPE_APPLE_IP_OVER_IEEE1394 ] = 18

答案 2 :(得分:-1)

嗯,你似乎缺乏帮助......我不知道膝盖上的pcap,所以我所能做的就是尽力帮助你自己。建议:

(1)你看过pcap.py第105行了吗?我猜“KeyError:138”意味着它正在尝试访问字典,但字典没有138(或“138”)作为键。包含138的变量是什么?来自数据包的一个字节?

(2)考虑询问pcap的作者/维护者。

(3)考虑提供pcap的URL。

答案 3 :(得分:-2)

我也遇到过类似的问题,但我是KEY ERROR 192。

我发现我的dkpt/pcap.py不完整且版本很旧。

所以我卸载了当前的包

sudo apt-get remove python-dpkt

使用pip来安装最新的

pip install dpkt

这终于解决了问题,祝你好运!