プログラミング

パケットキャプチャツールのつくり方 〜UDPヘッダー解析〜

このページはこんな方におすすめです
  • 自分でパケットキャプチャツールを作ってみたい
  • パケットの構造に興味がある

前回はパケットキャプチャでIPヘッダーの表示を行いましたので、今回はUDPヘッダーの解析と表示をおこないます。

UDPヘッダーは単純な構造のためパケットキャプチャツール作成の入門に最適です。UDPヘッダーを解析できるようになればTCPやICMPも同様に解析できるようになるでしょう。

UDPヘッダーの構造については次の記事を参照してください。

TCP/IPヘッダ構造1. IPv4 以下の図はRFC 791からの抜粋です。この図をもとに説明します。 0 ...

パケットキャプチャツールのつくり方

ヘッダーファイル取り扱いについての注意

macOS、BSDとLinuxで共通のコードを記述する場合はUDPヘッダーの構造体定義が異なるためコンパイルエラーに注意する必要があります。

幸いにもLinuxにはBSD形式の構造体が用意されていて「__FAVOR_BSD」を定義することで使用することができるようになります。

具体的にどうするのかというと、以下のようにnetinet/udp.hをincludeする前に__FAVOR_BSDを定義します。

UDPヘッダーのマッピング方法

この方法はTCPやICMPでも同様の方法です。

パケットの中でUDPヘッダーの先頭へアクセスするためにはIPヘッダーのサイズを知る必要があります。

IPヘッダーは可変長です。そのためIPヘッダーの長さを知るために ip_hl を使用します。ip_hl はIPヘッダーのサイズを4オクテット単位で表しているためip_hlの値を4倍することによってIPヘッダーのサイズを知ることができます。

今回のサンプルコードでは以下のようにしてUDPヘッダーが格納されているメモリアドレスを計算しています。

このようにip_hlを左へ2ビットシフトした値をポインタipに加算しています。

上位プロトコルの判定

IPヘッダーの上位プロトコルはIPヘッダーの ip_p を調べることによって知ることができます。

どのような値が定義されているのかについてはヘッダーファイルのnetinet/in.hを見てください。

サンプルコードでは以下のようにしてプロトコルによる処理の振り分けをおこなっています(まだUDPしか処理していません)。

UDPヘッダー値を表示する

UDPヘッダーの表示はIPヘッダーでのやり方と変わりません。バイトオーダーに注意して各フィールドの値を表示するだけです。

サンプルコードでは、以下のようにしています。

サンプルコードと実行例

サンプルコード

サンプルコードはGitHubからも落とせます。

≫サンプルコード

コンパイルは以下のようにします。libpcapとリンクするために”-l pcap”が必要であることに注意してください。

今回のサンプルコードはパケットフィルターを引数で指定できるようにしているので、実行時に「udp and port 53」を引数として渡すことで、DNSパケットのみ受信しています。

まとめ

UDPヘッダーは単純なため、UDPヘッダーを表示させられるようになればTCPやICMPも簡単に対応できますから興味のある方は是非UDPヘッダーを自在に表示できるようになってください。

更に詳細な知識を得たい場合は「UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI・ソケットとXTI」がおすすめです。

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

W.リチャード スティーヴンス
発売日: 1999/07/01
Amazonの情報を掲載しています

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)