使用libpcap解释有效负载

Interpretting payload using libpcap

本文关键字:负载 有效 解释 libpcap 使用      更新时间:2023-10-16

我最近一直在使用libpcap,我有一个快速的问题。下面是有问题的代码:

while( (result = pcap_next_ex(adapterHandle, &header, &packetData)) >= 0)
{
    if(result == 0) // Packet was dropped
        continue;

    ethernet = (struct sniff_ethernet*)packetData;
    ip = (struct sniff_ip*)(packetData + SIZE_ETHERNET);
    size_ip = IP_HL(ip)*4;
    ip_len = ntohs(ip->ip_len);
    if(ip->ip_p != IPPROTO_TCP)
        continue;
    tcp = (struct sniff_tcp*)(packetData + SIZE_ETHERNET + size_ip);
    size_tcp = TH_OFF(tcp)*4;
    if(size_tcp < 20)
    {
        cout << "Invalid TCP Header" << endl;
        exit(-1);
    }
    payload = (u_char*)(packetData + SIZE_ETHERNET + size_ip + size_tcp);
    size_payload = ip_len - (size_ip + size_tcp);
    cout << "************** Output A ******************" << endl;
    cout << payload << endl;
    cout << "*************** Output B *****************" << endl;
    for(int i=0; i<size_payload; i++)
        cout << payload[i];
}

所以在我的测试中,我将其设置为只捕获HTTP"GET"请求。现在在我看来,输出A和输出B的输出应该是相同的,只打印HTTP头。输出B总是正确地打印出来,但输出A偶尔也有HTTP标头加上大约7字节的随机文本(如"ï N↓")。

那么问题是这些乱码的文本是从哪里来的?在输出A中直接打印有效载荷与在输出B中循环打印每个字符之间的区别是什么?

好吧,如果它不是NUL终止(),它将不知道在哪里停止,所以它将打印垃圾文本。你可能想这样做:

payload[size_payload] = ''; /* Before using it. */