Интерпретация полезной нагрузки с использованием libpcap - PullRequest
1 голос
/ 13 июля 2011

Так что я в последнее время играюсь с 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».Теперь, на мой взгляд, выходные данные Output A и Output B должны быть одинаковыми, печатая только заголовок HTTP.Выход B всегда распечатывает его правильно, но в выход A иногда добавляется HTTP-заголовок плюс около 7 байтов случайного текста, добавляемого к нему (например, «ïƒ♂N ↓ ƒ♂»).

Итак, вопрос в том, откуда исходит этот искаженный текст?И в чем разница между простой печатью полезной нагрузки, как в выводе А, и ее циклическим отображением и печатью каждого символа, как в выводе В?

1 Ответ

2 голосов
/ 13 июля 2011

Что ж, если он не определен NUL (\0), он не будет знать, где остановиться, поэтому он напечатает текст мусора.Возможно, вы захотите сделать:

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