1

c で pcap ライブラリを使用していくつかのパケットをキャプチャしました。今、私はpythonプログラムを使用して、保存されたパケットファイルを読み取ります。しかし、ここで問題があります。最初にpkthdr(lybraryが提供)を持ち、次に実際のパケットを持つファイルがあります。pkthdr のフォーマットは -

struct pcap_pkthdr {
    struct timeval ts; /* time stamp 32bit */ 32bit
    bpf_u_int32 caplen; /* length of portion present */
    bpf_u_int32 len; /* length this packet (off wire) */
};

今私はlenフィールドを読みたいので、timevalとcap lenをスキップし、pythonを使用してバイナリ形式でlenフィールドを出力しました..私が得たバイナリコードは- 01001010 00000000 00000000 00000000ですそれは正しい値(大きすぎる)だと思います、実際のlenフィールド値は74バイトでなければなりません(wiresharkでチェックしてください)..だから私が間違っていることを教えてください..よろしくお願いします

4

2 に答える 2

1

または、比較的簡単に pcap API を呼び出すことができる pylibpcap モジュール、pypcap モジュール、または pcapy モジュールくださいそうすれば、pcap ファイルの詳細をにする必要がなくなり、コードは、libpcap 1.1 以降を使用して、Wireshark が生成できる pcap-ng ファイルの少なくとも一部を読み取ることができるようになります。1.8 リリースではデフォルトです。

libpcap/WinPcap に依存するのではなく、pcap ファイルを読み取る独自のコードを作成する価値はほとんどありません。(Wiresharkは、多くのキャプチャファイル形式を読み取り、現在のpcap APIができない方法でpcap-ng形式をサポートするライブラリの一部としてそうしますが、問題のライブラリはpcap-ngもサポートしています....)

于 2012-04-10T16:39:58.157 に答える
0

このようなバイナリデータを比較的簡単に解凍できるstructモジュールを見てください。次に例を示します。

struct.unpack('LLL', yourbuffer)

これにより、3つの(L = unsigned long)値のタプルが得られます。len値が正しくないと思われる場合は、ファイルのバイト順序がネイティブのバイト順序と異なります。その場合、フォーマット文字列の前に>(ビッグエンディアン)または<(リトルエンディアン)のいずれかを付けます。

struct.unpack('>LLL', yourbuffer)
于 2012-04-10T16:00:05.330 に答える