Доброго времени суток! Сейчас столкнулся с проблемой, пишу анализатор трафика, и мне необходимо просматривать http, как это сделать? С помощью libpcap реализовал сниффер, но максимум что могу узнать длинну пакета, если все правильно написал то он должен поидее просматривать только http трафик, как распарсить эти пакеты? Вот код перехватывающий их:
#include <stdio.h>
#include <pcap.h>
int main(int argc, char *argv[]){
pcap_t *handle; //заголовок сессии
char *dev, errbuf[PCAP_ERRBUF_SIZE]; //хранение ошибок
struct bpf_program fp; //The compiled filter expression
char filter_exp[] = "tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)"; //The filter expression
bpf_u_int32 mask; //The netmask of our sniffing device
bpf_u_int32 net; //The IP of our sniffing device
struct pcap_pkthdr header; //The header that pcap gives us
const u_char *packet; //The actual packet
//установка соединения
dev = pcap_lookupdev(errbuf);
if (dev == NULL) {
fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
return(2);
}
printf("Device: %s\n", dev);
//поиск устройства если не через рут он не даст скажет нет прав
handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
if(handle == NULL) {
fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
return(2);
}
printf("Device is opening for sniffing\n");
//проверка на поддерживаемость типазаголовка канального уровня
if(pcap_datalink(handle) != DLT_EN10MB){
fprintf(stderr, "Device %s doesn't provide Ethernet headers - not supported\n", dev);
return(2);
}
printf("Device does provide Ethernet headers\n");
//установка фильтров
if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {
fprintf(stderr, "Can't get netmask for device %s\n", dev);
net = 0;
mask = 0;
}
handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
if(pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
return(2);
}
printf("Parse filter found\n");
if(pcap_setfilter(handle, &fp) == -1) {
fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
return(2);
}
printf("Parse filter install\n");
while(1){
// Grab a packet
packet = pcap_next(handle, &header);
// Print its length
printf("Jacked a packet with length of [%d]\n", header.len);
}
// And close the session
pcap_close(handle);
return(0);
}
Заранее спасибо!