我正在使用libpcap为http数据包编写一个嗅探器。 有时打印http有效载荷的内容我会得到奇怪的字符..你知道它们会是什么吗?
* XNT:3 @“P#1u` $%S {M
或
〜TSE}>一种} /`▒Ay
谢谢,答案。
如果标题是纯文本,那么问题就是我的代码。
无论如何,POST请求可以在base64中编码吗?
答案 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
之类的内容