目次
はじめに
パケットデータを保存するファイルの一つに、pcapファイルがあります。pcapファイルはパケットデータを保存するファイル形式としては定番であり、その構造を知っていることはpcapファイルを扱う際に大きなアドバンテージとなります。
そこで、本記事では以下の2つの内容についてまとめようと思います。
- pcapファイルの構造
- pcapファイルの中身を16進数表記した結果
pcapファイルの構造
pcapファイルは、「File Header(24バイト)+Packet Header(16バイト)+Packet Data(可変長)+以降、Packet Header(16バイト)+Packet Dataがパケット分繰り返される」という構造になっています(図1)。
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です。
このようにFile Headerの中身を16進数表記すると、各要素の値を確認することができます。
Packet Headerの中身
Packet Headerは16バイトなので、File Headerに続く32桁を取得します。32桁を取得した値が下記です。
8039fb64746109003600000036000000
Packet Headerについても、File Headerと同様に中身を分解してみます。
Packet Dataの中身
Packet Dataの中身については、今回は触れません。理由としては、今回の場合Ethernetヘッダ、IPヘッダ、TCPヘッダの知識が必要になるからです。
まとめ
本記事では、下記の2つの内容についてまとめました。
- pcapファイルの構造
- 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ファイルに対する理解が深まったら幸いです。