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 回答