извлечение пакета из фрейма winpcap

Я использую winpcap для прослушивания сетевого трафика.

Есть ли способ извлечь пакет из фрейма (т.е. получить уровень 3 и выше без уровня 2), если я не знаю, какой протокол уровня 2 используется в сети?


person omer12433    schedule 21.12.2014    source источник


Ответы (2)


Нет. WinPcap доставляет пакеты уровня 2 (уровень канала передачи данных), поэтому при необходимости необходимо просмотреть заголовок уровня 2, чтобы определить, какой протокол уровня 3 (сетевой уровень) используется, а затем извлечь пакет уровня 3.

Однако pcap_datalink() сообщит вам сообщит, какой протокол уровня 2 используется, поэтому не будет случая, когда вы не знаете, какой протокол уровня 2 используется в сети. См. список значений типа уровня ссылки pcap; сравните значение, возвращаемое pcap_datalink(), со значениями DLT_, упомянутыми на этой странице.

person Community    schedule 21.12.2014
comment
Спасибо, я думал, что это единственный способ. Знаете ли вы, какие протоколы передачи данных распространены в локальных сетях? - person omer12433; 22.12.2014
comment
Проводные локальные сети почти всегда представляют собой Ethernet. Беспроводные локальные сети почти всегда используют стандарт 802.11, но захват в сетях 802.11 более сложен (для захвата трафика, отличного от трафика, входящего и исходящего от вашего компьютера, вы должны захватывать в режиме мониторинга, который 1) не поддерживается WinPcap и 2) означает, что вы будет перехватывать зашифрованные пакеты в защищенной сети с использованием WEP или WPA/WPA2). - person ; 22.12.2014
comment
Если вы спрашиваете, потому что хотите поддерживать только некоторые типы связующего уровня, вы должны, если pcap_datalink() не возвращает значение DLT_ для поддерживаемого вами типа связующего слоя, сообщить пользователю об ошибке, чтобы он знал, что ваш программа не может захватить в этой сети. - person ; 22.12.2014

Используйте этот код в модуле TestPacketCapture.

fp = fopen("D:\\Payload_data\\example.txt", "w+");  
for ( i=0; i<ulLines; i++ )
        {
            pLine =pChar;
            printf( "%08lx : ", pChar-base );
            ulen=tlen;
            ulen = ( ulen > 16 ) ? 16 : ulen;
            tlen -= ulen;

            for ( j=0; j<ulen; j++ )
            {  printf( "%02x ", *(BYTE *)pChar++ );
               // ch = *(BYTE *)pChar; // variable for writing to file
                fprintf(fp, pChar); //writing to a file
                //fputs("data is", fp);              
             }
person ashokavanjare    schedule 22.04.2017