ПРОСТЕЙШИЙ СКАНЕР изучаем исходник scan.c Спецвыпуск Xakep, номер #023, стр. 023-052-2 int err; int i; int net; struct sockaddr_in sa; /* Объявление переменных, используемых при чтении файла */ FILE *ptr; char buf1[100]; int c; char *temp1; char *temp2; /* Открытие текстового файла listofports.dat. */ ptr = fopen("listofports.dat", "r"); if (ptr == NULL) { perror("listofports.dat"); /* Если такого файла нет, то программа сообщает об ошибке, не забудь качнуть этот файл и поместить его в рабочую директорию. */ exit(1); } /* Проверка, правильно ли введен адрес */ if (argc != 2) { printf("Usage: %s hostname\n", argv[0]); exit(1); } /* Вся информация о портах храниться в файле listofports. Когда программа находит на теле жертвы открытый порт, она подбирает к нему описание из файла. Чтобы удобнее было использовать информацию, из файла мы записываем ее в виде дерева, по которому ползаем указателями. Этот кусочек кода отвечает за засасывание инфы из файла в дерево. */ while ((c = fgetc(ptr)) != EOF) /* двигаем указатель до конца файла (End Of File, EOF)*/ { fgets(buf1, 100, ptr); temp1 = strchr(buf1, MARK); temp2 = temp1; while (*temp2 != ' ') /*Двигаем указатель до пробела*/ { temp2--; } temp1++; if ((*temp1 == 't') || (*temp1 == 'T')) i = atoi(temp2); else i = -1; /* Если порт готов, начинаем сканирование! */ if (i>-1){ strncpy((char *)&sa, "", sizeof sa); sa.sin_family = AF_INET; /* Для сканирования портов сканеру нужно указать айпишник жертвы. А можно указать URL. То есть сканер понимает имя на нормальном человеческом языке с точечьками типа: www.plohoy_host.ru. Этот кусок кода отвечает за определение IP адреса по URL */ if (isdigit(*argv[1])) sa.sin_addr.s_addr = inet_addr(argv[1]); else if ((host = gethostbyname(argv[1])) != 0) /* получение IP по имени хоста*/ strncpy((char *)&sa.sin_addr, (char *)host->h_addr,sizeof sa.sin_addr); else { herror(argv[1]); exit(1); } /* Преобразуем вычисленный номер порта в удобный для использования вид */ sa.sin_port = htons(i); /* Открываем сокет.*/ net = socket(AF_INET, SOCK_STREAM, 0); if (net < 0) { perror("\nsocket failed in creation"); /* Если сокет не открывается, сообщаем об ошибке*/ exit(1); } err = connect(net, (struct sockaddr *) &sa, sizeof sa); /* Лазаем указателем по дереву и находим описание для порта, который желает открыться. Если ты не забыл, в дерево мы записывали информацию из файла с описанием портов. */ if (err < 0) { printf("%s %-5d %s\r", argv[1], i, strerror(errno)); /* Не открывается! Ошибочка :( */ fflush(stdout); } else { /* Если порт все-таки открылся, то печатаем на экране его номер с описанием, взятым из дерева. */ printf("%s %-5d accepted. \n", argv[1], i); /* Вывод номера порта, над которым работает программа. */ printf("Possible Interface/Process: %s\n", temp1); if (shutdown(net, 2) < 0) { perror("\nshutdown failed"); exit(1); } } /* Ну и конечно нужно закрыть сокет. */ close(net); }} printf(" \r"); fflush(stdout); } КУСОЧЕК ФАЙЛА listofport.dat tcpmux 1/tcp TCP Port Service Multiplexer [MKL] |