自分のマシンのすべての着信HTTPパケットをキャプチャしたいと思います。そのために、WinPcapラッパーであるSharpPcapを使用しています。
SharpPcapは非常にうまく機能しますが、TCPパケットをキャプチャするため、これは低レベルであり、私が望むことを実行できません。これらすべてのTCPパケットから完全なHTTP要求/応答を簡単に取得する方法を知っている人はいますか?
ありがとう
自分のマシンのすべての着信HTTPパケットをキャプチャしたいと思います。そのために、WinPcapラッパーであるSharpPcapを使用しています。
SharpPcapは非常にうまく機能しますが、TCPパケットをキャプチャするため、これは低レベルであり、私が望むことを実行できません。これらすべてのTCPパケットから完全なHTTP要求/応答を簡単に取得する方法を知っている人はいますか?
ありがとう
SharpPcapは、wiresharkと同じ方法で(GUIではなくコードで)パケットをキャプチャすることができます。また、それらを直接解析することも、一般的な.pcapファイル形式でドライブにダンプすることもできます。
キャプチャを解析する手順は次のとおりです。
.pcapダンプファイルを読み取る場合、オフラインキャプチャリーダーを呼び出すこと、インターフェイスを選択する必要がないこと、およびプロミスキャスモードを設定する必要がないことを除いて、プロセスはほとんど同じです。Wireshark、tcpdump、およびその他のほとんどのPcapフレームワークが使用するすべての標準フィルターがSharpPcapでサポートされています。これらの参照については、tcpdumpmanを確認してください。
現在、HTTPを直接解析することはサポートされていませんが、TCPパケットの解析は非常に簡単です。
生のパケット(解析されていない)を受け取ったら、次のようにします。
TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);
Packet.Net(SharpPcapの別個の付属コンポーネント)パーサーは、通信がVPN、PPoE、またはPPPによってカプセル化されている場合でも、TCP部分を直接引き出すことができます。
TCPPacketを解析したら、packet.PayloadBytesをバイト配列のペイロードに取得します。これには、適切なテキスト形式に変換できる生のバイトのHTTPヘッダーが含まれている必要があります(HTTPヘッダーがUTF-8を使用しているかどうかはわかりません)。またはそのレベルのASCIIエンコーディング)。HTTPヘッダーを解析するための無料で利用できるツール/ライブラリがたくさんあるはずです。
TCPからHTTPパケットを抽出するには:
接続のtcpパケットが着信したときに収集する必要があり、データが断片化されている場合(1500バイトを超える場合)、メモリ内のパーツを再アセンブルする必要があります。どの部分がどの順序で進むかを見つけるには、シーケンス/確認番号を注意深く追跡する必要があります。
スタックのはるかに低い部分で作業し、接続を手動で再組み立てしているため、これはSharpPcapで達成するのは簡単なことではありません。
Wiresharkには、Cでこれを実現する方法に関する興味深い記事があります。
現在のところ、SharpPcapはTCPペイロード解析をサポートしていません。
SharpPcapの使用方法のわかりやすい例を探している場合は、ソースツリーをダウンロードして、含まれているサンプルプロジェクトを確認してください。codeprojectにはSharpPcapのチュートリアルもあります。
さらに質問がある場合、および/またはプロジェクトに機能要求を行いたい場合は、SourceForgeプロジェクトに投稿してください。それは死ぬどころか、活発な開発が続けられています。
注:Chris Morganはプロジェクトリーダーであり、私はSharpPcap/Packet.Netの開発者の1人です。
更新:コードプロジェクトのチュートリアルプロジェクトは、現在のAPIと一致するように最新になりました。
TCPストリームをHTTP要求/応答ペアにデコードすることは簡単ではありません。WireSharkのようなツールは、かなりの労力でこれを行います。
Ruby用のWireSharkラッパーを作成しましたが(それは役に立ちません)、作成する前に、tshark(WireSharkのコマンドラインバージョン)を使用してみました。それは私の問題を解決しませんでしたが、それはあなたのために働くかもしれません。方法は次のとおりです。
パケットをキャプチャしてpcapファイルに書き込みます(SharpPcapにはおそらくこれを行う方法があります)。ある時点で、capファイルを閉じて別のファイルを開始し、古いファイルでHTTPトラフィック用のフィルターとPDML形式での出力が必要であることを示すフラグを使用してtsharkを実行します。これはXML形式であり、System.Xmlツールを使用して簡単に解析できます。この形式には、さまざまな形式のすべてのHTTPフィールドの値が含まれています。C#コードを記述してtsharkを生成し、そのStdOutストリームをXMLリーダーにパイプして、パケットが出現したときにtsharkからパケットを取得できるようにします。大きなキャプチャファイルのPDML出力はすぐに狂ってしまう可能性があるため、DOMパーサーを使用することはお勧めしません。
あなたの要件が(私のように)複雑でない限り、これがあなたが必要とするすべてかもしれません。
解決策に近いと思います。HTTPトラフィックからのTCPパケットがある場合は、HTTP要求/応答を再構築するためにTCPペイロードを抽出するだけで済みます。それを行うための可能な方法については、このSOエントリを参照してください。