2012-04-23 23 views
1

私の指示は、Wiresharkプログラムからダンプされたwireshark.binデータファイルを読み込み、パケット時間を抽出することでした。ヘッダーをスキップして初めて見つける方法がわかりません。パケット時間のためのWiresharkダンプファイルを読む

""" 
reads the wireshark.bin data file dumped from the wireshark program 
""" 
from datetime import datetime 
import struct 
import datetime 

#file = r"V:\workspace\Python3_Homework08\src\wireshark.bin" 
file = open("wireshark.bin", "rb") 
idList = [ ] 
with open("wireshark.bin", "rb") as f: 
    while True: 
     bytes_read = file.read(struct.calcsize("=l"))   
     if not bytes_read: 
      break 
     else: 
      if len(bytes_read) > 3: 
       idList.append(struct.unpack("=l", bytes_read)[0]) 

       o = struct.unpack("=l111", bytes_read)[0] 
       print(datetime.date.fromtimestamp(o)) 

答えて

1

は、一度にファイル全体を読んでみて、リストとしてアクセス:

data = open("wireshark.bin", "rb").read() # let Python automatically close file 
magic = data[:4]      # magic wireshark number (also reveals byte order) 
gmt_correction = data[8:12]   # GMT offset 
data = data[24:]      # actual packets 

今、あなたは(?16)バイトサイズのチャンクでデータをループは、適切なオフセットを見て、することができますタイムスタンプの各チャンクに

マジックナンバーは、0xa1b2c3d4です。これは4バイトまたは2ワードです。 、我々はできる今、私たちが注文を持っていることを

magic = struct.unpack('>L', data[0:4])[0] # before the data = data[24:] line above 
if magic == 0xa1b2c3d4: 
    order = '>' 
elif magic == 0xd4c3b2a1: 
    order = '<' 
else: 
    raise NotWireSharkFile() 

(と、それはwiresharkのファイルを知っている):私たちは、structモジュールを使用することによって、それらの最初の4つのバイトを調べることによって(ビッグエンディアンかリトルエンディアン)順序を決定することができますパケットをループ:

field0, field1, field2, field3 = \ 
     struct.unpack('%sllll' % order, data[:16]) 
payload = data[16 : 16 + field?] 
data = data[16 + field?] 

これは宿題であるので、私は、あいまいな名前を残したが、それらfield?名前がタイムスタンプと次のパケットデータの長さを含むパケットヘッダに格納された情報を表します。

このコードは不完全ですが、うまくいけば十分です。

+0

ファイル全体を一度に読み込もうとすると、エラーが発生します。トレース(最も最近の最後の呼び出し): ファイル "V:\ workspace \ Python3_Homework08 \ src \ wiretimes.py"、行8、 data = open( "wireshark.bin")read() ファイル "C: (charset 'codecは位置28のバイト0x8dをデコードできません)\ Python \ lib \ encodings \ cp1252.py "、行23、デコード時 return codecs.charmap_decode(input、self.errors、decoding_table)[0] UnicodeDecodeError: :文字マップ

+0

@Python_Maybe:woops、 'rb' - 編集した答えを忘れました。 –

+0

ありがとう、今私は全体のファイルを読むことができます。パケットの長さをどのように把握するのですか?すべてのパケットが同じサイズであるわけではありません。 –

関連する問題