/*** * hs_lookup.c * author: k0t aka dr0zd714 aka varkon * e-mail: varkonom@gmail.com * site: http://varkon.biz * for hackersoft.ru */ #ifdef WIN32 || WIN64 #pragma comment(lib,"ws2_32.lib") #include #else #include #include #include #include #include #include #endif #include /*** * * lookup_addr_indx() * */ #define BUF_SIZE 4092 int lookup_addr_indx(int indx, unsigned int *addr) { #ifdef WIN32 || WIN64 LPSOCKET_ADDRESS_LIST list = NULL; SOCKET sc = 0; char buf[BUF_SIZE]; int len = 0; int ret = 0; sc = socket(AF_INET, SOCK_RAW, IPPROTO_IP); if(sc == INVALID_SOCKET){ return (-1); } ret = WSAIoctl(sc, SIO_ADDRESS_LIST_QUERY, NULL, 0, buf, BUF_SIZE, (unsigned long *)&len, NULL, NULL); closesocket(sc); if(ret != 0 || len <= 0){ return(-2); } list = (LPSOCKET_ADDRESS_LIST) buf; if(list->iAddressCount <=0){ return (-3); } for(int i = 0; i <= indx && i < list->iAddressCount; ++i){ //нашли адрес if(i == indx){ memcpy(addr, &list->Address[i].lpSockaddr->sa_data[2],4); return (1); } } //адресов не осталось return (0); #else struct ifconf ifc; struct ifreq *ifr = NULL; char buf[BUF_SIZE]; int ret = 0; int off = 0; int cnt = 0; int cdx = 0; int sc = 0; sc = socket(AF_INET, SOCK_DGRAM, 0); if(sc < 0){ return (-1); } ifc.ifc_len = BUF_SIZE; ifc.ifc_buf = buf; ret = ioctl(sc, SIOCGIFCONF, &ifc); if(ret <0){ return (-2); } ifr = ifc.ifc_req; while(cnt < ifc.ifc_len && cdx <= indx){ if(ifr->ifr_addr.sa_family == AF_INET){ if(cdx == indx){ memcpy(addr, &ifr->ifr_addr.sa_data[2], 4); return (1); } ++cdx; } off = IFNAMSIZ + ifr->ifr_addr.sa_len; cnt += off; ((char*) ifr) += off; } close(sc); #endif return (0); } int main(void) { #ifdef WIN32 || WIN64 WSADATA wsa; #endif struct in_addr ia; unsigned int addr = 0; int ret = 0; int idx = 0; #ifdef WIN32 || WIN64 memset(&wsa, 0x0, sizeof(WSADATA)); if(WSAStartup(MAKEWORD(2, 0), &wsa) != 0x0){ printf("WSAStartup error! \n"); return (1); } #endif while(1){ ret = lookup_addr_indx(idx, &addr); if(ret < 0){ printf("lookup_addr_indx error. Code %d \n", ret); return (1); } else if(ret == 0){ break; } ia.s_addr = addr; printf("address %d: %s\n", idx, inet_ntoa(ia)); ++idx; printf("End list address. Seach %d\n", idx); return (0); } }