2012-02-17 59 views
2

パケットキャプチャでデータを解析するだけです。私はコンパイルできるかどうかを確認するために例を取ったが、私はエラーで終わる。以下はコードです。Python 2.6でPCAPを解析する

import dpkt 
import sys 

f = open('test.pcap') 
pcap = dpkt.pcap.Reader(f) 

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


f.close() 

私が手にエラーは次のとおりです:TCPではファイル "inspection.py"、ライン15を、= ip.data

はAttributeError: 'strの' オブジェクトが持っていない属性 'データ'

助けていただければ幸いです。

+0

'eth.data'は文字列です。文字列には 'data'属性はありません。 'print'ing' ip'を試してください – tMC

+1

'scapy'は' dpkt'よりもこの種のもののほうが良い選択肢です。 –

答えて

3

イーサネットクラスがbufを解凍できなかったため、dpkt.ethernet.Ethernet(buf)を呼び出すと文字列が返されました。これは、pcapファイルがレイヤ2プロトコルとしてイーサネットを持っていないことが考えられます。これを確認するために、pcapをWiresharkにロードすることができます。

次のスクリプトは、PCAPファイルのデータリンクフィールドをチェックして、フレームを復号化するために、適切なレイヤ2 dpktクラスを使用しようとします。私は問題を解決するためにやった

import dpkt 
import sys 

f = open('test.pcap') 
pcap = dpkt.pcap.Reader(f) 

for ts, buf in pcap: 
    if pcap.datalink() == dpkt.pcap.DLT_LINUX_SLL: 
     l2 = dpkt.sll.SLL(raw_pkt) 
    else: 
     l2 = dpkt.ethernet.Ethernet(buf) 
    ip = l2.data 
    tcp = ip.data 
+0

'pcp.datalink()'が 'dpkt.pcap.DLT_EN10MB'を返す場合にのみ' dpkt.ethernet.Ethernet'を呼び出すべきでしょう。可能なリンク層ヘッダータイプの[a * lot *](http://www.tcpdump.org/linktypes.html)があります。サポートしているすべてのタイプをチェックして、そのタイプがそれら。 –

0

されました:

 if ip.p == 6: 
      tcp = dpkt.tcp.TCP(ip.data) 
+0

ようこそスタックオーバーフロー!複数の質問に同じ回答を投稿しないでください。 1つの良い答えを掲示し、次に/投票して他の質問を重複として閉じます。質問が重複ではない場合は、*あなたの質問に対する回答を調整します。*重複する回答が見つかりました[ここ](// stackoverflow.com/a/39583474/2747593)。 –

関連する問題