// Include #include #include #include #include #include #include void usage() { fprintf(stderr, "Usage: hwchanger iface mac\n"); exit(EXIT_FAILURE); } // Affiche l'adresse d'une interface void get_hwaddr(char *ifname, struct ifreq *ifr) { int sock; unsigned char mac[6]; memset(ifr,0,sizeof(struct ifreq)); strcpy(ifr->ifr_name, ifname); if (!(sock = socket(AF_INET, SOCK_DGRAM, 0))) exit(EXIT_FAILURE); if (ioctl(sock, SIOCGIFHWADDR, ifr) < 0) { fprintf(stderr, "get_hwaddr ioctl échoue : %s\n", strerror(errno)); exit(EXIT_FAILURE); } close(sock); memcpy(mac, ifr->ifr_hwaddr.sa_data, 6); printf("Interface : %s\n", ifname); printf("Adresse MAC : %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); } // Modifie l'adresse de l'interface void set_hwaddr(char *ifname, char *hwaddr, struct ifreq *ifr) { int sock; char mac[6]; int t; strcpy(ifr->ifr_name, ifname); // Récupère la mac address if (sscanf (hwaddr, "%2x:%2x:%2x:%2x:%2x:%2x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) < 6) { usage(); exit(1); } // Copie l'adresse dans la structure for (t=0; t<6; t++) ifr->ifr_hwaddr.sa_data[t] = mac[t]; if (!(sock = socket(AF_INET, SOCK_DGRAM, 0))) exit(EXIT_FAILURE); if (ioctl(sock, SIOCSIFHWADDR, ifr) < 0) { fprintf(stderr, "ioctl échoue : %s\n", strerror(errno)); exit(EXIT_FAILURE); } close (sock); } int main (int argc, char *argv[]) { struct ifreq ifr; char *interface = argv[1]; char *mac_addr = argv[2]; if (argc != 3) usage(); // Affiche l'adresse de l'interface get_hwaddr(interface, &ifr); // Modifie l'adresse de l'interface set_hwaddr(interface, mac_addr, &ifr); printf("Adresse MAC modifiée.\nNouvelle adresse MAC...\n"); // Affiche la nouvelle adresse de l'interface get_hwaddr(interface, &ifr); return EXIT_SUCCESS; }