pcap2ivs.c
上传用户:fubang
上传日期:2009-06-18
资源大小:2071k
文件大小:4k
源码类别:

其他

开发平台:

Unix_Linux

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include "pcap.h"
  5. unsigned char buffer[65536];
  6. int main( int argc, char *argv[] )
  7. {
  8.     time_t tt;
  9.     int n, z;
  10.     FILE *f_in, *f_out;
  11.     unsigned long nbr;
  12.     unsigned char *h80211;
  13.     unsigned char bssid_cur[6];
  14.     unsigned char bssid_prv[6];
  15.     struct pcap_file_header pfh;
  16.     struct pcap_pkthdr pkh;    
  17.     if( argc != 3 )
  18.     {
  19.         printf( "usage: cap2ivs <pcap file> <ivs output file>n" );
  20.         return( 1 );
  21.     }
  22.     memset( bssid_cur, 0, 6 );
  23.     memset( bssid_prv, 0, 6 );
  24.     /* check the input pcap file */
  25.     printf( "Opening %sn", argv[1] );
  26.     if( ( f_in = fopen( argv[1], "rb" ) ) == NULL )
  27.     {
  28.         perror( "fopen failed" );
  29.         return( 1 );
  30.     }
  31.     n = sizeof( pfh );
  32.     if( fread( &pfh, 1, n, f_in ) != (size_t) n )
  33.     {
  34.         perror( "fread(pcap file header) failed" );
  35.         return( 1 );
  36.     }
  37.     if( pfh.magic != TCPDUMP_MAGIC &&
  38.         pfh.magic != TCPDUMP_CIGAM )
  39.     {
  40.         printf( ""%s" isn't a pcap file (expected "
  41.                 "TCPDUMP_MAGIC).n", argv[1] );
  42.         return( 1 );
  43.     }
  44.     if( pfh.magic == TCPDUMP_CIGAM )
  45.         SWAP32( pfh.linktype );
  46.     if( pfh.linktype != LINKTYPE_IEEE802_11 &&
  47.         pfh.linktype != LINKTYPE_PRISM_HEADER &&
  48.         pfh.linktype != LINKTYPE_RADIOTAP_HDR )
  49.     {
  50.         printf( ""%s" isn't a regular 802.11 "
  51.                 "(wireless) capture.n", argv[1] );
  52.         return( 1 );
  53.     }
  54.     /* create the output ivs file */
  55.     printf( "Creating %sn", argv[2] );
  56.     if( ( f_out = fopen( argv[2], "wb+" ) ) == NULL )
  57.     {
  58.         perror( "fopen failed" );
  59.         return( 1 );
  60.     }
  61.     fwrite( IVSONLY_MAGIC, 1, 4, f_out );
  62.     nbr = 0;
  63.     tt = time( NULL ) - 1;
  64.     while( 1 )
  65.     {
  66.         if( time( NULL ) - tt > 0 )
  67.         {
  68.             printf( "33[KRead %ld packets...r", nbr );
  69.             fflush( stdout );
  70.             tt = time( NULL );
  71.         }
  72.         /* read one packet */
  73.         n = sizeof( pkh );
  74.         if( fread( &pkh, 1, n, f_in ) != (size_t) n )
  75.             break;
  76.         if( pfh.magic == TCPDUMP_CIGAM )
  77.             SWAP32( pkh.caplen );
  78.         n = pkh.caplen;
  79.         if( n <= 0 || n > 65535 )
  80.         {
  81.             printf( "Corrupted file? Invalid packet length %d.n", n );
  82.             return( 1 );
  83.         }
  84.         if( fread( buffer, 1, n, f_in ) != (size_t) n )
  85.             break;
  86.         nbr++;
  87.         h80211 = buffer;
  88.         /* remove any prism/radiotap header */
  89.         if( pfh.linktype == LINKTYPE_PRISM_HEADER )
  90.         {
  91.             if( h80211[7] == 0x40 )
  92.                 n = 64;
  93.             else
  94.             {
  95.                 n = *(int *)( h80211 + 4 );
  96.                 if( pfh.magic == TCPDUMP_CIGAM )
  97.                     SWAP32( n );
  98.             }
  99.             if( n < 8 || n >= (int) pkh.caplen )
  100.                 continue;
  101.             h80211 += n; pkh.caplen -= n;
  102.         }
  103.         if( pfh.linktype == LINKTYPE_RADIOTAP_HDR )
  104.         {
  105.             n = *(unsigned short *)( h80211 + 2 );
  106.             if( n <= 0 || n >= (int) pkh.caplen )
  107.                 continue;
  108.             h80211 += n; pkh.caplen -= n;
  109.         }
  110.         /* check if WEP data, min. length & bssid */
  111.         if( ( h80211[0] & 0x0C ) != 0x08 ||
  112.             ( h80211[1] & 0x40 ) != 0x40 )
  113.             continue;
  114.         z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30;
  115.         if( z + 16 > (int) pkh.caplen )
  116.             continue;
  117.         switch( h80211[0] & 3 )
  118.         {
  119.             case  0: memcpy( bssid_cur, h80211 + 16, 6 ); break;
  120.             case  1: memcpy( bssid_cur, h80211 +  4, 6 ); break;
  121.             case  2: memcpy( bssid_cur, h80211 + 10, 6 ); break;
  122.             default: memcpy( bssid_cur, h80211 +  4, 6 ); break;
  123.         }
  124.         if( memcmp( bssid_cur, bssid_prv, 6 ) != 0 )
  125.         {
  126.             fwrite( bssid_cur, 1, 6, f_out );
  127.             memcpy( bssid_prv, bssid_cur, 6 );
  128.         }
  129.         else
  130.             fwrite( "xFF", 1, 1, f_out );
  131.         fwrite( h80211 + z    , 1, 3, f_out );
  132.         fwrite( h80211 + z + 4, 1, 2, f_out );
  133.     }
  134.     printf( "33[2KRead %ld packets.n", nbr );
  135.     fclose( f_in );
  136.     fclose( f_out );
  137.     return( 0 );
  138. }