Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2011, 21:14   #1
masterbloger
Пользователь
 
Регистрация: 09.11.2010
Сообщений: 14
По умолчанию Нужна модернизация кода для снифера

Здравствуйте!
Помогите, пожалуйста, разобраться с такой проблемой. Нужно анализировать пакеты в локальной сети и при получении определённой информации выполнять действия. Конкретней, есть компьютерная сеть с подключёнными к ней ip телефонами cisco и нужно анализировать пакеты SKINNY протокола, которыми телефон общается с сервером. Эти пакеты приходят на порт 2000 протокола TCP на сервере.
IP-адрес сервера например 10.0.20.1, IP-адрес телефона – 10.0.10.1, а IP компьютера оператора – 10.0.30.1. Моя программа находится на компьютере оператора.
Проблема в том, что моя программа видит только те пакеты, которые идут от сервера к оператору и наоборот, а пакеты, которые сервер направляет телефону и обратные, почему-то нет.
Проще говоря, мне нужно чтобы программа, размещённая на компьютере 1, видела пакеты, которые идут от компьютера 2 к компьютеру 3. Все компьютеры в одной сети, но в разных подсетях.
Вот исходный код программы.
Код:
int _tmain(int argc, _TCHAR* argv[])
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
        exit(1);
    }
    for(d=alldevs; d; d=d->next)
    {
        printf("%d. %s", ++i, d->name);
        if (d->description)
            printf(" (%s)\n", d->description);
        else
            printf(" (No description available)\n");
    }
    if(i==0)
    {
        printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
        return -1;
    }
    printf("Enter the interface number (1-%d):",i);
    scanf_s("%d", &inum);
    if(inum < 1 || inum > i)
    {
        printf("\nInterface number out of range.\n");
        pcap_freealldevs(alldevs);
        return -1;
    }
    for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
    if ( (adhandle= pcap_open(d->name,          // name of the device
                              65536,            // portion of the packet to capture
                                                // 65536 guarantees that the whole packet will be captured on all the link layers
                              PCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode
                              1000,             // read timeout
                              NULL,             // authentication on the remote machine
                              errbuf            // error buffer
                              ) ) == NULL)
    {
        fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
        /* Free the device list */
        pcap_freealldevs(alldevs);
        return -1;
    }
    printf("\nlistening on %s...\n", d->description);
	long netmask;
	bpf_program fcode;
    
	//Filter packets
	if (d->addresses != NULL)
        netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
    else
        netmask=0xffffff; 
    if (pcap_compile(adhandle, &fcode, "tcp port 2000", 1, netmask) < 0)
    {
        fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
        pcap_freealldevs(alldevs);
        return -1;
    }
    if (pcap_setfilter(adhandle, &fcode) < 0)
    {
        fprintf(stderr,"\nError setting the filter.\n");
        /* Free the device list */
        pcap_freealldevs(alldevs);
        return -1;
    }
	pcap_freealldevs(alldevs);
    pcap_loop(adhandle, 0, packet_handler, NULL);
    return 0;
}
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
    struct tm ltime;
    char timestr[16];
    ip_header *ih;
    udp_header *uh;
    u_int ip_len;
    u_short sport,dport;
    time_t local_tv_sec;
    (VOID)(param);
    local_tv_sec = header->ts.tv_sec;
    localtime_s(&ltime, &local_tv_sec);
    strftime( timestr, sizeof timestr, "%H:%M:%S", &ltime);
	printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
    ih = (ip_header *) (pkt_data +
        14); //length of ethernet header
    ip_len = (ih->ver_ihl & 0xf) * 4;
    uh = (udp_header *) ((u_char*)ih + ip_len);
    sport = Swap( uh->sport );
    dport = Swap( uh->dport );
    printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\n",
        ih->saddr.byte1,
        ih->saddr.byte2,
        ih->saddr.byte3,
        ih->saddr.byte4,
        sport,
        ih->daddr.byte1,
        ih->daddr.byte2,
        ih->daddr.byte3,
        ih->daddr.byte4,
        dport);
}
Спасибо за помощь!

Последний раз редактировалось Stilet; 09.01.2011 в 15:19.
masterbloger вне форума Ответить с цитированием
Старый 08.01.2011, 21:44   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от masterbloger Посмотреть сообщение
Проблема в том, что моя программа видит только те пакеты, которые идут от сервера к оператору и наоборот, а пакеты, которые сервер направляет телефону и обратные, почему-то нет.
Ну так и должно быть, вобще-то, если у вас свитч, а не пассивный хаб.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.01.2011, 22:00   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну начнем с того что на сетевом интерфейсе должен быть установлен неразборчивый режим(чтоб он ловил пакеты предназначенные не только ему, а все что мимо него проходят)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.01.2011, 14:29   #4
masterbloger
Пользователь
 
Регистрация: 09.11.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Ну так и должно быть, вобще-то, если у вас свитч, а не пассивный хаб.
Программа WireShark видит те пакеты, что мне нужны. Насколько я знаю WireShark работает на Pcap. Моя прога тоже использует Pcap, но всех пакетов не видит.
В чем может быть проблема?

И как установить сетевой интерфейс в неразборчивый режим?

Последний раз редактировалось masterbloger; 09.01.2011 в 18:51.
masterbloger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual c++ CLR модернизация кода dampirik Помощь студентам 2 19.09.2009 02:20
Visual c++ CLR модернизация кода dampirik Общие вопросы .NET 4 15.09.2009 15:24
Нужна оптимизация дельфинского кода JTG Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 29.05.2008 14:53
Модернизация кода по выключению компьютера 01001 Помощь студентам 1 12.04.2007 19:16