ぐるんぐるん

おもむくままに書いてます。

Pythonでパケット解析(dpkt) その1~簡単な読み込み~

ご縁があってのパケット解析

後輩が研究で、パケットデータを扱っている。以前は先代が作成したパケット解析ツールを使っていたのだけれど、動作が怪しかったり、メモリうわぁーな状態になっていた。

いざ解析しようにも、手元にあるのはパケット(pcap)データと手だけ。どうすればいいか分からなかった。とりあえず、楽そう+比較的慣れているpythonで遊んでみることにした。

パケットデータの構造

パケットは和訳すると”小包”になり、基本的にはデータの伝送単位と認識して大丈夫ならしい。送りたい情報をこの(小さな)パケットに分割してネットワークを介して送信することで、”特定の情報がネットワークを連続して占有すること”を避けているとのこと。難しいけれど、「イケメン配達員はみんなのもの」って感じですかね。

なお、今一般的に使われているLANなどは、イーサネット(Ethernet)と呼ぶらしい*1

パケットは、宅急便などの送り状に該当する「ヘッダ」と小包の中に該当する「ペイロード」で構成されている。そのペイロードの中に上位レイヤーのヘッダーおよびペイロードが含まれている。なので式に表してみると、

的な構造になっているわけ。

例えばHTTPのパケットは、
Ethernetヘッダ+(IPヘッダ+(TCPヘッダ+(HTTPヘッダ+HTTPペイロード)))と言う構成。
この仕組みとライブラリの仕組みが対応してると言うことに気づくまで、酷いことになった。

dpktのさわり

まだ全部は触れてない。

インストール

公式サイトからダウンロードすることが出来る。但し、Ver.1.8のインストーラーは存在しないので、ソースをダウンロードしてインストールする必要がある。
基本的には、以下で行けるかと。(場合によりsudoや管理者モードで入る必要性有り。)

python setup.py build
python setup.py install

とりあえず、読み込んでみる。

Wireshark Wikiにてpcapファイルが公開されているので、今回はその中でhttp.capを利用しました。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from __future__ import with_statement

import dpkt

with open("http.cap", "rb") as f:
    pcr = dpkt.pcap.Reader(f)
    for t, buf in pcr:
        print t, len(buf)

実行すると、それぞれのパケットの生成(送受信)時刻およびパケットの大きさが出力されます。
とりあえず、その1はここまで。

*1:http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88