7

自分のマシンのすべての着信HTTPパケットをキャプチャしたいと思います。そのために、WinPcapラッパーであるSharpPcapを使用しています。

SharpPcapは非常にうまく機能しますが、TCPパケットをキャプチャするため、これは低レベルであり、私が望むことを実行できません。これらすべてのTCPパケットから完全なHTTP要求/応答を簡単に取得する方法を知っている人はいますか?

ありがとう

4

3 に答える 3

8

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

キャプチャを解析する手順は次のとおりです。

  • インターフェイスを選択してください
  • 無差別モードで接続を開く
  • whileループまたはイベントコールバックのいずれかを使用してキャプチャを開始します
  • 生のパケットを必要なタイプに解析します

.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と一致するように最新になりました。

于 2010-11-10T06:47:40.807 に答える
2

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

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

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

あなたの要件が(私のように)複雑でない限り、これがあなたが必要とするすべてかもしれません。

于 2010-01-19T18:12:06.700 に答える
0

解決策に近いと思います。HTTPトラフィックからのTCPパケットがある場合は、HTTP要求/応答を再構築するためにTCPペイロードを抽出するだけで済みます。それを行うための可能な方法については、このSOエントリを参照してください。

于 2010-01-19T12:59:54.390 に答える