2009-12-07 46 views
7

私のマシンのすべての着信HTTPパケットをキャプチャしたいと思います。これを行うために、私はSharpPcapをWinPcapラッパーとして使用しています。SharpPcapでHTTPパケットをキャプチャする方法

SharpPcapはうまく動作しますが、TCPパケットをキャプチャしていますが、これはあまりにも低レベルなので、私がしたいことはありません。誰もがeaslyこれらのすべてのTCPパケットから完全なHTTP要求/応答を取得する方法を知っていますか?

おかげ

答えて

8

SharpPcapは、wiresharkと同じ方法で(GUIではなくコードで)パケットをキャプチャすることができます。また、それらを直接解析することも、共通の.pcapファイル形式でドライブにダンプすることもできます。キャプチャを解析する

手順は次のとおり

  • インターフェイス
  • オープンプロミスキャスモードでの接続をピック
  • スタートいずれかwhileループ又はイベントコールバックを使用する
  • 生を解析キャプチャあなたが望むタイプへのパケット

もしあなたが.pcapダンプファイルを読んでいるのであれば、プロセスはほぼ同じですオフラインキャプチャリーダーを呼び出したり、インターフェイスを選択する必要がなく、無差別モードを設定する必要はありません。 wireshark、tcpdump、その他ほとんどのPcapフレームワークで使用される標準フィルタは、すべてSharpPcapでサポートされています。これらについては、tcpdump manを参照してください。

現在、HTTPを直接解析するサポートはありませんが、TCPパケットを解析するのは簡単です。

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket); 

パケット:

あなたは(非解析された)生のパケットを受信し、これを行います。Net(SharpPcapの独立したコンポーネント)は、通信がVPN、PPoE、またはPPPでカプセル化されていても、TCP部分を直接引き出すことができます。

TCPPacketが解析されたら、適切なテキスト形式に変換できるローバイトのHTTPヘッダーを含むバイト配列のペイロードのpacket.PayloadBytesを取得するだけです(HTTPヘッダーそのレベルでUTF-8またはASCIIエンコーディングを使用します)。 HTTPヘッダーを解析するには、自由に利用できるツール/ライブラリがたくさんあるはずです。


TCPからのHTTPパケットを抽出するには:

データ(1500バイトを超える)断片化されている場合は、必要に彼らが来るような接続のTCPパケットを収集する必要があり、メモリ内に部品を再組み立てします。どの部品がどの順序で使用されているかを知るには、シーケンス/確認応答番号を注意深く追跡する必要があります。

これは、SharpPcapで実現するのは簡単なことではありません。スタックのかなり下の部分で作業し、手動で接続を再組み立てするからです。

Wiresharkのは、今の時点でC.

でこれを実現する方法についての興味深い記事があり、SharpPcapは、TCPペイロードの解析をサポートしていません。


SharpPcapの使い方の例を簡単にお探しなら、ソースツリーをダウンロードし、含まれるサンプルプロジェクトを見てください。 tutorial for SharpPcap on codeprojectもあります。

質問が多い場合や、プロジェクトに機能リクエストをしたい場合は、SourceForgeプロジェクトに自由に投稿してください。それは死からずっと離れており、引き続き積極的に発展しています。

注:Chris Morganはプロジェクトリーダーであり、私はSharpPcap/Packet.Netの開発者の一人です。

更新:コードプロジェクトのチュートリアルプロジェクトは、現在のAPIに合わせて最新の状態になりました。

+0

'GetEncapsulated'は' Packet.ParsePacket(e.Packet.LinkLayerType、e.Packet.Data);と同じです; 'right? – C4u

0

は、私はあなたが解決策に近づいていると思う:あなたはHTTPトラフィックからのTCPパケットを持っている場合、あなただけのHTTPリクエスト/レスポンスを再構築するために、TCPペイロードを抽出する必要があります。考えられる方法はこちらSO entryを参照してください。

2

TCPストリームをHTTP要求/応答の組にデコードするのは簡単ではありません。 WireSharkのようなツールはこれをかなりの労力で行います。

私はRuby用のWireSharkラッパーを作成しましたが、それはあなたが手助けするものではありませんでしたが、私が書き終える前にtshark(WireSharkのコマンドラインバージョン)を使ってみました。それは私の問題を解決しませんでしたが、それはあなたのために働くかもしれません。方法は次のとおりです。

パケットをキャプチャしてpcapファイルに書き込みます(SharpPcapにはおそらくこれがあります)。ある時点でcapファイルを閉じて別のファイルを開き、HTTPトラフィック用のフィルタとPDML形式の出力を示すフラグを持つ古いtsharkを実行します。これはXML形式であり、さまざまな形式のすべてのHTTPフィールドの値を含むSystem.Xmlツールで簡単に解析できます。 tsharkを生成するためのC#コードを記述し、そのStdOutストリームをXMLリーダーにパイプすることで、パケットがtsharkから出てくるようにすることができます。大規模なキャプチャファイルのPDML出力が非常にクレイジーになる可能性があるため、DOMパーサの使用はお勧めしません。

要件が複雑でない限り(私の場合と同じように)、これは必要なだけのものかもしれません。

+0

興味深いのは、よく知られている標準フォーマットであるPDMLか、アプリケーション固有の一度限りです。 SharpPcapの上限は、2つの方法で行うことができます:低/中程度のトラフィックの場合、パケットの生存/解析が可能です。 (ftp転送のように)高トラフィックのキャプチャの場合、最善のオプションはraw capを.pcapファイルにダンプして後処理することです。 SharpPcapは、基本的に、wiresharkのようなキャプチャをC#アプリケーションに組み込むクロスプラットフォームのフレームワークです。現在、SharpPcapはpcapラッパーで、Packet.Netはパーサー・ライブラリーです。 –

+0

コードはどこかに投稿されていますか(例:GitHub)。もしそうなら、ある時点でそれを見てみたいと思います。 TCP再アセンブリの手順を管理するのにどれだけのコード/労力がかかるかを見たいと思います。 –

+0

私は、PDMLがwiresharkに特有の標準であるかどうかわかりません。いずれにしても簡単に処理できます。 – anelson

関連する問題