ec_inet.c
上传用户:nilegod
上传日期:2007-01-08
资源大小:220k
文件大小:17k
源码类别:

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- inet utilities, arp ping and more...
  3.     Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <unistd.h>
  19. #include <string.h>
  20. #include <sys/time.h>
  21. #include <sys/ioctl.h>
  22. #include <fcntl.h>
  23. #include <signal.h>
  24. #include <errno.h>
  25. #include "include/ec_main.h"
  26. #include "include/ec_error.h"
  27. #include "include/ec_inet_structures.h"
  28. #include "include/ec_inet_forge.h"
  29. #include "include/ec_buffer.h"
  30. #ifdef DEBUG
  31.    #include "include/ec_debug.h"
  32. #endif
  33. char ETH_BROADCAST[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  34. char ARP_BROADCAST[6] = {0x0,0x0,0x0,0x0,0x0,0x0};
  35. typedef struct {
  36.    u_long IP_Add;
  37.    u_char MAC_Add[6];
  38.    struct host_list *next;
  39. } host_list;
  40. struct ifreq old_ifr;       // old iface flags
  41. #ifdef LINUX
  42.    char IpForward_status[2];  // old ipforward status
  43. #else
  44.    int IpForward_status;      // old ipforward status
  45. #endif
  46. // protos...
  47. char * Inet_HostName(char *ip);
  48. char * Inet_NameToIp(char *name);
  49. char * Inet_GetMyInfo(char tipo);
  50. char * Inet_MyIPAddress(void);
  51. char * Inet_MyMACAddress(void);
  52. char * Inet_MySubnet(void);
  53. int Inet_HostInLAN(void);
  54. void Inet_Free_list(host_list *head);
  55. host_list *Inet_Host_in_LAN_list(char *interface);
  56. SniffingHost *Inet_NoSniff(void);
  57. void Inet_PutMACinString(char *mac_string, unsigned char *MAC);
  58. void Inet_GetMACfromString(char *mac_string, unsigned char *MAC);
  59. int Inet_Fake_Host(void);
  60. int Inet_CheckSwitch(void);
  61. // Following are architecture dependent !! implementations are in ./src/`uname`/ec_inet_`uname`.c
  62. int Inet_FindIFace(char *iface);
  63. char Inet_CorrectIface(char *iface);
  64. int Inet_GetIfaceInfo(char *iface, int *MTU, char *MyMAC, u_long *IP, u_long *NetMask);
  65. int Inet_SetPromisc(char *iface);
  66. int Inet_OpenRawSock(char *iface);
  67. int Inet_GetRawPacket(int sock, char *buffer, int MTU, short *type);
  68. int Inet_SendRawPacket(int sock, char *buffer, int len);
  69. void Inet_Restore_ifr(void);
  70. void Inet_DisableForwarding(void);
  71. void Inet_RestoreForwarding(void);
  72. char *Inet_MacFromIP(unsigned long ip);
  73. // ----------------------------------------
  74. #ifdef LINUX
  75.    #include "linux/ec_inet_linux.c"    // Architecture dependent implemetation of Inet functions...
  76. #endif
  77. #ifdef FREEBSD
  78.    #include "BSD/ec_inet_BSD.c"
  79. #endif
  80. #ifdef OPENBSD
  81.    #include "BSD/ec_inet_BSD.c"
  82. #endif
  83. // ----------------------------------------
  84. char * Inet_HostName(char *ip)   // returns hostname from ip
  85. {
  86.    struct hostent *host;
  87.    static struct in_addr addr;
  88.    addr.s_addr = inet_addr(ip);
  89.    host = gethostbyaddr((char *)&addr, sizeof(struct in_addr), AF_INET);
  90.    if (host != NULL) return (char *) host->h_name;
  91.    return "Unknown host";
  92. }
  93. char * Inet_NameToIp(char *name) // returns ip from hostname
  94. {
  95.    struct hostent *host;
  96.    static char ip[16];
  97.    host = gethostbyname(name);
  98.    if (host != NULL)
  99.       strncpy(ip, inet_ntoa( *(struct in_addr *) *host->h_addr_list), 16);
  100.    else
  101.       strncpy(ip, "(null)", 16);
  102.    return ip;
  103. }
  104. char * Inet_GetMyInfo(char tipo)
  105. {
  106.    struct in_addr  to_convert;
  107.    u_long IP_Add, NetMask;
  108.    unsigned char MAC_Add[6];
  109.    static char MAC[18];
  110.    static char MySubnet[16];
  111.    static char IP[16];
  112. #ifdef DEBUG
  113.    switch (tipo)
  114.    {
  115.       case 0: Debug_msg("Inet_GetMyInfo IP"); break;
  116.       case 1: Debug_msg("Inet_GetMyInfo MAC"); break;
  117.       case 2: Debug_msg("Inet_GetMyInfo NetMask"); break;
  118.    }
  119. #endif
  120.    Inet_GetIfaceInfo(Options.netiface, NULL, MAC_Add, &IP_Add, &NetMask);
  121.    switch (tipo)
  122.    {
  123.          case 0:  // requesting IP
  124.                   to_convert.s_addr = IP_Add;
  125.                   sprintf(IP, "%s", inet_ntoa(to_convert));
  126.                   return IP;
  127.                   break;
  128.          case 1:  // requesting MAC
  129.                   Inet_PutMACinString( MAC, MAC_Add );
  130.                   return MAC;
  131.                   break;
  132.          case 2:  // requesting netmask
  133.                   to_convert.s_addr = NetMask;
  134.                   sprintf(MySubnet, "%s", inet_ntoa(to_convert));
  135.                   return MySubnet;
  136.                   break;
  137.    }
  138.    return "(none)";
  139. }
  140. char * Inet_MyIPAddress(void)
  141. {
  142.    return Inet_GetMyInfo(0);
  143. }
  144. char * Inet_MyMACAddress(void)
  145. {
  146.    return Inet_GetMyInfo(1);
  147. }
  148. char * Inet_MySubnet(void)
  149. {
  150.    return Inet_GetMyInfo(2);
  151. }
  152. int Inet_HostInLAN()
  153. {
  154.    host_list *list;
  155.    host_list *index;
  156.    int host_alive = 0, k = 0;
  157. #ifdef DEBUG
  158.    Debug_msg("Inet_HostInLANtIface: %s", Options.netiface);
  159. #endif
  160.    list = Inet_Host_in_LAN_list(Options.netiface);
  161.    index = list;
  162.    for( ; index; host_alive++)
  163.       index = (host_list *)index->next;
  164.    if (Host_In_LAN) free(Host_In_LAN);
  165.    Host_In_LAN = (HOST *)calloc(host_alive,sizeof(HOST));
  166.    if (Host_In_LAN == NULL)
  167.       Error_msg("ec_Inet:%d calloc() | ERRNO : %d | %s", __LINE__, errno, sys_errlist[errno]);
  168.    index = list;
  169.    for( ; index; index = (host_list *)index->next)
  170.    {
  171.       struct in_addr to_convert;
  172.       to_convert.s_addr = index->IP_Add;
  173.       sprintf(Host_In_LAN[k].ip,"%s",inet_ntoa(to_convert));
  174.       snprintf(Host_In_LAN[k].name, 128, "%s", Inet_HostName(Host_In_LAN[k].ip));
  175.       Inet_PutMACinString(Host_In_LAN[k].mac, index->MAC_Add);
  176.       k++;
  177.    }
  178.    Inet_Free_list(list);
  179.    return host_alive;
  180. }
  181. void Inet_Free_list(host_list *head)
  182. {
  183.    if (!head) return;
  184.    Inet_Free_list((host_list *) head->next);
  185.    free(head);
  186. }
  187. host_list *Inet_Host_in_LAN_list(char *interface)
  188. {
  189.    int sock, N_hosts, index, MTU;
  190.    u_long NetMask, BroadAdd;
  191.    host_list *head;
  192.    u_char *buf;
  193.    TIME_DECLARE;
  194. #ifdef DEBUG
  195.    Debug_msg("Inet_HostInLAN_list");
  196. #endif
  197.    head = (host_list *)malloc(sizeof(host_list));
  198.    if (head == NULL)
  199.          Error_msg("ec_Inet:%d malloc() | ERRNO : %d | %s", __LINE__, errno, sys_errlist[errno]);
  200.    head->next = NULL;
  201.    sock = Inet_OpenRawSock(interface);
  202.    Inet_GetIfaceInfo(interface, &MTU, head->MAC_Add, &head->IP_Add, &NetMask);
  203.    if (Options.silent) return head;
  204.    N_hosts = ntohl(~NetMask);
  205. #ifdef DEBUG
  206.    Debug_msg("Inet_HostInLAN_list -- netmask 0x%0x  hosts %d", NetMask, N_hosts);
  207. #endif
  208. if (Options.broadping)
  209. {
  210.    BroadAdd = head->IP_Add | (~NetMask);
  211.     buf = Inet_Forge_packet( ETH_HEADER + IP_HEADER + ICMP_HEADER );
  212.     Inet_Forge_ethernet( buf, head->MAC_Add, ETH_BROADCAST, ETH_P_IP );
  213.     Inet_Forge_ip( buf + ETH_HEADER,
  214.                    head->IP_Add,
  215.                    BroadAdd,
  216.                    sizeof(ICMP_header),
  217.                    0xe77e,
  218.                    0,
  219.                    IPPROTO_ICMP );
  220.     Inet_Forge_icmp( buf + ETH_HEADER + IP_HEADER, ICMP_ECHO, 0, NULL, 0 );
  221.     Inet_SendRawPacket(sock, buf, ETH_HEADER + IP_HEADER + ICMP_HEADER);
  222.     Inet_Forge_packet_destroy( buf );
  223. }
  224. else // !broadping
  225. {
  226.     buf = Inet_Forge_packet( ETH_HEADER + ARP_HEADER );
  227.     // frame ethernet header
  228.     Inet_Forge_ethernet( buf, head->MAC_Add, ETH_BROADCAST, ETH_P_ARP );
  229.     for (index=1; index<=N_hosts; index++)
  230.     {
  231.        int dest_ip;
  232.        dest_ip = (head->IP_Add&NetMask)|htonl(index);
  233.        // if dest is equal to me
  234.        if (dest_ip != head->IP_Add)
  235.        {
  236.           // arp request
  237.           Inet_Forge_arp( buf+ETH_HEADER, ARPOP_REQUEST,
  238.                           head->MAC_Add, head->IP_Add,
  239.                           ARP_BROADCAST, dest_ip );
  240.           Inet_SendRawPacket(sock, buf, ETH_HEADER + ARP_HEADER);
  241.        }
  242.        usleep(500);
  243.     }
  244.     Inet_Forge_packet_destroy( buf );
  245. }
  246. #ifdef DEBUG
  247.    Debug_msg("Inet_HostInLAN_list -- listening for replies...");
  248. #endif
  249.    fcntl(sock, F_SETFL, O_NONBLOCK);
  250.    TIME_START;
  251.    buf = Inet_Forge_packet( MTU );
  252. if (Options.broadping)
  253. {
  254. do
  255.     {
  256.        short pkttype;
  257.        int len;
  258.        host_list **index;
  259.        ETH_header *HEther;
  260.        IP_header *HIP;
  261.        TIME_FINISH;
  262.        len = Inet_GetRawPacket(sock, buf, MTU, &pkttype);
  263.        if (len > 0 && pkttype == PACKET_HOST)
  264.        {
  265.           HEther = (ETH_header *) buf;
  266.           if ( ntohs(HEther->type) == ETH_P_IP )
  267.           {
  268.              HIP = (IP_header *)(HEther + 1);
  269.              if (HIP->proto != IPPROTO_ICMP) continue;
  270.              index = &head;
  271. #ifdef DEBUG
  272.    Debug_msg("Inet_HostInLAN_list -- got a reply after %.5f seconds", TIME_ELAPSED );
  273. #endif
  274.              while(*index != NULL && memcmp(&((*index)->IP_Add),&HIP->source_ip,4))
  275.           index = (host_list **)&((*index)->next);
  276.              if (*index == NULL)
  277.              {
  278.       if ( (*index = (host_list *)malloc(sizeof(host_list))) == NULL)
  279.                     Error_msg("ec_inet:%d malloc() | ERRNO : %d | %s", __LINE__, errno, sys_errlist[errno]);
  280.           (*index)->next = NULL;
  281.           memcpy((*index)->MAC_Add, HEther->source_mac, 6);
  282.           memcpy((char *)&((*index)->IP_Add), &HIP->source_ip, 4);
  283.              }
  284.           }
  285.        }
  286.     } while ( TIME_ELAPSED < 1 );
  287. }
  288. else // !broadping
  289. {
  290.     do
  291.     {
  292.        int leng = 0;
  293.        short pkttype;
  294.        host_list **index;
  295.        ETH_header *ethpkt;
  296.        ARP_header *arppkt;
  297.        leng = Inet_GetRawPacket(sock, buf, MTU, &pkttype);
  298.        ethpkt = (ETH_header *)buf;
  299.        arppkt = (ARP_header *)(buf + ETH_HEADER);
  300.        TIME_FINISH;
  301.        if (leng > 0 && pkttype == PACKET_HOST && ethpkt->type == htons(ETH_P_ARP) && arppkt->opcode == htons(ARPOP_REPLY))
  302.        {
  303.           index = &head;
  304. #ifdef DEBUG
  305.    Debug_msg("Inet_HostInLAN_list -- got a reply after %.5f seconds", TIME_ELAPSED );
  306. #endif
  307.           while(*index != NULL && memcmp(&((*index)->IP_Add),arppkt->source_ip,4))
  308.              index = (host_list **)&((*index)->next);
  309.           if (*index == NULL)
  310.           {
  311.              if ( (*index = (host_list *)malloc(sizeof(host_list))) == NULL)
  312.                 Error_msg("ec_inet:%d malloc() | ERRNO : %d | %s", __LINE__, errno, sys_errlist[errno]);
  313.              (*index)->next = NULL;
  314.              memcpy((*index)->MAC_Add, arppkt->source_add, 6);
  315.              memcpy((char *)&((*index)->IP_Add), arppkt->source_ip, 4);
  316.           }
  317.        }
  318.     } while ( TIME_ELAPSED < 1.5 );
  319. }
  320.    Inet_Forge_packet_destroy( buf );
  321.    close(sock);
  322.    return head;
  323. }
  324. SniffingHost *Inet_NoSniff(void)
  325. {
  326.    static SniffingHost *SniffTable=NULL;
  327.    int i, j, len, sock, MTU, SniffTableIndex=0;
  328.    ETH_header  *HEther;
  329.    IP_header *HIP;
  330.    u_char *buf;
  331.    TIME_DECLARE;
  332. #ifdef DEBUG
  333.    Debug_msg("Inet_NoSniff");
  334. #endif
  335.    if (SniffTable) free (SniffTable);
  336.    SniffTable = calloc(number_of_hosts_in_lan, sizeof(SniffingHost));
  337.    memset(SniffTable,0,sizeof(SniffingHost)*number_of_hosts_in_lan);
  338.    sock = Inet_OpenRawSock(Options.netiface);
  339.    Inet_GetIfaceInfo(Options.netiface, &MTU, NULL, NULL, NULL);
  340.    buf = Inet_Forge_packet( ETH_HEADER + IP_HEADER + ICMP_HEADER );
  341.    for (i=0; i<number_of_hosts_in_lan; i++)
  342.    {
  343.       if (inet_addr(Inet_MyIPAddress()) != inet_addr(Host_In_LAN[i].ip))
  344.       {
  345.          char MyMAC[6];
  346.          char DestMAC[6];
  347.          Inet_GetMACfromString(Host_In_LAN[0].mac, MyMAC);
  348.          Inet_GetMACfromString(Host_In_LAN[i].mac, DestMAC);
  349.          Inet_Forge_ethernet( buf, MyMAC, DestMAC, ETH_P_IP );
  350.          Inet_Forge_ip( buf + ETH_HEADER,
  351.                         inet_addr(Host_In_LAN[0].ip),
  352.                         inet_addr(Host_In_LAN[i].ip),
  353.                         sizeof(ICMP_header),
  354.                         0xe77e,
  355.                         0,
  356.                         IPPROTO_ICMP );
  357.          Inet_Forge_icmp( buf + ETH_HEADER + IP_HEADER, ICMP_ECHO, 0, NULL, 0 );
  358.          Inet_SendRawPacket(sock, buf, ETH_HEADER + IP_HEADER + ICMP_HEADER);
  359.          usleep(1000);
  360.       }
  361.    }
  362.    Inet_Forge_packet_destroy( buf );
  363. #ifdef DEBUG
  364.    Debug_msg("Inet_NoSniff -- after ICMP storm");
  365. #endif
  366.    buf = Inet_Forge_packet( MTU );
  367.    fcntl(sock, F_SETFL, O_NONBLOCK);
  368.    TIME_START;
  369.    // Search for strange replies
  370.    do
  371.    {
  372.       short pkttype;
  373.       TIME_FINISH;
  374.       len = Inet_GetRawPacket(sock, buf, MTU, &pkttype);
  375.       if (len > 0 && pkttype == PACKET_HOST)
  376.       {
  377.          HEther = (ETH_header *) buf;
  378.          if ( ntohs(HEther->type) == ETH_P_IP )
  379.          {
  380.             unsigned char MACS[20];
  381.             HIP = (IP_header *)(HEther + 1);
  382.             Inet_PutMACinString(MACS, HEther->source_mac);
  383.             if (HIP->proto != IPPROTO_ICMP) continue;
  384. #ifdef DEBUG
  385.    Debug_msg("Inet_NoSniff -- got a ICMP reply after %.5f seconds", TIME_ELAPSED );
  386. #endif
  387.             for(i=0; i<number_of_hosts_in_lan; i++)
  388.             {
  389.                if ( inet_addr(Host_In_LAN[i].ip ) == HIP->source_ip )
  390.                {
  391.                   if (memcmp(MACS,Host_In_LAN[i].mac,17))
  392.                   {
  393.                      for (j=0; j<number_of_hosts_in_lan; j++)
  394.                         if (!memcmp(MACS, Host_In_LAN[j].mac, 17)) break;
  395.                      SniffTable[SniffTableIndex].Host_Index1=j;
  396.                      SniffTable[SniffTableIndex].Host_Index2=i;
  397.                      SniffTable[SniffTableIndex].mode=1;
  398.                      SniffTableIndex++;
  399.                      break;
  400.                   }
  401.                }
  402.             }
  403.          }
  404.       }
  405.    } while ( TIME_ELAPSED < 3 );
  406.    // Search for strange ARP entries
  407.    for (i=0; i<number_of_hosts_in_lan-1; i++)
  408.       for(j=i+1; j<number_of_hosts_in_lan; j++)
  409.          if (!memcmp(Host_In_LAN[i].mac, Host_In_LAN[j].mac, 17))
  410.          {
  411.             SniffTable[SniffTableIndex].Host_Index1=i;
  412.             SniffTable[SniffTableIndex].Host_Index2=j;
  413.             SniffTable[SniffTableIndex].mode=2;
  414.             SniffTableIndex++;
  415.          }
  416.    Inet_Forge_packet_destroy( buf );
  417.    close(sock);
  418.    return (SniffTable);
  419. }
  420. int Inet_Fake_Host()
  421. {
  422.    unsigned int N_hosts, index, index1=0, index2, base_ip, fake_ip=0;
  423.    unsigned long NetMask;
  424.    Inet_GetIfaceInfo(Options.netiface, NULL, NULL, NULL, &NetMask);
  425.    N_hosts = ntohl(~NetMask);
  426.    base_ip = inet_addr(Host_In_LAN[0].ip)&NetMask;
  427.    for (index=1; index<N_hosts; index++)
  428.    {
  429.       fake_ip = base_ip|htonl(index);
  430.       for (index2=0; index2 < number_of_hosts_in_lan; index2++)
  431.          if (fake_ip == inet_addr(Host_In_LAN[index2].ip))
  432.             break;
  433.       if (index2 == number_of_hosts_in_lan) break;
  434.    }
  435.    if (index1 == N_hosts) return 0;
  436.    return (fake_ip);
  437. }
  438. // 0 - Unknown
  439. // 1 - Hub
  440. // 2 - Switch
  441. int Inet_CheckSwitch()
  442. {
  443.    int link_type=2;
  444.    if (number_of_hosts_in_lan>1)
  445.    {
  446.        int fakeip,destip,sock,MTU,i;
  447.        char MyMAC[6],DestMAC[6];
  448.        char *buf;
  449.        TIME_DECLARE;
  450.        fakeip=Inet_Fake_Host();
  451.        destip=inet_addr(Host_In_LAN[1].ip);
  452.        Inet_GetMACfromString(Host_In_LAN[1].mac, DestMAC);
  453.        sock = Inet_OpenRawSock(Options.netiface);
  454.        fcntl(sock, F_SETFL, O_NONBLOCK);
  455.        Inet_GetIfaceInfo(Options.netiface, &MTU, MyMAC, NULL, NULL);
  456.        Inet_SetPromisc(Options.netiface);
  457.        buf = Inet_Forge_packet(MTU);
  458.        Inet_Forge_ethernet( buf, MyMAC, DestMAC, ETH_P_IP );
  459.        Inet_Forge_ip( buf + ETH_HEADER,
  460.                       fakeip, destip,
  461.                       sizeof(ICMP_header),
  462.                       0xe77e, 0,
  463.                       IPPROTO_ICMP );
  464.        Inet_Forge_icmp( buf + ETH_HEADER + IP_HEADER, ICMP_ECHO, 0, NULL, 0 );
  465.        Inet_SendRawPacket(sock, buf, ETH_HEADER + IP_HEADER + ICMP_HEADER);
  466.        Inet_Forge_ethernet( buf, MyMAC, DestMAC, ETH_P_ARP );
  467.        Inet_Forge_arp( buf+ETH_HEADER, ARPOP_REPLY,
  468.                       DestMAC, fakeip,
  469.                       DestMAC, destip );
  470.        for(i=0; i<5; i++)
  471.        {
  472.            usleep(1000);
  473.            Inet_SendRawPacket(sock, buf, ETH_HEADER + ARP_HEADER);
  474.        }
  475.        TIME_START;
  476.        do
  477.        {
  478.            short type; int len;
  479.            len=Inet_GetRawPacket(sock,buf,MTU,&type);
  480.            TIME_FINISH;
  481.     if (len>0)
  482.     {
  483.         ETH_header *eth;
  484.         eth=(ETH_header *)buf;
  485.         if (!memcmp(DestMAC,eth->dest_mac,6))
  486.         {
  487.        link_type=1;
  488.     break;
  489.         }
  490.     }
  491. }while(TIME_ELAPSED<1);
  492.        free(buf);
  493.        close(sock);
  494.    }
  495.    else return 0;
  496.    Inet_Restore_ifr();
  497.    return link_type;
  498. }
  499. void Inet_GetMACfromString(char *mac_string, unsigned char *MAC)
  500. {
  501.    unsigned int MAC_Add[6];
  502.    int i;
  503.    memset(&MAC_Add, 0, 6);
  504.    i = sscanf(mac_string,"%02X:%02X:%02X:%02X:%02X:%02X",
  505.       (unsigned int *)&MAC_Add[0],(unsigned int *)&MAC_Add[1],(unsigned int *)&MAC_Add[2],
  506.       (unsigned int *)&MAC_Add[3],(unsigned int *)&MAC_Add[4],(unsigned int *)&MAC_Add[5]);
  507.    if (i == 0)
  508.       Error_msg("Incorrect parsing of MAC [%s] !!nIt must be in the form 01:02:03:04:05:06 !!", mac_string);
  509.    for (i=0; i<6; i++)
  510.       MAC[i]=(unsigned char)MAC_Add[i];
  511. }
  512. void Inet_PutMACinString(char *mac_string, unsigned char *MAC)
  513. {
  514.    unsigned int MAC_Add[6];
  515.    int i;
  516.    for (i=0; i<6; i++)
  517.       MAC_Add[i]=(unsigned int)MAC[i];
  518.    sprintf(mac_string,"%02X:%02X:%02X:%02X:%02X:%02X",
  519.       (unsigned int)MAC_Add[0],(unsigned int)MAC_Add[1],(unsigned int)MAC_Add[2],
  520.       (unsigned int)MAC_Add[3],(unsigned int)MAC_Add[4],(unsigned int)MAC_Add[5]);
  521. }
  522. /* EOF */