私のマシンのすべての着信HTTPパケットをキャプチャしたいと思います。これを行うために、私はSharpPcapをWinPcapラッパーとして使用しています。SharpPcapでHTTPパケットをキャプチャする方法
SharpPcapはうまく動作しますが、TCPパケットをキャプチャしていますが、これはあまりにも低レベルなので、私がしたいことはありません。誰もがeaslyこれらのすべてのTCPパケットから完全なHTTP要求/応答を取得する方法を知っていますか?
おかげ
私のマシンのすべての着信HTTPパケットをキャプチャしたいと思います。これを行うために、私はSharpPcapをWinPcapラッパーとして使用しています。SharpPcapでHTTPパケットをキャプチャする方法
SharpPcapはうまく動作しますが、TCPパケットをキャプチャしていますが、これはあまりにも低レベルなので、私がしたいことはありません。誰もがeaslyこれらのすべてのTCPパケットから完全なHTTP要求/応答を取得する方法を知っていますか?
おかげ
SharpPcapは、wiresharkと同じ方法で(GUIではなくコードで)パケットをキャプチャすることができます。また、それらを直接解析することも、共通の.pcapファイル形式でドライブにダンプすることもできます。キャプチャを解析する
手順は次のとおり
もしあなたが.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に合わせて最新の状態になりました。
は、私はあなたが解決策に近づいていると思う:あなたはHTTPトラフィックからのTCPパケットを持っている場合、あなただけのHTTPリクエスト/レスポンスを再構築するために、TCPペイロードを抽出する必要があります。考えられる方法はこちらSO entryを参照してください。
TCPストリームをHTTP要求/応答の組にデコードするのは簡単ではありません。 WireSharkのようなツールはこれをかなりの労力で行います。
私はRuby用のWireSharkラッパーを作成しましたが、それはあなたが手助けするものではありませんでしたが、私が書き終える前にtshark(WireSharkのコマンドラインバージョン)を使ってみました。それは私の問題を解決しませんでしたが、それはあなたのために働くかもしれません。方法は次のとおりです。
パケットをキャプチャしてpcapファイルに書き込みます(SharpPcapにはおそらくこれがあります)。ある時点でcapファイルを閉じて別のファイルを開き、HTTPトラフィック用のフィルタとPDML形式の出力を示すフラグを持つ古いtsharkを実行します。これはXML形式であり、さまざまな形式のすべてのHTTPフィールドの値を含むSystem.Xmlツールで簡単に解析できます。 tsharkを生成するためのC#コードを記述し、そのStdOutストリームをXMLリーダーにパイプすることで、パケットがtsharkから出てくるようにすることができます。大規模なキャプチャファイルのPDML出力が非常にクレイジーになる可能性があるため、DOMパーサの使用はお勧めしません。
要件が複雑でない限り(私の場合と同じように)、これは必要なだけのものかもしれません。
興味深いのは、よく知られている標準フォーマットであるPDMLか、アプリケーション固有の一度限りです。 SharpPcapの上限は、2つの方法で行うことができます:低/中程度のトラフィックの場合、パケットの生存/解析が可能です。 (ftp転送のように)高トラフィックのキャプチャの場合、最善のオプションはraw capを.pcapファイルにダンプして後処理することです。 SharpPcapは、基本的に、wiresharkのようなキャプチャをC#アプリケーションに組み込むクロスプラットフォームのフレームワークです。現在、SharpPcapはpcapラッパーで、Packet.Netはパーサー・ライブラリーです。 –
コードはどこかに投稿されていますか(例:GitHub)。もしそうなら、ある時点でそれを見てみたいと思います。 TCP再アセンブリの手順を管理するのにどれだけのコード/労力がかかるかを見たいと思います。 –
私は、PDMLがwiresharkに特有の標準であるかどうかわかりません。いずれにしても簡単に処理できます。 – anelson
'GetEncapsulated'は' Packet.ParsePacket(e.Packet.LinkLayerType、e.Packet.Data);と同じです; 'right? – C4u