2

ペイロードを解析したい TCP パケットをキャプチャするために pcap を使用しています。私の戦略は次のとおりです。

  1. イーサネット ヘッダーを取得し、タイプETHERTYPE_IP(IP パケット)があるかどうかを確認します
  2. IP パケットにプロトコルIPPROTO_TCP(TCP パケット)があるかどうかを確認する
  3. ペイロード サイズ > 0 を確認します(size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header))

  4. ペイロードを解析する (ホスト URL を取得する)

不一致が発生しているため、ペイロードの解析をまだ開始していません。以下は、 filter を使用してキャプチャされた 10 個の TCP パケットのペイロードの出力"host = www.google.com"です。

パケット番号: 3 : TCP パケット: ソース ポート: 80 宛先ポート: 58723 パケットにデータがありません

パケット番号: 4 : TCP パケット: 送信元ポート: 58723 送信先ポート: 80 パケットにデータがありません

パケット番号: 5 : TCP パケット: Source Port: 58723 Dest Port: 80 Payload: GET / HTTP/1.1 Host: www.google.com User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-米国) AppleWebKit/533.19.4 (Gecko のような KHTML) バージョン/5.0.3 Safari/533.19.4 Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8 ,image/png, / ;q=0.5 Accept-Language: en-us Accept-Encoding: gzip, deflate Cookie: THICNT=25; SID=DQAAAKIAAAB2ktMrEftADifGm05WkZmlHQsiy1Z2v- 接続: キープアライブ

パケット番号: 6 : TCP パケット: ソース ポート: 80 宛先ポート: 58723 パケットにデータがありません

パケット番号: 7 : TCP パケット: ソース ポート: 80 宛先ポート: 58723ペイロード: \272نu\243\255\375\375}\336H\221\227\206\312~\322\317N\236\255A\343 #\226\370˙\245[\327`\306\nE\263\204\313\356\3268 )p\344\301_Y\255\267\240\222x\364

パケット番号: 8 : TCP パケット: ソース ポート: 58723 宛先ポート: 80 パケットにデータがありません

パケット番号: 9 : TCP パケット: ソース ポート: 80 送信先ポート: 58723ペイロード: HTTP/1.1 200 OK 日付: 2010 年 11 月 29 日月曜日 10:11:36 GMT 有効期限: -1 キャッシュ制御: プライベート、最大年齢 = 0 コンテントタイプ: text/html; charset=UTF-8 Content-Encoding: gzip サーバー: gws Content-Length: 8806 X-XSS-Protection: 1; モード=ブロック \213

ペイロードとポートに不一致があるのはなぜですか? 理想的には、パケット 5 のようなパケットのみを解析したいと考えています。7 や 9 のようなパケットを無視するにはどうすればよいですか?

4

3 に答える 3

6

コンテンツを分析することによってのみ。「HTTP 要求」パケットをマークできる IP または TCP ヘッダーには何もありません。永続的な接続があるため、「接続の最初のデータパケット」でさえ機能しません。

また、TCP ストリームを再構築して HTTP リクエストを解析する必要があるすべての URI を完全に確実にキャッチするには、URI を 2 つ以上のパケットに分割することができます。

于 2010-11-29T11:45:06.133 に答える
3

IP ヘッダーと同様に、TCP ヘッダーも可変長です。あなたはそれを考慮していません。合計パケット サイズからやみくもに差し引くのではなくsizeof(struct tcp_header))、IP データ内の TCP ヘッダーを特定し、その長さフィールド (IP ヘッダー長フィールドと同様に 4 を掛ける必要があります) を使用して、実際のパケットの場所を知る必要があります。データペイロードが配置されています。

于 2010-11-29T22:05:32.540 に答える
2

サイズの計算が正しくありません。ネットワーク ホスト オーダーで減算を行うことはできません。最初に各フィールドをホスト バイト オーダーに変換する必要があります。

size = ntohs(ip_header->total_length) - ntohs(ip->header_length) * 4 - sizeof(struct tcp_header))

ただし、Remy Lebeauが指摘しているように、実際offsetには TCP ヘッダーのフィールドを調べて、ペイロードの開始位置を知る必要があります。

パケット 5 とパケット 7 の違いは、前者がクライアントからサーバーに送信され、後者がサーバーからクライアントへの応答であることですこれが、ポートが切り替えられる理由です。送信元アドレスと宛先アドレスも切り替えられます。

クライアントからのパケットのみを調べたい場合は、送信元アドレスがクライアントのアドレスと同じであることを確認してください。

于 2010-11-30T01:57:17.060 に答える