1

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

"""
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))
4

1 に答える 1

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ワードかかります。structモジュールを使用して最初の4バイトを調べることにより、順序(ビッグエンディアンまたはリトルエンディアン)を判別できます。

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ファイルであることがわかった)ので、パケットをループすることができます。

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

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

このコードは不完全ですが、うまくいけば、あなたを動かすのに十分でしょう。

于 2012-04-23T17:31:18.120 に答える