はじめに
本稿では、WinPcapを使用したパケットモニターを作成し、パケットドライバー「WinPcap」の利用方法、および取得したデータをプロトコルに従って解析する手法について紹介します。
対象読者
- WindowsでC++を使用してネットワーク関連のプログラムを作成される方。
- パケットモニターの作成に興味をお持ちの方。
- WinPcapドライバーの利用に興味をお持ちの方。
必要な環境
- サンプルプログラムは、WinPcapがインストールされているコンピュータで動作します。
- サンプルコードは、C++ Builder 6およびVisual C++ .NET 2003でコンパイルできます。
WinPcapについて
WinPcap.exeは、http://www.winpcap.org/において、 BSDライセンスにもとづき配布されているWindows用のパケットドライバーであり、ホームページから自由にダウンロードすることが出来ます。 2005/07/10現在、安定バージョンとして3.0が、ベータバージョンとして3.1 beta 4 が配布されています。逐次バージョンアップが行われていますので、定期的に最新バージョンを確認することをお勧めします。同ページには、ウインドウなどを表示せずにバックグラウンドでインストールできるものや、WindowsCE用のものも配布されています。
WinPcapを使用するには、お使いのコンピュータにパケットドライバー本体をインストールすることが必要ですが、WinPcap対応のソフトウエアを開発するには、これに加えて、「Developer's pack」が必要になります。「Developer's pack」には、必要なヘッダファイルやLIBファイルと共に、ドキュメントやサンプルコードも含まれています。また、同ページでは、WinPcap本体のソースコードも配布されています。デバイスドライバを開発する環境が整っている場合は、こちらからドライバ本体をコンパイルすることも可能です。興味ある方はぜひお試しください。
なお、本稿は、バージョン3.0を対象に作成しましたが、3.1 bata 4でも問題なく動作することを確認しています。
WinPcapを使用するアプローチ
WinPcapは、次の図に示すとおり3つの階層構造で構成されています(参考:WinPcap internals)。
WinPcapでは、デバイスドライバーとしてインストールされる「npf.sys」の機能をアプリケーションが利用できるように、「Packet.dll」が提供されます。それをラッパーするように、各システムで共通の関数を提供するための「Wpcap.dll」が存在しています。このため、アプリケーションがWinPcapを利用する形態としては、「Packet.dllを利用する方法」と「Wpcap.dllを利用する方法」の2つのアプローチが存在することになります。WinPcapのソースコードのアーカイブに含まれるサンプルには、前者のアプローチを使用した例として「TestApp」が含まれており、また、後者のアプローチの例として「pktdump_ex」があります。
どちらのアプローチでもWinPcapの利用は可能ですが、ドキュメント内の注意書きには、「Packet.dll」でしか公開されない低レベルの制御が特に必要でない限り、システムに依存せずUNIXのパケットキャプチャライブラリ(libpcap)と互換性のある「Wpcap.dll」を使用するように推奨されています。本稿では、後者のアプローチをとり「pktdump_ex」を元にしてサンプルプログラムを作成しました。
インクルードファイルとインポートライブラリの使用
WinPcapを利用してプログラムを作成するには、WinPcapの「Developer's pack」で提供されるインクルードファイルと「wpcap.lib」へのリンクが必要になります。サンプルソースにWinPcapのヘッダファイルは含まれておりませんので、「Developer's pack」を展開し適切なパスを設定してください。
C++ Builder 6、またはVisual C++ .NET 2003を使用している場合の、「ライブラリファイルの追加」と「インクルードパスの設定」は以下のとおりです。
C++ Builder 6の場合
- 「プロジェクト」→「オプション」→「ディレクトリ/条件」→「インクルードパス」に、「;(セミコロン)」で区切ってWinPcapの「include」ディレクトリへのパスを追加する。
- 「プロジェクト」→「プロジェクトに追加」→追加するLIBファイルを選択する。
Visual C++ .NET 2003の場合
- 「プロジェクト」→「プロジェクトのプロパティ」→「C/C++」→「全般」→「追加のインクルードディレクトリ」に、追加するインクルードパスを指定する。
- 「プロジェクト」→「プロジェクトのプロパティ」→「リンカ」→「入力」→「追加の依存ファイル」に、追加するLIBファイルを指定する。
c:\tmp>coff2omf.exe wpcap.lib wpcap-builder.lib COFF to OMF Converter Version 1.0.0.74 Copyright (c) 1999, 2000 Inprise Corporation