Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: <<<-Basura->>> en 18 Septiembre 2011, 20:49 pm



Título: MAC address
Publicado por: <<<-Basura->>> en 18 Septiembre 2011, 20:49 pm
Hola estuve googleando XD y no he conseguido nada así que pregunto aquí, me podrían ayudar, es que ando buscando cual función es capaz de devolverme la MAC address de mi NIC, en C


Título: Re: MAC address
Publicado por: madpitbull_99 en 18 Septiembre 2011, 20:58 pm
Hay varios métodos, los que menciono funcionan en Windows, desconozco si en las demás plataformas también.

1.) Con el comando getmac, se la pasas a la función system() y después parseas el resultado.

2.) Mediante WinAPI. Usando NDIS  (http://msdn.microsoft.com/en-us/library/ff566707.aspx)[Ethernet (http://msdn.microsoft.com/en-us/library/ff548869.aspx)]. Otro tema similar: Get Mac Address.
 (http://stackoverflow.com/questions/221894/c-get-mac-address-of-network-adapters-on-vista)



Título: Re: MAC address
Publicado por: El_Java en 18 Septiembre 2011, 23:22 pm
En Ubuntu puedes usar "sudo iwconfig" o "sudo ifconfig 'nombre interfaz' | grep HW", pero claro, tienes que sacar de ahi la info que te interese


Título: Re: MAC address
Publicado por: <<<-Basura->>> en 20 Septiembre 2011, 06:07 am
es que estoy leyendo y digamos con los sockets puedes crear paquetes y hay funciones para obtener tu dirección IP también, pero lo que andaba buscando era una función para obtener la dirección MAC, si se puede para linux :S,

Sin tener que llamar al system


Título: Re: MAC address
Publicado por: madpitbull_99 en 20 Septiembre 2011, 14:33 pm
No hay ninguna función que devuelva directamente la dirección MAC. Tienes que hacerlo por tu cuenta.

Código
  1. #include <sys/ioctl.h>
  2. #include <net/if.h>
  3. #include <unistd.h>
  4. #include <netinet/in.h>
  5. #include <string.h>
  6.  
  7. int main()
  8. {
  9.    ifreq ifr;
  10.    ifconf ifc;
  11.    char buf[1024];
  12.    int success = 0;
  13.  
  14.    int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  15.    if (sock == -1) { /* handle error*/ };
  16.  
  17.    ifc.ifc_len = sizeof(buf);
  18.    ifc.ifc_buf = buf;
  19.    if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */ }
  20.  
  21.    ifreq* it = ifc.ifc_req;
  22.    const ifreq* const end = it + (ifc.ifc_len / sizeof(ifreq));
  23.  
  24.    for (; it != end; ++it) {
  25.        strcpy(ifr.ifr_name, it->ifr_name);
  26.        if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
  27.            if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
  28.                if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
  29.                    success = 1;
  30.                    break;
  31.                }
  32.            }
  33.        }
  34.        else { /* handle error */ }
  35.    }
  36.  
  37.    unsigned char mac_address[6];
  38.  
  39.    if (success) memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);
  40. }

Éste es otro ejemplo:

Código
  1. #include <sys/socket.h>
  2. #include <sys/ioctl.h>
  3. #include <linux/if.h>
  4. #include <netdb.h>
  5. #include <stdio.h>
  6.  
  7. int main()
  8. {
  9.  struct ifreq s;
  10.  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
  11.  
  12.  strcpy(s.ifr_name, "eth0");
  13.  if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
  14.    int i;
  15.    for (i = 0; i < 6; ++i)
  16.      printf(" %02x", (unsigned char) s.ifr_addr.sa_data[i]);
  17.    puts("\n");
  18.    return 0;
  19.  }
  20.  return 1;
  21. }

Los he sacado todos de StackOverflow:

_How to get MAC address of your machine using a C program? (http://stackoverflow.com/questions/1779715/how-to-get-mac-address-of-your-machine-using-a-c-program)
_How to get mac address for an interface in linux using a C Program? (http://stackoverflow.com/questions/1519585/how-to-get-mac-address-for-an-interface-in-linux-using-a-c-program)
_Detecting MAC Address using C application (http://adywicaksono.wordpress.com/2007/11/08/detecting-mac-address-using-c-application/)



Título: Re: MAC address
Publicado por: <<<-Basura->>> en 21 Septiembre 2011, 22:42 pm
madpitbull_99 aunque no lo hayas hecho tu, encontraste algo que yo había buscado durante días eres de gran ayuda  :D