質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Wireshark

Wireshark(ワイヤシャーク)は、ネットワーク・アナライザソフトウェアです。 IP、DHCPなど800以上のプロトコルを解析できる機能があり、 Windows、Linux、BSD、Mac OS Xなどで利用が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3593閲覧

Pythonでバイナリファイル(pcap)をパースしたい

akamakku

総合スコア191

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Wireshark

Wireshark(ワイヤシャーク)は、ネットワーク・アナライザソフトウェアです。 IP、DHCPなど800以上のプロトコルを解析できる機能があり、 Windows、Linux、BSD、Mac OS Xなどで利用が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/04/23 11:54

前提・実現したいこと

  • 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

バイナリのパースはctypesよりもstructの方をよく見かける気がします。

私はこう書きました。(バイトオーダーは確信がなかったので未指定にしています。)

あと処理してて思ったのはsnapshot_lengthではなくuntruncated_lengthでデータを拾えば良いような気がしました。(間違えているかもしれませんが。)

python

1from collections import namedtuple 2from struct import error as StructError 3from struct import unpack 4 5 6PerFileHeader = namedtuple("PerFileHeader", 7 "magic_number major_version minor_version " 8 "timezone_offset timestamp_accuracy " 9 "snapshot_length layer_header_type") 10PerPacketHeader = namedtuple("PerPacketHeader", 11 "seconds microseconds_or_nanoseconds length " 12 "untruncated_length") 13 14 15def parse(pcapfile): 16 with open(pcapfile, "rb") as fp: 17 yield PerFileHeader(*unpack("IHHIIII", fp.read(24))) 18 while True: 19 try: 20 h = PerPacketHeader(*unpack("IIII", fp.read(16))) 21 except StructError: 22 break 23 else: 24 d = fp.read(h.untruncated_length) 25 yield (h, d) 26 27 28if __name__ == '__main__': 29 pcap = parse("test.pcap") 30 header = next(pcap) 31 for header, data in pcap: 32 print(header)

投稿2018/04/23 21:52

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akamakku

2018/04/24 03:16 編集

たしかにdpktでもstructを使っていますね. 単純に"IIII"のような部分が直感的にわかりにくいかなと思ってひとまずctypesを選択したのですが,速度など他の部分で違いは有るんでしょうか ここで聞くのはおかしい気はしますが,, >あと処理してて思ったのはsnapshot_lengthではなくuntruncated_lengthでデータを拾えば良いような気がしました。(間違えているかもしれませんが。) ありがとうございますやってみます
YouheiSakurai
akamakku

2018/04/24 11:20

なるほどです Python修行がたりないようなので、頑張ります!
guest

0

ベストアンサー

dpktというライブラリのソースを見ると、その力技でやってるっぽい気が・・・。最後にイテレータにしているあたりの処理はなにかの参考になるかもしれません。
dpkt/pcap.py at master · kbandla/dpkt

参考:使い方が書いてあるページ
python + dpkt で pcap解析 - 1.読み込みから解析開始まで

投稿2018/04/23 12:06

編集2018/04/23 12:07
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akamakku

2018/04/23 12:21

質問に書いたとおり「高等なライブラリ」は使いたくなかったので、そっちは調べてませんでした。 直接使わなくてもソースを読んでみるっていう使い方もできますね ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問