我正在用 libpcap 为 http 数据包编写一个嗅探器。有时打印 http 有效负载的内容我会得到奇怪的字符.. 你知道它们可能是什么吗?
*xNT:����3�@�"P#1u`��$%S{M��
或者
�~�tsE��}>a�����}/���`�▒�A�y
谢谢,你的答案。
如果标题是纯文本,那么问题出在我的代码上。
无论如何,一个 POST 请求可以用 base64 编码吗?
我正在用 libpcap 为 http 数据包编写一个嗅探器。有时打印 http 有效负载的内容我会得到奇怪的字符.. 你知道它们可能是什么吗?
*xNT:����3�@�"P#1u`��$%S{M��
或者
�~�tsE��}>a�����}/���`�▒�A�y
谢谢,你的答案。
如果标题是纯文本,那么问题出在我的代码上。
无论如何,一个 POST 请求可以用 base64 编码吗?
在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);
}
这可能是您的显示字体没有字符的二进制数据。HTTP 不一定传输文本,它可以是图像或客户端请求的任何其他形式的原始二进制文件。很难说没有看到 TCP 包的其余部分。
HTTP 标头 Content -Type应该告诉您有效负载的类型。HTTP 标头还应说明是否使用压缩。
与http://web-sniffer.net/比较你得到的东西或使用 Wireshark 之类的东西