初心者データサイエンティストの備忘録

調べたことは全部ここに書いて自分の辞書を作る

pcapファイルの構造:実際にバイト列を確認してみた

目次

はじめに

 パケットデータを保存するファイルの一つに、pcapファイルがあります。pcapファイルはパケットデータを保存するファイル形式としては定番であり、その構造を知っていることはpcapファイルを扱う際に大きなアドバンテージとなります。
 そこで、本記事では以下の2つの内容についてまとめようと思います。

  1. pcapファイルの構造
  2. pcapファイルの中身を16進数表記した結果

 

pcapファイルの構造

 pcapファイルは、「File Header(24バイト)+Packet Header(16バイト)+Packet Data(可変長)+以降、Packet Header(16バイト)+Packet Dataがパケット分繰り返される」という構造になっています(図1)。

図1:pcapファイルの構造

 File Headerや、Packet Headerの具体的な中身については、.pcapファイルについてちょっと調べたPCAP Capture File Formatが分かりやすかったので、そちらをご覧ください。本記事では、pcapファイルのバイト列が、上記のサイトに載っているフォーマットでちゃんと並んでいることを可視化しようと思います。

pcapファイルの中身を見てみた

 まず最初にPythonのScapyというライブラリでpcapファイルを作成します。その後、実際にpcapファイルをバイト列で直接見るということをしてみます。

pcapファイルの作成

 pcapファイルは下記のコードで作成することができます。

# 利用ライブラリ
from scapy.all import Ether, IP, TCP, wrpcap

# パケットの作成
pkt1 = Ether()/IP()/TCP()
pkt2 = Ether()/IP()/TCP()

# パケットをまとめる
pkt_list = [pkt1, pkt2]

# pcapファイルを出力する
wrpcap("sample.pcap", pkt_list)

バイト列を直接観測する

 pcapファイルをバイト列で読み込み表示します。コードは下記です。

with open("sample.pcap", "rb") as f:
    data = f.read()

# 16進数表記に変換し、表示
print(data.hex())

 出力結果は、下記のようになりました。

d4c3b2a1020004000000000000000000ffff0000010000008039fb64746109003600000036000000ffffffffffff000000000000080045000028000100004006fbce000000007f00000100140050000000000000000050022000107e00008039fb64746109003600000036000000ffffffffffff000000000000080045000028000100004006fbce000000007f00000100140050000000000000000050022000107e0000

バイト列の解釈

 上記で長いバイト列を表示しました。これを解釈していこうと思います。なお、私が使っているCPUがintel製だからかリトルエンディアンでデータが格納されています。なので、逆順に読み直しながら解釈していきます。

File Headerの中身

Pythonの16進数表記は、2桁で1バイトです。したがって、24バイトのFile Headerを見るには、最初の48桁を取り出してくればOKです。最初の48桁は下記の通りです。

d4c3b2a1020004000000000000000000ffff000001000000

 File Headerを取り出してみましたが、これだけでは何がなんだかわかりません。File Headerをさらに分解したものが図2です。

図2:File Headerの構造

このようにFile Headerの中身を16進数表記すると、各要素の値を確認することができます。

Packet Headerの中身

 Packet Headerは16バイトなので、File Headerに続く32桁を取得します。32桁を取得した値が下記です。

8039fb64746109003600000036000000

 Packet Headerについても、File Headerと同様に中身を分解してみます。

図3:Packet Headerの構造

Packet Dataの中身

 Packet Dataの中身については、今回は触れません。理由としては、今回の場合Ethernetヘッダ、IPヘッダ、TCPヘッダの知識が必要になるからです。

まとめ

 本記事では、下記の2つの内容についてまとめました。

  1. pcapファイルの構造
  2. pcapファイルの中身を16進数表記した結果

 1については、pcapファイルは、「File Header(24バイト)+Packet Header(16バイト)+Packet Data(可変長)+以降、Packet Header(16バイト)+Packet Dataがパケット分繰り返される」という構造になっていることを説明しました。また、File Header、Packet Headerについてはさらに複数の要素に分解できることを説明しました。

 2については、PythonのScapyを用いてpcapファイルを実際に作成し、作成したpcapファイルをバイト列として再度読み込むということをしました。そして、読み込んだバイト列を16進数表記し、それと各要素との対応関係を確認しました。

 本記事を通じて、読者の方のpcapファイルに対する理解が深まったら幸いです。