Я пытаюсь извлечь полезную нагрузку tcp из пакета, и вот минимальный случай обратного вызова захвата:
void capture_callback (u_char *hdr , const struct pcap_pkthdr* pkthdr , const u_char* buff)
{
struct ether_header *eptr = (struct ether_header *) buff;
buff += sizeof (ether_header); /* jump over ethernet header: 14 bytes */
if ( ntohs (eptr->ether_type) == ETHERTYPE_IP )
{
struct ip *iph;
struct tcphdr *tcp_header;
iph = (struct ip *) buff;
buff += sizeof (ip); /* jump over ip header */
if ( iph->ip_p == IPPROTO_TCP )
{
tcp_header = (struct tcphdr *) buff;
buff += sizeof (tcphdr); /* jump over tcp header */
cout << inet_ntoa (iph->ip_src) << ":" << ntohs (tcp_header->th_sport) <<
" --> " << inet_ntoa(iph->ip_dst) << ":" << ntohs (tcp_header->th_dport) << endl;
}
}
}
Но здесь что-то пошло не так, IP-адрес источника и назначенияодинаковы.
И кроме того, как я могу распечатать полезную нагрузку?Поскольку я не могу просто преобразовать массив без знака в массив символов явно, который заканчивается на "\ 0", это может привести к ошибкам.
192.168.56.1: 48065 -> 192.168.56.1:80
192.168.56.80: 80 -> 192.168.56.80:48065
РЕДАКТИРОВАТЬ
---------------------
Спасибо Celeda, я решил проблему с IP-адресом, разделив вызов inet_ntoa:
cout << "IP: " << inet_ntoa (iph->ip_src) << ":" << ntohs (tcp_header->th_sport) <<
" --> ";
cout << inet_ntoa(iph->ip_dst) << ":" << ntohs (tcp_header->th_dport) << endl;
А теперь вторая часть, я использую:
cout << hex << buff << endl;
Для протокола HTTP, и я не вижу ничего подобного "GET /", но несколько пустых строк
РЕДАКТИРОВАТЬ 2
--------------------------
На данный момент я не уверен в параметрах TCP, я проверю больше документов о деталях, но сейчас это работает хорошо.
if ( iph->ip_p == IPPROTO_TCP )
{
tcp_header = (struct tcphdr *) buff;
buff += tcp_header->th_off * 4;
cout << "IP: " << inet_ntoa (iph->ip_src) << ":" << ntohs (tcp_header->th_sport) <<
" --> ";
cout << inet_ntoa(iph->ip_dst) << ":" << ntohs (tcp_header->th_dport) << endl;
for ( int i = 0 ; i < iph->ip_len - iph->ip_off * 4; i ++ )
{
if ( isascii (buff[i]) )
{
cout << buff[i];
}
}
cout << endl << "-----------" << endl;
}