PcapPlusPlus開発環境を構築する(Visual Studio)
PcapPlusPlusとは、C++でパケット解析を実装できる著作権フリーかつオープンソースのライブラリです。
似たようなソリューションとしてWireshark、tshark、Pktmonなどがありますが、膨大なキャプチャデータを高速かつ複雑な条件分岐などのプログラム処理をかけて解析をするには不向きです。
そこでC++にパケット解析機能を実装できるPcapPlusPlusを使って開発する環境の構築についてVisual Studioを使う方法で備忘録をかねてご紹介します。
本記事ではPcapPlusPlusサンプルプロジェクトのコンパイルと実行までをご紹介します。
必要なソフトウェア
- Visual Studio 2015 or 2017 or 2019(Community版でもOK)
- PcapPlusPlus V22.05
- WinPcap Developer’s Pack or Npcap SDK
- pthread-win32
今回はWindows 11 Pro 64bit+Visual Studio 2017 Communityという構成で構築しました。
ソフトウェアのダウンロード
Visual Studio
下記URLから2015 or 2017 or 2019のどれかをダウンロード、インストールしてください。
https://visualstudio.microsoft.com/ja/vs/older-downloads/
最新版のVisual Studio 2022はPcapPlusPlus公式サイトに対応バージョンとして記載がありませんが、後述のプロジェクトオプションのWindows SDK バージョンを変更することで動くかもしれません。
Visual Studioをインストールしたら、Visual Studio Installerを起動してC++によるデスクトップ開発をインストールしておきます(C++開発経験のある環境なら、この辺は特に何もしなくてよいかもです)。
PcapPlusPlus
PcapPlusPlusの公式サイトからDOWNLOAD⇒LATEST VERSIONと進みます。
https://pcapplusplus.github.io/
最新バージョンのGitHubリポジトリの中からwindows(vs20xx)版をダウンロードして展開します。事前にインストールしたVisual Studioのバージョンに合わせてダウンロードしてください。
Npcap SDK
PcapPlusPlusはパケットキャプチャ機能も実装されていますが、キャプチャするためにWinPcapまたはNpcapを使うようです。ここではNpcap SDKの導入手順をご紹介します。
下記URLからNpcap SDKをダウンロードし、ZIPファイルを展開します。
pthread-win32
pthread-win32はC++マルチスレッドプログラミングを実装するためのライブラリです。
おそらく、パケット解析処理は膨大な計算を行うので高速化のために使われているのだと思います(正直、マルチスレッド処理を実装しないと高速化は難しいかなー面倒だなーと思っていたので、初めから実装されていて大助かりです)。
下記URLのpthread Git Hubリポジトリから一式をダウンロードして任意の場所に展開します。
https://github.com/Tieske/pthreads-win32
PcapPlusPlusPropertySheet.propsの編集
展開したPcapPlusPlusフォルダの中にExampleProjectというフォルダがありますので開きます。
その中に”PcapPlusPlusPropertySheet.props”というファイルがありますので、それをテキストエディタで開きます。
中身はPcapPlusPlusが各ライブラリ(Npcap、pthread)を参照するために必要なパスパラメータをXML形式で記述したものです。ここに各ライブラリへのパスを記載しておかなければPcapPlusPlusは動きません。
というわけで、それぞれ下記のように設定します。
<PcapPlusPlusHome>
PcapPlusPlusを展開した場所を指定します。より正確にはExampleProjectやheaderフォルダが保存されている場所のパスです。
<PcapSdkHome>
Npcap SDKを展開した場所を指定します。
<PThreadWin32Home>
pthread-win32を展開した場所を指定します。
最後に忘れてはいけないのがpthreadVC2.libのコピーです。
PcapPlusPlusはpthreadVC2.libを参照しているのですが、なぜかサンプルプロジェクトが参照してくれないので、pthreads-win32からコピーします。
pthreadVC2.libは”pthreads-win32-master\pthreads-win32-master\Pre-built.2\lib”に保存されていますので、そこからPcapPlusPlusのExampleProjectにコピーします(今後、開発を進める際にはC++コードと同じディレクトリにpthreadVC2.libをコピーするか参照できるようにプロジェクトのプロパティにパラメータを追加してください)。
(XMLに指定した<PThreadWin32Home>にコピーすれば参照されるかと思いきや参照されなかったので私はコードと同じディレクトリにコピーしちゃいました)
3つのXML要素を指定すると下記のようになります。
ExampleProjectの実行
PcapPlusPlusのExampleProjectに保存されているExampleProject.slnをVisual Studioで開きます。
何も考えずにF5でデバッグ&ビルド&実行しちゃいます。
下記画像のように”Source IP is '10.0.0.138’; Dest IP is '10.0.0.1’”と表示されればOKです。
サンプルプログラムの動作としては、同じディレクトリにある1_packet.pcapを読み込んで、その中に保存されているパケットの送信元と送信先を出力する、という簡単なコードです。
実行時にstdio.hがみつからないなどのエラーが発生した場合は、プロジェクトプロパティ⇒構成プロパティ⇒全般⇒Windows SDKバージョンがあっているか確認してください。
なお、Windows SDKバージョンはC:¥Program Files(x86)\Windows Kitsの中からstdio.hなどのヘッダファイルが保存されているucrtフォルダの親フォルダ名から確認できます。
もし、Visual Studio 2022をご利用の方でも、プロジェクトプロパティのWindows SDKバージョンを合わせることによってコンパイルできるかもしれません(未検証)。