包中的奇怪字符

时间:2010-12-18 17:15:02

标签: c http networking pcap

我正在使用libpcap为http数据包编写一个嗅探器。 有时打印http有效载荷的内容我会得到奇怪的字符..你知道它们会是什么吗?

* XNT:3 @“P#1u` $%S {M

〜TSE}>一种} /`▒Ay

谢谢,答案。

如果标题是纯文本,那么问题就是我的代码。

无论如何,POST请求可以在base64中编码吗?

3 个答案:

答案 0 :(得分: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个字节开始(因为sizeof(*tcp) == 20总是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);
}

答案 1 :(得分:1)

这可能是您的显示字体没有字符的二进制数据。 HTTP不一定传输文本,它可以是客户端请求的图像或任何其他形式的原始二进制文件。很难说没有看到TCP包的其余部分。

答案 2 :(得分:1)

HTTP header Content-Type应告诉您有效负载的类型。 HTTP标头还应说明是否使用压缩。

将您与http://web-sniffer.net/的内容进行比较或使用Wireshark

之类的内容