web-dev-qa-db-ja.com

プロセス/アプリケーションウィンドウごとのネットワークトラフィック

これを行うアプリケーション(procexplorerなど)がたくさんあることは知っていますが、アプリケーションまたはプロセスごとにネットワークトラフィック(TCP、UDPなど)を取得するためにwinapi(使用されるメソッド/参照)にアクセスする方法はありますか?

1
xlharambe

あなたのコメントから、あなたが開発しているアプリケーションによって生成されたネットワークトラフィックをアプリケーション自体の中からキャプチャしようとしていることがわかります。もしそうなら、それは開発者コミュニティなので、これはStackOverflowに適した質問かもしれないと思います。このようなイントロスペクションでは、おそらくETW(Event Tracing for Windows)を使用する必要がありますが、やはり確信が持てません。 S.O。に関するこの質問 役立つかもしれません。

それを少し脇に置いて、管理者側(ここで質問すると得られる傾向がある)に焦点を当てて、netsh traceコマンドと Microsoftネットワークモニター(Netmon) 。必要なときにNetMonから直接キャプチャすることも、netshtraceコマンドを自動的にトリガーして柔軟性を高めることもできます。

これに関心がある場合は、次のことができます。

netsh trace start capture=yes traceFile=c:\tracefolder\tracename.etl

キャプチャを開始してから:

netsh trace stop

あなたの準備ができたら。他にもオプションがあるので、netsh trace /?を使ってマニュアルを見ることができます

何らかの方法でキャプチャを取得したら、NetMonを使用してアプリケーションの実行可能ファイルをフィルタリングし、監視期間中にアプリケーションによって生成されたネットワークトラフィックを調べることができます。

2
john

Winapiについてはよくわかりませんが、「 Wireshark は、世界で最も優れたネットワークプロトコルアナライザです。ネットワークで何が起こっているかを微視的なレベルで確認できます。これは、多くの場合、事実上の(そして多くの場合デジュリ)標準です。産業と教育機関。」

0
f1assistance

libpcapを使用できます。 Libpcapは、ネットワークパケットキャプチャシステムへの高レベルのインターフェイスを提供するオープンソースライブラリです。

Libpcap APIは、CおよびC++から使用するように設計されていますが、PerlPythonJavaC#Rubyなどの言語から使用できるラッパーは多数あります。

LibpcapはほとんどのUnixライクなオペレーティングシステムで実行され、WinpcapWindows Packet Capture)という名前のWindowsバージョンもあります。

Winpcapのドキュメント を参照してください。


更新

悲しいことに、ネットワークスニッフィングツールはネットスタックの最下位レベルで動作し、すべてをキャッチしようとします。OSで実行されているプロセスを完全に認識していません。特定の呼び出しの発信元を見つけるのは非常に困難です。パケットスニファは、最終的に(ポート番号を介して)プロセスIDを把握する可能性があります。

これらの状況では、pcapを使用して何ができるでしょうか?

特定のトラフィックのみをスニッフィングする場合(例:TCP/IPパケットのみ、ポート23に送信されるパケットのみ)、ルールセットcompileを作成し、適用する必要があります。これは3段階のプロセスであり、すべてが密接に関連しています。ルールセットは文字列に保持され、pcapが読み取れる形式に変換されます(したがって、コンパイルされます)。

コンパイルは、実際にはプログラム内の関数を呼び出すことによって実行されます。外部アプリケーションの使用は含まれません。次に、pcapに、フィルタリングするセッションに適用するように指示します。


アップデート2

最初に理解することは、pcapスニファの一般的なレイアウトです。コードの流れは次のとおりです。

  1. まず、どのインターフェイスをスニッフィングするかを決定します。 Linuxではこれはeth0のようなもので、BSDではxl1などです。このデバイスを文字列で定義するか、 pcapでインターフェイスの名前 それは仕事をします。

  2. Pcapを初期化します。これは、実際にスニッフィングしているデバイスをpcapに通知する場所です。必要に応じて、複数のデバイスをスニッフィングできます。それらをどのように区別しますか?ファイルハンドルの使用。読み取りまたは書き込み用にファイルを開くのと同じように、スニッフィングにsessionという名前を付けて、他のそのようなセッションと区別できるようにする必要があります。

  3. 特定のトラフィックのみをスニッフィングする場合(たとえば、TCP/IPパケットのみ、ポート23に送信されるパケットのみなど)、ルールセットを作成し、「コンパイル」して適用する必要があります。これは3段階のプロセスであり、すべてが密接に関連しています。ルールセットは文字列に保持され、pcapが読み取れる形式に変換されます(したがって、コンパイルされます)。

    コンパイルは、実際にはプログラム内の関数を呼び出すことによって実行されます。外部アプリケーションの使用は含まれません。次に、pcapに、フィルタリングするセッションに適用するように指示します。

  4. 最後に、pcapにプライマリ実行ループに入るように指示します。この状態では、pcapは、必要な数のパケットを受信するまで待機します。新しいパケットを受け取るたびに、すでに定義した別の関数を呼び出します。

    それが呼び出す関数は、私たちが望むことを何でもすることができます。パケットを分析してユーザーに印刷したり、ファイルに保存したり、何もしなかったりする可能性があります。

  5. スニッフィングのニーズが満たされた後、セッションを閉じて完了します。

0
stderr