WinPcap, определение девайса
От: licedey  
Дата: 09.09.11 21:41
Оценка:
Пытаюсь через ping перехватить девайс, через который идет трафик.


bool FindDevice( ) {        
        networkAdapters.clear();

        pcap_if_t *alldevs = NULL;
        
        // search for network devices
        if( pcap_findalldevs( &alldevs, NULL ) == -1 )                
            return false;
                
        unsigned devnum = 0;
        char errbuf[PCAP_ERRBUF_SIZE];
        for( pcap_if_t *curDev = alldevs; curDev != NULL; curDev = curDev->next, ++devnum )        // enumerate fonded devices
        {            
            pcap_addr_t *addrs = NULL;        // get network adapter ip-address
            for( addrs = curDev->addresses; addrs != NULL; addrs = addrs->next )            
                if( addrs->addr->sa_family == AF_INET )                
                    break;
        
            if( pcap_t *capHandle = pcap_open_live(curDev->name, 65535, 0, 1, errbuf ) )
            {
                struct bpf_program bpf;

                // create bpf filter for receiveing icmp packets, for current device
                int rc = pcap_compile( capHandle, &bpf, "icmp[0] = 1 or icmp[0] = 8 and host google.com", 1, 0xFFFFFFFF );
                if( rc < 0 )
                {
                    pcap_close(capHandle);
                    continue;
                }

                rc = pcap_setfilter( capHandle, &bpf );        // Now set bpf filter
                pcap_freecode( &bpf );

                // handle packets for that device
                NetworkAdapter netAdp( curDev, addrs, devnum, capHandle );
                networkAdapters.push_back( netAdp );

                netAdp.thread = ThreadCreate( reinterpret_cast<ThreadRoutine>(NetworkAdapter::CaptureIcmp), &networkAdapters.back() );                                
            }
        }

        // all device listeners was run, now 'Ping' and determinate which device able to capture packets
        //Ping("google.com");        
        system("ping google.com");   // в callback'e получаю TAP-Win32 Adapter V9. А хочется физ. адаптер D-Link  :???: 
Re: WinPcap, определение девайса
От: licedey  
Дата: 09.09.11 21:43
Оценка:
Здравствуйте, licedey, Вы писали:

Функция pcap_lookupdev() — не помагает, и вроде бы deprecated. Возвращает слэш.

L>Пытаюсь через ping перехватить девайс, через который идет трафик.



L>
L>bool FindDevice( ) {        
L>        networkAdapters.clear();

L>        pcap_if_t *alldevs = NULL;
        
L>        // search for network devices
L>        if( pcap_findalldevs( &alldevs, NULL ) == -1 )                
L>            return false;
                
L>        unsigned devnum = 0;
L>        char errbuf[PCAP_ERRBUF_SIZE];
L>        for( pcap_if_t *curDev = alldevs; curDev != NULL; curDev = curDev->next, ++devnum )        // enumerate fonded devices
L>        {            
L>            pcap_addr_t *addrs = NULL;        // get network adapter ip-address
L>            for( addrs = curDev->addresses; addrs != NULL; addrs = addrs->next )            
L>                if( addrs->addr->sa_family == AF_INET )                
L>                    break;
        
L>            if( pcap_t *capHandle = pcap_open_live(curDev->name, 65535, 0, 1, errbuf ) )
L>            {
L>                struct bpf_program bpf;

L>                // create bpf filter for receiveing icmp packets, for current device
L>                int rc = pcap_compile( capHandle, &bpf, "icmp[0] = 1 or icmp[0] = 8 and host google.com", 1, 0xFFFFFFFF );
L>                if( rc < 0 )
L>                {
L>                    pcap_close(capHandle);
L>                    continue;
L>                }

L>                rc = pcap_setfilter( capHandle, &bpf );        // Now set bpf filter
L>                pcap_freecode( &bpf );

L>                // handle packets for that device
L>                NetworkAdapter netAdp( curDev, addrs, devnum, capHandle );
L>                networkAdapters.push_back( netAdp );

L>                netAdp.thread = ThreadCreate( reinterpret_cast<ThreadRoutine>(NetworkAdapter::CaptureIcmp), &networkAdapters.back() );                                
L>            }
L>        }

L>        // all device listeners was run, now 'Ping' and determinate which device able to capture packets
L>        //Ping("google.com");        
L>        system("ping google.com");   // в callback'e получаю TAP-Win32 Adapter V9. А хочется физ. адаптер D-Link  :???: 
L>
Re: WinPcap, определение девайса
От: n2o  
Дата: 23.09.11 06:02
Оценка:
Здравствуйте, licedey, Вы писали:

L>Пытаюсь через ping перехватить девайс, через который идет трафик.


Ну если ты делаешь ping, то можно попробовать следующий вариант. Он не тривиальный, но работать будет, имхо.
Перед отправкой пинга начинай "слушать" трафик на всех адаптерах. Ищи DNS-ответ на свой запрос. Ведь когда ты сделаешь ping google.com первым делом в
ход пойдет DNS-запрос разрешения имени "google.com", соответственно поймав DNS-ответ на одном из адаптеров можно сказать, что скорее всего именно через него идет трафик. Правда тут есть подводные камни (например если адрес google.com и соответствующий ему IP пробиты в hosts, но я не знаю кому нужно так извращаться).
Как видишь не самый тривиальный способ
Re[2]: WinPcap, определение девайса
От: Pasha1st  
Дата: 24.09.11 09:37
Оценка:
Здравствуйте, n2o, Вы писали:

n2o>Ну если ты делаешь ping, то можно попробовать следующий вариант. Он не тривиальный, но работать будет, имхо.

n2o>Перед отправкой пинга начинай "слушать" трафик на всех адаптерах. Ищи DNS-ответ на свой запрос. Ведь когда ты сделаешь ping google.com первым делом в
n2o>ход пойдет DNS-запрос разрешения имени "google.com", соответственно поймав DNS-ответ на одном из адаптеров можно сказать, что скорее всего именно через него идет трафик. Правда тут есть подводные камни (например если адрес google.com и соответствующий ему IP пробиты в hosts, но я не знаю кому нужно так извращаться).
n2o>Как видишь не самый тривиальный способ

Плохой, негодный способ.
Адрес может быть тействительно забит в hosts
Адрес может быть закеширован системой
DNS-сервера могут располагаться в другой подсети на другом адаптере
Re[2]: WinPcap, определение девайса
От: licedey  
Дата: 25.09.11 16:20
Оценка:
Здравствуйте, n2o, Вы писали:

n2o>Здравствуйте, licedey, Вы писали:


L>>Пытаюсь через ping перехватить девайс, через который идет трафик.


n2o>Ну если ты делаешь ping, то можно попробовать следующий вариант. Он не тривиальный, но работать будет, имхо.

n2o>Перед отправкой пинга начинай "слушать" трафик на всех адаптерах. Ищи DNS-ответ на свой запрос. Ведь когда ты сделаешь ping google.com первым делом в
n2o>ход пойдет DNS-запрос разрешения имени "google.com", соответственно поймав DNS-ответ на одном из адаптеров можно сказать, что скорее всего именно через него идет трафик. Правда тут есть подводные камни (например если адрес google.com и соответствующий ему IP пробиты в hosts, но я не знаю кому нужно так извращаться).
n2o>Как видишь не самый тривиальный способ

Именно так и решил задачу Пингует, ловит ICMP пакеты, перед этим поставив фильтры и прослушку на все адаптеры.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.