Win10PcapをVisual C++ 2008 Expressでビルドする

  • 5
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Win10PcapをVisual C++ 2008 Expressでビルドする

つい先日、Win10Pcapというパケットキャプチャライブラリが公開されました。

ソースコードはGitHubで公開されています。

オリジナルのWinPcapとの違いと特徴については以下のように説明されています。

  • WinPcapをNDIS 6.xドライバモデルにintegratedしてWindows 10で動作するようにした
    • オリジナルのWinPcapライブラリはNDIS 5.xドライバモデルがベース
  • 加えて、イーサフレームのIEEE802.1Q VLANタグをキャプチャする機能を追加した
    • これはオリジナルのWinPcapではサポートしてない機能
  • 10,000オクテットよりも大きいジャンボフレームをサポート
  • オリジナルのWinPcapとバイナリ互換

Windowsでのドライバ開発環境の構築・ビルド手順を把握したかったこともあり、今回はWin10Pcapを手元でビルドしてみました。

開発環境の構築

Win10Pcapのビルドに必要なツール

Win10Pcapのビルド環境として、Windows XP,Vista,7,8が指定されています。
今回はビルドテスト用の環境として、Modern.IEのVMを利用します。

開発ツールとしてVisual Stidio 2008が指定されており、これは以下のURLからダウンロード+インストールしておきます。Windows SDKも併せてインストールしておく点に注意してください。

そして、デバイスドライバ開発のため、Windows Device Driver Kit(WinDDK)も忘れずにインストールします。これは"C:\winddk"以下にインストールされます。

その他のツール(アプリケーション)

Win10PcapのソースコードはGitHubで公開されています。Windowsでgitを利用できるようにするため、SourceTreeをインストールしておきます。

パケットキャプチャの確認用にWiresharkもダウンロードしておきます。ドライバのインストール確認の兼ね合いで、この段階ではWiresharkはインストールしません。

こうやって見ると、環境構築は単にツールをインストールするだけですね...。

Win10Pcapのビルド

Win10Pcapソースコードを取得する

Win10PcapのソースコードをGitHubから取得します。

今回はSourceTreeを利用してgit cloneしてみます。SourceTreeのメニューから「File」→「Clone/New...」を選択して以下のように入力します。
img014.png

Win10Pcapのビルド手順

環境構築でインストールしたWindows Driver Kit(以降"WinDDK"と表記)は、以下のフォルダにインストールされます。

  • C:\WinDDK\7600.16385.1

git cloneしたWin10Pcapのプロジェクト設定では、WinDDKがC:\WinDDK\7600.16385.0となっているので、まずは参照するDDKのパスを合わせます。

Visual C++のソリューション エクスプローラから、NdisDriverのプロパティを開きます。
img001.png

プロパティページから、「構成プロパティ」→「リンカ」→「コマンドライン」を選択します。右側にある「追加のオプション(D):」にWinDDKのインストールフォルダを参照している箇所があるので、これを適切なパスに書き換えます。
img002.png

また、Visual C++ 2008のExpress Editionでは、参照するヘッダファイルが異なっている(別名になっている?)ものがあるので、以下のように参照するヘッダファイルを書き換えます。

diff --git a/Installer/Installer.rc b/Installer/Installer.rc
index 3d7ad54..80d3490 100644
--- a/Installer/Installer.rc
+++ b/Installer/Installer.rc
@@ -7,7 +7,7 @@
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+#include "windows.h"

 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END

 2 TEXTINCLUDE 
 BEGIN
-    "#include ""afxres.h""\r\n"
+    "#include ""windows.h""\r\n"
     "\0"
 END

diff --git a/NdisDriver/NdisDriver.rc b/NdisDriver/NdisDriver.rc
index bdc2459..9550875 100644
--- a/NdisDriver/NdisDriver.rc
+++ b/NdisDriver/NdisDriver.rc
@@ -7,7 +7,7 @@
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+#include "windows.h"

 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END

 2 TEXTINCLUDE 
 BEGIN
-    "#include ""afxres.h""\r\n"
+    "#include ""windows.h""\r\n"
     "\0"
 END

diff --git a/Packet_dll/Packet_dll.rc b/Packet_dll/Packet_dll.rc
index e815e09..1babaf0 100644
--- a/Packet_dll/Packet_dll.rc
+++ b/Packet_dll/Packet_dll.rc
@@ -7,7 +7,7 @@
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+#include "windows.h"

 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END

 2 TEXTINCLUDE 
 BEGIN
-    "#include ""afxres.h""\r\n"
+    "#include ""windows.h""\r\n"
     "\0"
 END

上記の手順を実施したのち、メニューから「ビルド(B)」→「ソリューションのビルド(B)」を選択してWin10Pcapをビルドします。ビルドが成功すると以下のような出力が得られます。
img003.png

確認用にWinPcap無しでWiresharkをインストールする

Win10Pcap(のドライバ)がビルドできたので、さっそく動作させてみます。WinPcapを利用するアプリケーションが必要なので、Wiresharkをインストールします。

ただし、Win10Pcapが利用されているかどうかも確認したいため、以下のようにWiresharkのインストール時には、付属するWinPcapを「インストールしない」手順で進めます。
img004.png

上記手順でWiresharkをインストールすると、WinPcapが入っていない状態なので、パケットキャプチャ実行時に以下のようなエラーが発生します。WinPcapが入っていない状態にしたかったので、これは想定通りの動作です。
img005.png

ビルドしたWin10Pcapをインストールする

次にビルドしたWin10Pcapをインストールします。プロジェクトフォルダのbin\Win32ディレクトリにバイナリが生成されるので、その中にあるinstaller.exeを実行します。
img006.png

以下のダイアログが表示されるので、「Install」をクリックしてWin10Pcapドライバをインストールします。
img007.png

ちゃんとWin10Pcapドライバがインストールされたか確認してみます。Windowsの「システム情報」でインストールされているドライバが確認できます。

Visual C++のメニューから「ヘルプ(H)」→「Visual C++ 2008 Express Edition のバージョン情報(A)」をクリックし、バージョン情報ダイアログを表示します。「システム情報(S)」ボタンがあるので、それをクリックするとシステム情報が表示できます。
img008.png

「System Summary」→「Software Environment」→「System Drivers」を辿るとインストールされているドライバが一覧表示できます。その中を見ると、「win10pcap」という名前でドライバがインストールされていることを確認できます。
img009.png

Wiresharkから参照されるWinPcapを確認してみる

Win10Pcapのドライバがインストールされていることが確認できたので、次はWiresharkからWin10Pcapが利用されるか確認してみましょう。

Wiresharkを起動してメニューから「Capture」→「Interfaces...」を選択します。インタフェースの一覧が表示されるので、右側にある「Details」をクリックします。
img010.png

すると"Unknown WinPcap version."というダイアログが表示されます。「WinPcapのpacket.dllが『10, 1, 0, 5001』で(このバージョンは)知らないよ」(意訳)というメッセージが出ています。
img011.png

Win10Pcapのソースコードを参照すると、Packet_dllのHeader\Packet32.hにPACKET_CURRENT_VERSIONというマクロ定数があり、この値が「10, 1, 0, 5001」であることから、ちゃんとビルドしたWin10Pcapドライバが利用されていることが分かります。
img012.png

ちなみに、"Unknown WinPcap version."は念のための確認的なダイアログなので、「OK」をクリックすると、普通に(Win10Pcapドライバで)パケットキャプチャが行えます。
img013.png

まとめ

Win10Pcapをソースコードからビルドしてみました。Windows環境にはあまり馴染みがない+Windowsドライバのビルドは試したことがなかったので、環境構築まわりで色々試行錯誤する形になってしまいました(手順が分かってしまえば単に必要なツールをインストールするだけなのですが...)。また、本当にWin10Pcapドライバがインストールできているか、Wiresharkから利用されているかの確認もどうしたら良いのかあれこれ考えてみる感じでしたが、確認できる方法が分かってほっとしています。

あと、今回の一連の内容を6/29(月)の第29回「ネットワークパケットを読む会(仮)」でデモを含めた発表をしてみようかなと考えています。この会は他にも面白い発表があるので、予定の合う方は参加されてみてはどうでしょうか。