⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iwlist.c

📁 访问网卡的各种信息
💻 C
📖 第 1 页 / 共 4 页
字号:
 
    case 0x01:
      printf("WEP-40 ");
      break;
 
    case 0x02:
      printf("TKIP ");
      break;
 
    case 0x03:
      printf("WRAP ");
      break;
 
    case 0x04:
      printf("CCMP ");
      break;
 
    case 0x05:
      printf("WEP-104 ");
      break;
 
    default:
      printf("Unknown ");
      break;
    }
 }
 
/*------------------------------------------------------------------*/
/*
 * Parse, and display the results of a WPA or WPA2 IE.
 *
 */
static inline void 
iw_print_ie_wpa(unsigned char *	iebuf,
                int		buflen)
{
  int			ielen = iebuf[1] + 2;
  int			offset = 2;	/* Skip the IE id, and the length. */
  unsigned char		wpa1_oui[3] = {0x00, 0x50, 0xf2};
  unsigned char		wpa2_oui[3] = {0x00, 0x0f, 0xac};
  unsigned char *	wpa_oui;
  int			i;
  uint16_t		ver = 0;
  uint16_t		cnt = 0;

  if(ielen > buflen)
    ielen = buflen;

  switch(iebuf[0])
    {
    case 0x30:		/* WPA2 */
      /* Check if we have enough data */
      if(ielen < 4)
        {
          iw_print_ie_unknown(iebuf, buflen);
           return;
        }

      wpa_oui = wpa2_oui;
      break;

    case 0xdd:		/* WPA or else */
      wpa_oui = wpa1_oui;
 
      /* Not all IEs that start with 0xdd are WPA. 
       * So check that the OUI is valid. */
      if((ielen < 8)
         || ((memcmp(&iebuf[offset], wpa_oui, 3) != 0)
             && (iebuf[offset+3] == 0x01)))
         {
          iw_print_ie_unknown(iebuf, buflen);
           return;
         }

       offset += 4;
       break;

    default:
      return;
    }
  
  /* Pick version number (little endian) */
  ver = iebuf[offset] | (iebuf[offset + 1] << 8);
  offset += 2;

  if(iebuf[0] == 0xdd)
    printf("WPA Version %d\n", ver);
  if(iebuf[0] == 0x30)
    printf("IEEE 802.11i/WPA2 Version %d\n", ver);

  /* From here, everything is technically optional. */

  /* Check if we are done */
  if(ielen < (offset + 4))
    {
      /* We have a short IE.  So we should assume TKIP/TKIP. */
      printf("                        Group Cipher : TKIP\n");
      printf("                        Pairwise Cipher : TKIP\n");
      return;
    }
 
  /* Next we have our group cipher. */
  if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
    {
      printf("                        Group Cipher : Proprietary\n");
    }
  else
    {
      printf("                        Group Cipher : ");
      iw_print_ie_cipher(iebuf[offset+3]);
      printf("\n");
    }
  offset += 4;

  /* Check if we are done */
  if(ielen < (offset + 2))
    {
      /* We don't have a pairwise cipher, or auth method. Assume TKIP. */
      printf("                        Pairwise Ciphers (1) : TKIP\n");
      return;
    }

  /* Otherwise, we have some number of pairwise ciphers. */
  cnt = iebuf[offset] | (iebuf[offset + 1] << 8);
  offset += 2;
  printf("                        Pairwise Ciphers (%d) : ", cnt);

  if(ielen < (offset + 4*cnt))
    return;

  for(i = 0; i < cnt; i++)
    {
      if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
         {
           printf("Proprietary  ");
         }
      else
        {
           iw_print_ie_cipher(iebuf[offset+3]);
         }
      offset+=4;
    }
  printf("\n");
 
  /* Check if we are done */
  if(ielen < (offset + 2))
    return;

  /* Now, we have authentication suites. */
  cnt = iebuf[offset] | (iebuf[offset + 1] << 8);
  offset += 2;
  printf("                        Authentication Suites (%d) : ", cnt);

  if(ielen < (offset + 4*cnt))
    return;

  for(i = 0; i < cnt; i++)
    {
      if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
         {
           printf("Proprietary  ");
         }
      else
        {
           switch(iebuf[offset+3])
             {
             case 0x00:
               printf("Reserved  ");
               break;

             case 0x01:
               printf("802.1X  ");
               break;

             case 0x02:
               printf("PSK  ");
               break;

             default:
               printf("Unknown  ");
               break;
             }
         }
       offset+=4;
     }
  printf("\n");
 
  /* Check if we are done */
  if(ielen < (offset + 1))
    return;

  /* Otherwise, we have capabilities bytes.
   * For now, we only care about preauth which is in bit position 1 of the
   * first byte.  (But, preauth with WPA version 1 isn't supposed to be 
   * allowed.) 8-) */
  if(iebuf[offset] & 0x01)
    {
      printf("                       Preauthentication Supported\n");
    }
}
 
/*------------------------------------------------------------------*/
/*
 * Process a generic IE and display the info in human readable form
 * for some of the most interesting ones.
 * For now, we only decode the WPA IEs.
 */
static inline void
iw_print_gen_ie(unsigned char *	buffer,
                int		buflen)
{
  int offset = 0;

  /* Loop on each IE, each IE is minimum 2 bytes */
  while(offset <= (buflen - 2))
    {
      printf("                    IE: ");

      /* Check IE type */
      switch(buffer[offset])
        {
        case 0xdd:	/* WPA1 (and other) */
        case 0x30:	/* WPA2 */
          iw_print_ie_wpa(buffer + offset, buflen);
          break;
        default:
          iw_print_ie_unknown(buffer + offset, buflen);
        }
      /* Skip over this IE to the next one in the list. */
      offset += buffer[offset+1] + 2;
    }
}

/*------------------------------------------------------------------*/
/*
 * Print one element from the scanning results
 */
static inline void
print_scanning_token(struct stream_descr *	stream,	/* Stream of events */
                     struct iw_event *		event,	/* Extracted token */
                     struct iwscan_state *	state,
                     struct iw_range *	iw_range,	/* Range info */
                     int		has_range)
{
  char		buffer[128];	/* Temporary buffer */

  /* Now, let's decode the event */
  switch(event->cmd)
    {
    case SIOCGIWAP:
      printf("          Cell %02d - Address: %s\n", state->ap_num,
             iw_saether_ntop(&event->u.ap_addr, buffer));
      state->ap_num++;
      break;
    case SIOCGIWNWID:
      if(event->u.nwid.disabled)
        printf("                    NWID:off/any\n");
      else
        printf("                    NWID:%X\n", event->u.nwid.value);
      break;
    case SIOCGIWFREQ:
      {
        double		freq;			/* Frequency/channel */
        int		channel = -1;		/* Converted to channel */
        freq = iw_freq2float(&(event->u.freq));
        /* Convert to channel if possible */
        if(has_range)
          channel = iw_freq_to_channel(freq, iw_range);
        iw_print_freq(buffer, sizeof(buffer),
                      freq, channel, event->u.freq.flags);
        printf("                    %s\n", buffer);
      }
      break;
    case SIOCGIWMODE:
      printf("                    Mode:%s\n",
             iw_operation_mode[event->u.mode]);
      break;
    case SIOCGIWNAME:
      printf("                    Protocol:%-1.16s\n", event->u.name);
      break;
    case SIOCGIWESSID:
      {
        char essid[IW_ESSID_MAX_SIZE+1];
        memset(essid, '\0', sizeof(essid));
        if((event->u.essid.pointer) && (event->u.essid.length))
          memcpy(essid, event->u.essid.pointer, event->u.essid.length);
        if(event->u.essid.flags)
          {
            /* Does it have an ESSID index ? */
            if((event->u.essid.flags & IW_ENCODE_INDEX) > 1)
              printf("                    ESSID:\"%s\" [%d]\n", essid,
                     (event->u.essid.flags & IW_ENCODE_INDEX));
            else
              printf("                    ESSID:\"%s\"\n", essid);
          }
        else
          printf("                    ESSID:off/any/hidden\n");
      }
      break;
    case SIOCGIWENCODE:
      {
        unsigned char	key[IW_ENCODING_TOKEN_MAX];
        if(event->u.data.pointer)
          memcpy(key, event->u.data.pointer, event->u.data.length);
        else
          event->u.data.flags |= IW_ENCODE_NOKEY;
        printf("                    Encryption key:");
        if(event->u.data.flags & IW_ENCODE_DISABLED)
          printf("off\n");
        else
          {
            /* Display the key */
            iw_print_key(buffer, sizeof(buffer), key, event->u.data.length,
                         event->u.data.flags);
            printf("%s", buffer);

            /* Other info... */
            if((event->u.data.flags & IW_ENCODE_INDEX) > 1)
              printf(" [%d]", event->u.data.flags & IW_ENCODE_INDEX);
            if(event->u.data.flags & IW_ENCODE_RESTRICTED)
              printf("   Security mode:restricted");
            if(event->u.data.flags & IW_ENCODE_OPEN)
              printf("   Security mode:open");
            printf("\n");
          }
      }
      break;
    case SIOCGIWRATE:
      if(state->val_index == 0)
        printf("                    Bit Rates:");
      else
        if((state->val_index % 5) == 0)
          printf("\n                              ");
        else
          printf("; ");
      iw_print_bitrate(buffer, sizeof(buffer), event->u.bitrate.value);
      printf("%s", buffer);
      /* Check for termination */
      if(stream->value == NULL)
        {
          printf("\n");
          state->val_index = 0;
        }
      else
        state->val_index++;
      break;
    case IWEVQUAL:
      {
        iw_print_stats(buffer, sizeof(buffer),
                       &event->u.qual, iw_range, has_range);
        printf("                    %s\n", buffer);
        break;
      }
    case IWEVGENIE:
      /* Informations Elements are complex, let's do only some of them */
      iw_print_gen_ie(event->u.data.pointer, event->u.data.length);
      break;
    case IWEVCUSTOM:
      {
        char custom[IW_CUSTOM_MAX+1];
        if((event->u.data.pointer) && (event->u.data.length))
          memcpy(custom, event->u.data.pointer, event->u.data.length);
        custom[event->u.data.length] = '\0';
        printf("                    Extra:%s\n", custom);
      }
      break;
    default:
      printf("                    (Unknown Wireless Token 0x%04X)\n",
             event->cmd);
   }	/* switch(event->cmd) */
}

/*------------------------------------------------------------------*/
/*
 * Perform a scanning on one device
 */
static int
print_scanning_info(int		skfd,
                    char *	ifname,
                    char *	args[],		/* Command line args */
                    int		count)		/* Args count */
{
  struct iwreq		wrq;
  unsigned char *	buffer = NULL;		/* Results */
  int			buflen = IW_SCAN_MAX_DATA; /* Min for compat WE<17 */
  struct iw_range	range;
  int			has_range;
  struct timeval	tv;				/* Select timeout */
  int			timeout = 15000000;		/* 15s */

  /* Avoid "Unused parameter" warning */
  args = args; count = count;

  /* Get range stuff */
  has_range = (iw_get_range_info(skfd, ifname, &range) >= 0);

  /* Check if the interface could support scanning. */
  if((!has_range) || (range.we_version_compiled < 14))
    {
      fprintf(stderr, "%-8.16s  Interface doesn't support scanning.\n\n",
              ifname);
      return(-1);
    }

  /* Init timeout value -> 250ms*/
  tv.tv_sec = 0;
  tv.tv_usec = 250000;

  /*
   * Here we should look at the command line args and set the IW_SCAN_ flags
   * properly
   */
  wrq.u.data.pointer = NULL;		/* Later */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -