0

.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

4 に答える 4

1

dpkt.pcap モジュールの 105 行目では、pcap ファイルのリンク タイプを使用して、リンク タイプ マッピングの辞書にアクセスしています。

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

dltoff ディクショナリはモジュールの上部で定義されており、キー 138 が含まれていないため、例外が発生しています。tcpdump のリンク タイプ ページによると、値 138 は LINKTYPE_APPLE_IP_OVER_IEEE1394 のリンク タイプです。これが予期したリンク タイプでない場合は、pacp ファイルが破損している可能性があります。それ以外の場合は、dltoff 辞書を更新して、138 のエントリを追加してみてください。そのパケット構造によると、ヘッダーの長さは 18 バイトです。したがって、dkpt/pcap.py の 40 行目の後に次の命令を追加すると機能するはずです。

        LINKTYPE_APPLE_IP_OVER_IEEE1394 = 138
        dltoff[LINKTYPE_APPLE_IP_OVER_IEEE1394 ] = 18
于 2012-05-18T12:53:49.127 に答える
1

行う


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

それ以外の:


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

于 2011-02-09T21:59:01.780 に答える
-1

まあ、あなたは援助が不足しているようです...私は膝蓋骨からpcapを知らないので、私にできることはあなたが自分自身を助けるのを手伝うことだけです. 提案:

(1) pcap.py の 105 行目を見ましたか? 「KeyError: 138」は、辞書にアクセスしようとしていることを意味していると思いますが、辞書にはキーとして 138 (または「138」) がありません。138 を含む変数は何ですか? パケットからのバイト?

(2) pcap の作者/管理者に尋ねることを検討してください。

(3) pcap の URL を提供することを検討してください。

于 2010-03-22T13:54:08.960 に答える