1

libpcap を使用して http パケットのスニファーを作成しています。http ペイロードのコンテンツを印刷すると、奇妙な文字が表示されることがあります。

*xNT:���3�@�"P#1u`��$%S{M��

また

�~�tsE��}>a�����}/���`�▒�A�y

答えてくれてありがとう。

ヘッダーがプレーンテキストの場合、問題は私のコードです。

とにかく、POST リクエストを base64 でコーディングできますか?

4

3 に答える 3

2

utils_http.cあなたには次の機能があります:

static int handle_tcp(const struct tcphdr *tcp, int len)
{
  char buf[PCAP_SNAPLEN];
  memcpy(buf, tcp + 1, len - sizeof(*tcp));
  DEBUG("DANY TCPDs tcp string: %s",buf);
  if (0 == handle_http(buf, len - sizeof(*tcp)))
    return 0;
  return 1;
}

これは、TCP ペイロードが常に TCP ヘッダーの先頭から 20 バイト後に開始されることを前提としています (常に 20 バイトであるためsizeof(*tcp) == 20)。これは、TCP オプションを考慮していません。TCP オプション (非常に一般的) を含むパケットを受信した場合handle_http()、バッファの先頭にバイナリ エンコードされた TCP オプションが含まれている可能性があります。

代わりに次のようにしてみてください。

static int handle_tcp(const struct tcphdr *tcp, int len)
{
  char buf[PCAP_SNAPLEN];
  memcpy(buf, (void*)tcp + tcp->doff*4, len - tcp->doff*4);
  DEBUG("DANY TCPDs tcp string: %s",buf);
  if (0 == handle_http(buf, len - tcp->doff*4))
    return 0;
  return 1;
}

または、さらに良いことに、チャンスがあるたびにバッファのコピーを常に何十個も作成している理由がわかりません。何か不足していない限り、ポインタを渡すことができます:

static int handle_tcp(const struct tcphdr *tcp, int len) {
  return handle_http((void*)tcp + tcp->doff*4, len - tcp->doff*4);
}
于 2010-12-18T23:09:34.010 に答える
1

これはおそらく、表示フォントに文字がないバイナリ データです。HTTP は必ずしもテキストを転送するとは限りません。クライアントが要求した画像やその他の生のバイナリ形式である可能性があります。TCP パッケージの残りの部分を見ずに言うのは難しいです。

于 2010-12-18T17:18:49.847 に答える
1

HTTP ヘッダーContent-Typeは、ペイロードのタイプを示しているはずです。HTTP ヘッダーには、圧縮が使用されているかどうかも示されている必要があります。

得られるものをhttp://web-sniffer.net/と比較するか、Wireshark などを使用します

于 2010-12-18T17:23:26.557 に答える