Windows Filtering Platform Sample をインストールする

皆さん、こんにちは。A寿です。

 

突然ですが、皆さんは、約 2 時間川下りしたことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話】までどうぞ。

 

さて、今回は、Windows Filtering Platform Sample を Windows 10 にインストールしてみたいと思います。

具体的な手順として、以下の流れで進めます。

 

(1) サンプルの入手

(2) Visual Studio 2015 でソリューションファイルを開く

(3) 構成とプラットフォームを編集

(4) ユーザーモードアプリケーション、ライブラリ、サービスのランタイムライブラリを設定

(5) サンプルインストールスクリプトの再起動の設定を編集

(6) ソリューションのビルド

(7) ビルドで生成されたモジュールの確認とテスト署名

(8) ターゲット PC の準備

(9) ドライバとサービスのインストール

(10) ユーザーモードアプリケーションの実行

(11) TraceView でのログ採取

 

それでは、以下、各手順の詳細を説明していきます。

前提として、開発用 PC として Windows 10 x64 (build 10586)、テスト用ターゲット PC として Windows 10 x86 (build 10586) を使用します。

 

(1) サンプルの入手

 

GitHub の以下のサイトから、ページ右側にある [Download ZIP] ボタンをクリックし、サンプル全体を Windows-driver-samples-master.zip としてダウンロードします。

 

https://github.com/Microsoft/Windows-driver-samples/

 

この zip ファイルを展開します。

\Windows-driver-samples-master\network\trans\WFPSampler フォルダが、今回ご説明する Windows Filtering Platform Sample に該当します。

 

(2) Visual Studio 2015 でソリューションファイルを開く

 

今回は Visual Studio 2015 を使用します。Visual Studio 2015 のインストール方法については、JS さんの以下の記事をご参考にしてください。

 

    Windows 10 でサンプル ドライバーをビルドするまで

    https://blogs.msdn.com/b/jpwdkblog/archive/2015/08/21/windows-10.aspx

 

Visual Studio 2015 を開き、[ファイル]→[開く]→[プロジェクト/ソリューション] をクリックします。

上記 WFPSampler フォルダにある WFPSampler.sln を開きます。

[WFPSampler に対するセキュリティ警告] のダイアログが出たら、今後の表示をスキップしたいので、[ソリューション内のすべてのプロジェクトに対して確認メッセージを表示する] のチェックボックスを OFF にして OK を押します。

以下の 5 つのプロジェクトがあることを右側の [ソリューション エクスプローラー] で確認できます。(以下の図をご参照ください。)

- Exe ノード下に WFPSampler ユーザーモードアプリケーションプロジェクト

- Lib ノード下に WFPSampler ユーザーモードライブラリプロジェクト

- Svc ノード下に WFPSamplerServiceユーザーモードサービスプロジェクト

- Sys ノード下に WFPSamplerCalloutDriver ドライバープロジェクト

- Syslib ノード下に WFPSampler カーネルモードライブラリプロジェクト

 

clip_image002

 

(3) 構成とプラットフォームを編集

 

[ソリューション エクスプローラー] で [ソリューション 'WFPSampler' (5 プロジェクト)] を右クリックして [構成マネージャー] をクリックします。

今回、例として、Windows 10 x86 をターゲット PC としているので、以下の設定を行います。

- [アクティブ ソリューション構成] は、Debug

- [アクティブ ソリューション プラットフォーム] は、Win32

- ビルドのチェックボックスはすべて ON

- 配置のチェックボックスはすべて OFF

 

clip_image004

 

 

(4) ユーザーモードアプリケーション、ライブラリ、サービスのランタイムライブラリを設定

 

[ソリューション エクスプローラー]で Exe ノード下の WFPSampler ユーザーモードアプリケーションプロジェクトを右クリックし、[プロパティ]をクリックします。

[WFPSampler プロパティページ] の左側のペインから、[構成プロパティ]→[C/C++]→[コード生成]をクリックします。

右側のペインで、[ランタイム ライブラリ] を [マルチスレッドデバッグ (/MTd)] に変更し、OKをクリックします。

Lib ノード下の WFPSampler ユーザーモードライブラリプロジェクト、Svc ノード下の WFPSamplerService ユーザーモードサービスプロジェクトでも同じ操作を実施します。

 

(5) サンプルインストールスクリプトの再起動の設定を編集

 

Visual Studio 2015 の [ファイル]→[開く]→[ファイル] で前述の WFPSampler フォルダ下の scripts フォルダの WfpSamplerInstall.cmd を開きます。

125行目を以下のように変更します。

 

変更前

RunDLL32.Exe syssetup,SetupInfObjectInstallAction DefaultInstall 131 %WinDir%\System32\Drivers\WFPSamplerCalloutDriver.Inf

 

変更後

RunDLL32.Exe syssetup,SetupInfObjectInstallAction DefaultInstall 132 %WinDir%\System32\Drivers\WFPSamplerCalloutDriver.Inf

 

変更点は 131 から 132 に変えているところだけです。

以下のドキュメントに記載している通り、以下の +3 から +4 に変わったことにより、再起動が必要な場合に、事前にユーザーに再起動してよいか確認してくれるようになります。

 

InstallHinfSection function

https://msdn.microsoft.com/en-us/library/windows/hardware/aa376957

 

128 Set the default path of the installation to the location of the INF. This is the typical setting.

+3 Reboot the computer if necessary without asking user for permission.

+4 If a reboot of the computer is necessary, ask the user for permission before rebooting.

 

113行目は、不要なため、以下のようにコメントアウトするか削除します。

 

変更前

goto :Cleanup

 

変更後

::goto :Cleanup

 

 

 

(6) ソリューションのビルド

 

Visual Studio 2015 の [ビルド]→[ソリューションのビルド] をクリックします。

 

(7) ビルドで生成されたモジュールの確認とテスト署名

 

エクスプローラを開き、5 つのプロジェクトそれぞれで生成されたファイルのうち、インストールやその確認に使用するファイルは以下の表の通りです。

 

 

 

 

 

 

 

 

 

 

 

 

WFPSamplerCalloutDriver.sys ドライバーと、そのカタログファイル wfpsamplercalloutdriver.cat にはすでに Visual Studio 2015 の設定でテスト署名が行われております。

そこで使用された、WFPSamplerCalloutDriver ドライバープロジェクトの WFPSamplerCalloutDriver.cer の証明書と signtool.exe を使って、WFPSamplerService.exe サービスと WFPSampler.exe ユーザーモードアプリケーションに、以下の例のようにテスト署名を行います。

 

> signtool.exe sign /v /s my /n WDKTestCert /t https://timestamp.verisign.com/scripts/timestamp.dll WFPSamplerService.exe

 

> signtool.exe sign /v /s my /n WDKTestCert /t https://timestamp.verisign.com/scripts/timestamp.dll WFPSampler.exe

 

<補足>

- signtool.exe は、WDK 10 がインストールされたフォルダの \bin\<arch> (例: \Program Files (x86)\Windows Kits\10\bin\x86\) にあります。

- WFPSamplerCalloutDriver.cerは、certmgr.msc で確認すると [個人] 証明書ストアに入っています。そのため、signtool.exe の /s オプション (証明書ストアを指定) では、[個人] 証明書ストアを表す my を指定しています。

- WFPSamplerCalloutDriver.cer をエクスプローラでダブルクリックして開き、[詳細] タブで [サブジェクト名] を確認すると、WDKTestCert で始まっているので、/n オプション (証明書が持つサブジェクト名を指定) ではこれを指定しています。

- 署名を行わない場合、サービスのインストール時に「指定されたプログラムは実行できません。」(The system cannot execute the specified program.) というエラーメッセージが表示され、インストールに失敗します。

 

 

(8) ターゲット PC の準備

 

これで、WFPSampler のサンプルを動作させるために必要なモジュールの準備はすべてできましたので、これをターゲット PC にコピーします。

例として、C:\WFPSamplerSamplePackage, C:\Symbols, C:\Tools の 3 つのフォルダを作成し、以下のファイルをすべてコピーします。

 

 

 

 

ターゲット PC で管理者権限でコマンドプロンプトを起動し、以下のコマンドを実行します。

 

> bcdedit /set testsigning on

 

OS を再起動します。

 

 

(9) ドライバとサービスのインストール

 

ターゲット PC で管理者権限でコマンドプロンプトを起動し、以下のコマンドを実行します。

 

> cd C:\WFPSamplerSamplePackage

 

> WFPSamplerInstall.cmd C:\WFPSamplerSamplePackage

 

成功すれば、以下のように表示されます。

 

Installing WFPSampler

 

Copying WFPSamplerCalloutDriver Bins to C:\Windows\System32\Drivers\

c:\WFPSamplerSamplePackage\wfpsamplercalloutdriver.cat

c:\WFPSamplerSamplePackage\WFPSamplerCalloutDriver.inf

c:\WFPSamplerSamplePackage\WFPSamplerCalloutDriver.sys

        3 個のファイルをコピーしました。

 

Copying WFPSampler application binaries to C:\Windows\System32\

        1 個のファイルをコピーしました。

        1 個のファイルをコピーしました。

 

Registering the WFPSampler Service

INFO: ServiceInstall() [status: 0]

Microsoft Windows Filtering Platform (WFP) Sample Policy Service サービスを開始します.

Microsoft Windows Filtering Platform (WFP) Sample Policy Service サービスは正常に開始されました。

 

 

Registering the WFPSampler Callout Driver

 

OS の再起動を要求するダイアログが表示されますので、再起動します。

 

clip_image006

 

OS 再起動後、サービスとドライバーの起動状況は、例えば、以下のように確認できます。

- ドライバーについては、[システム情報] ([Windows] ボタン +R で [ファイル名を指定して実行] に msinfo32.exe を入力して実行) から、[ソフトウェア環境]→[システムドライバー] で [wfpsamplercallouts] の [開始] が「はい」になっていることで確認できます。

 

clip_image008

 

- サービスについては、[サービス] ([Windows] ボタン +R で [ファイル名を指定して実行] に services.msc を入力して実行) から、[Microsoft Windows Filtering Platform (WFP) Sample Policy Service] の [状態] が「実行中」になっていることで確認できます。

 

clip_image010

 

 

(10) ユーザーモードアプリケーションの実行

 

今回は、例として、受け取った IP v4 パケットを全てフィルタするレイヤ (FWPM_LAYER_INBOUND_IPPACKET_V4) を、動的に有効にするオプションを指定して、WFPSampler.exe を実行してみます。

コマンドプロンプトから、以下を実行します。

 

> cd C:\WFPSamplerSamplePackage

 

> WFPSampler.exe -s BASIC_PACKET_EXAMINATION -l FWPM_LAYER_INBOUND_IPPACKET_V4 -v

 

問題なければ、以下が表示されます。

 

INFO: BasicPacketExaminationScenarioExecute : RpcInvokeScenarioBasicPacketExamination() [status: 0]

 

(11) TraceView でのログ採取

 

C:\Tools にある TraceView.exe を管理者権限で起動します。

メニューの [File]→[Create New Log Session]→[Add Provider]→[PDB] をクリックし、C:\Symbols に置いた WFPSamplerCalloutDriver.pdb を選択します。

 

clip_image012

 

clip_image014

 

clip_image016

 

clip_image018

 

以下のように、[LogSession0] として表示されている行の、[Level] にある [SET] をクリックし、[Level] を展開して [Information] に変更します。

 

clip_image020

 

clip_image022

 

これにより、以下のように、ドライバーが出力するログが下のペインに出力されます。

 

clip_image024

 

 

上記がご参考になれば幸いです。

ではまた。

 

――――――――――――――――

【閑話】突然ですが、皆さんは、約 2 時間川下りしたことはありますか?

 

数年前のゴールデンウィークに、関西の南の方で、川下りをしました。特に、急流というわけでもなく、広い川幅を、木製の舟で、船頭さんが竿を川に挿しながら、ゆったりと進んでいくものでした。乗り込む際は、オレンジ色の救命胴衣を着ける以外に、笠をかぶるので、頭だけ、日本古来っぽいいい雰囲気でした。また、川を下っている際には、緑に囲まれているので、非常に癒されました。ただ、天気に恵まれていたので、比較的軽装で乗り込んだものの、約 2 時間も川を下っていると、川の上を吹き抜ける風に、どんどん体温が奪われ、寒くなってきました。寒くなってくると、当然の生理現象として、だんだん、トイレが近くなってまいります。約半分くらいのところで、陸にあがることはできたのですが、トイレはありませんでした。そのまま休憩が終わり、再度舟に乗り込み、残り半分を耐えました。なんとか我慢しきって、ゴールにたどり着いても、まだトイレはありません。なんといっても単なる普通の川で、何の公共施設もないため、今度は送迎車に乗り込むよう促されます。乗客が比較的多く、十人くらい乗る舟が3艘くらい出ていたので、同じようになっている人たちは結構いました。車が、目的地である、とある神社にたどり着くと、どの車から降りた人が優先でトイレに行ってください、と指示されるのですが、正直、誰も聞いてはいませんでした。皆がトイレに殺到し、我先に用を足すのでした。皆さんも、川下りをする際には、所要時間や体温調節にはお気を付けください。