ПРОСТЕЙШИЙ СКАНЕР

изучаем исходник 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]

Назад на стр. 023-052-1  Содержание  Вперед на стр. 023-052-3