前提・実現したいこと
- pcapファイルをPythonのctypesを用いてパースしたいです.
- ファイル構造なんかのお勉強,CTFの練習なので,あまり高等なライブラリは使いたくないです
- Headerの内容によって,含まれるパケットが変わってしまう,さらにそれぞれのパケットのサイズも異なっているpcapファイルはどの様にパースしていくものなんでしょうか?
- pcapのヘッダの情報はtcpdumpのmanpageを参考にしました.
つまったところ
方針としては,PcapのHeaderにあたる冒頭の24バイトをまずパースして,Snapshot lengthをとりだして,それを元にして,それをSnapshotをパースするクラスに食わせようかと思っていたのですが,
そうすると,さらにパケットヘッダをパースして,それぞれのパケットの長さを取得して...という処理を順番にパケットに対してしなければいけません
これはなんとなく煩雑というか,力技っぽく見えてしまうのですが,もうすこしスマートにはいかないものでしょうか?
決してめんどくさいという意味ではなく,より良い方法があれば教えていただきたいです.
python
1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4from ctypes import * 5 6 7class Pcap: 8 def __init__(self, file_name): 9 f = open(file_name,'rb') 10 header = PcapHeader() 11 f.readinto(header) 12 snapshot_length = header.snapshot_length 13 # ??????? 14 15class PcapHeader(Structure): 16 """ 17 pcap header size : 24Bytes 18 """ 19 __fields__ = ( 20 ('magic_number', c_uint32), 21 ('major_version', c_uint16), 22 ('minor_version', c_uint16), 23 ('timezone_offset', c_int32), 24 ('timestamp_accuracy', c_uint32), 25 ('snapshot_length', c_uint32), 26 ('link-layer_header_type', c_uint32) 27 ) 28 29 30class PcapSnapshot(Structure): 31 __fields__ = ( 32 # ?????????? 33 ) 34

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/24 03:16 編集
2018/04/24 04:18
2018/04/24 11:20