#include #include #include #include #include #include #include #include #include #include void die() { exit(EXIT_FAILURE); } int main(int argc, char **argv) { int sock; char errbuf[PCAP_ERRBUF_SIZE], *dev = NULL; bpf_u_int32 network, netmask; struct in_addr netmask_ip, network_ip; struct ifreq hw; if(argc < 2) { if((dev = pcap_lookupdev(errbuf)) == NULL) die(printf("[!] %s\n",errbuf)); printf("[+] No device passed as argument, using default device: %s\n",dev); } if(dev == NULL) dev = strdup(argv[1]); if(pcap_lookupnet(dev,&network,&netmask,errbuf) == -1) /* per avere netmask e network facilmente */ die(printf("[!] %s\n",errbuf)); if((sock = socket(AF_INET,SOCK_STREAM,0))<0) /* socket per comunicare con ioctl */ die(printf("[!] %s\n",strerror(errno))); memcpy(hw.ifr_name,dev,strlen(dev)); /* Nome dell'interfaccia di rete in hw.ifr_name */ hw.ifr_addr.sa_family = AF_INET; /* Utilizza la famiglia di indirizzi di tipo AF_INET */ if((ioctl(sock,SIOCGIFHWADDR,&hw)) == -1) /* Richiesta: SIOCGIFHWADDR, per avere il MAC in hw.ifr_hwaddr.sa_data[14] */ die(printf("[!] %s\n",strerror(errno))); netmask_ip.s_addr = netmask; /* lo diamo in pasto ad una struct in_addr per la inet_ntoa successiva */ network_ip.s_addr = network; /* ^ */ printf("%s\nMAC: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\nNetmask: %s\n", dev, (unsigned int) hw.ifr_hwaddr.sa_data[0], (unsigned int) hw.ifr_hwaddr.sa_data[1], (unsigned int) hw.ifr_hwaddr.sa_data[2], (unsigned int) hw.ifr_hwaddr.sa_data[3], (unsigned int) hw.ifr_hwaddr.sa_data[4], (unsigned int) hw.ifr_hwaddr.sa_data[5], inet_ntoa(netmask_ip)); printf("Network: %s\n",inet_ntoa(network_ip)); close(sock); free(dev); return EXIT_SUCCESS; }