初めにお断りしておきます。タイトルは少し嘘です。正確には、WinPcapのデバイスドライバnpf.sysを使わずにWiresharkを動かします。wpcap.dllは使います。

以前書いた記事、netsh traceと同じようにパケットキャプチャーするプログラムを作ったの続きです。

今回作ったもののソースコードはegtra/ndiscap-packet (GitHub)にあります。

前回のあらすじ

Windows 7より、OSにパケットキャプチャ機能が搭載されており、netsh traceコマンドで呼び出せます。これを他のアプリから使う方法が公開されていないようだったので、なんのAPIを使っているのか調べました。そして、以下のソースコードが出来上がりました。

Gist: “netsh trace start caputre=yes traceFile=D:\packet.etl”の再現 · GitHub

今回やったこと

前回のコードを基に、WinPcap互換のDLLを作ろうと考えました。WinPcapを使う代表的なアプリケーションとしてWireshark(Wireshark – 窓の杜)を対象とし、Wiresharkがとりあえず動くところまで作りました。

動機

始めたきっかけは、近頃のWindowsとWinPcapのnpf.sysの組み合わせにおける安定性への疑問からです。npf.sysなしでWinPcapを使えたら良いと思っていました。

もっとも、現状ではWin10Pcap – WinPcap for Windows 10が良い解決策でしょう。私も普段はWin10Pcapを使っています。

動かし方

  1. Githubのリポジトリegtra/ndiscap-packetにあるソースコードをVisual Studio 2015でビルドする。packet.dllが出来上がる。
  2. WinPcap · DownloadからWinPcapをダウンロードし、wpcap.dllを取り出す。WinPcapのインストールは不要。
  3. C:\Windows\System32など、パスの通るところにwpcap.dllとビルドしたpacket.dllを置く。
  4. WiresharkをWinPcap抜きでインストールする。
  5. Wiresharkを「管理者として実行」する。packet.dllの影響で起動に時間がかかる(私の場合、10秒ほど)ので、少々待つ。
  6. 「NdisCapPacket」というインタフェースが1つ存在するはずなので、それに対してキャプチャーを開始。

ndiscap-packetがWiresharkで認識されている様子

メニューバーの「キャプチャ」→「オプション」をクリックするとこういう表示になります。もちろん、このウィンドウを呼び出さず、メインウィンドウからキャプチャを開始しても問題ありません。

WinPcapのAPI

WinPcap互換のものを作ろうとしているので、作るにあたってWinPcapのおさらいをしました。

WinPcap: WinPcap internalsで説明されているように、WinPcapは以下のような階層になっています。

Application Wpcap.dll Packet.dll Npf.sys

Wpcap.dllはlibpcapとほぼ互換の高水準なAPI、Packet.dllは低水準なAPIを提供しています。アプリからWpcap.dllが呼び出され、Packet.dllが呼び出され、デバイスドライバNpf.sysに到達するという階層です。

余談ですが、Win10PcapのWin10Pcap.sysは、Npf.sysと互換となっているのですね。

というわけで、Wpcap.dllまたはPacket.dllのいずれかと互換性のあるDLLを作れば良いというわけです。そこで、双方のAPIを見て回り、作るのが簡単そうだったPacket.dllの互換品を作ることにしました。

まとめ

WinPcapのデバイスドライバnpf.sysあるいはその代替となるWin10Pcapを使うことなく、WinPcapを使うアプリケーションを動作させたいと考えました。

突貫工事で作ったので、まだ実用になる状態ではありません。プルリク歓迎です。無線LANなどいろいろな環境で試したり、実装をサボっているAPIをまじめに実装したりしないと使い物にならないでしょう。


スポンサード リンク

この記事のカテゴリ

  • ⇒ WiresharkをWinPcap抜きで動かす
  • ⇒ WiresharkをWinPcap抜きで動かす