/*==================================================================== UDP SCAN Ver1.00 The Shadow Penguin Security (http://shadowpenguin.backsection.net) Written by UNYUN (unewn4th@usa.net) ==================================================================== */ #include #include #include #define SRC_PORT 10101 int main(int argc, char *argv[]) { struct icmphdr *icmp_header; struct sockaddr_in target_info; int target_info_len; fd_set read_fd; int scan_port; char recvbuf[5000]; struct sockaddr_in target_addr; int icmp_socket; int udp_socket; if (argc!=3){ printf("[usage] %s [TargetIP] [TargetPort] \n",argv[0]); return -1; } icmp_header = (struct icmphdr *)(recvbuf+sizeof(struct iphdr)); scan_port = atoi(argv[2]); target_addr.sin_family = AF_INET; target_addr.sin_addr.s_addr = inet_addr(argv[1]); target_addr.sin_port = htons(scan_port); if ((udp_socket=socket(AF_INET,SOCK_DGRAM,0))==-1){ printf("UDP Socket Creation Error.\n"); return -1; } if ((icmp_socket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))==-1){ printf("RAW Socket Creation Error.\n"); return -1; } sendto(udp_socket,NULL,0,0,(void *)&target_addr,sizeof(target_addr)); FD_ZERO(&read_fd); FD_SET(icmp_socket,&read_fd); select(FD_SETSIZE,&read_fd,NULL,NULL,NULL); for (;;){ if (FD_ISSET(icmp_socket,&read_fd)){ target_info_len = sizeof(target_info); recvfrom(icmp_socket,recvbuf,5000,0, (struct sockaddr *)&target_info,&target_info_len); if (target_info.sin_addr.s_addr == target_addr.sin_addr.s_addr && icmp_header->type == 3 && icmp_header->code<=12){ printf("Port %d : Close\n",scan_port); exit(1); } } } return(0); }