Весёлый Молочник
18.05.2008, 15:18
TCP сканирование подключением.
Самый простой и старый способ проверить открыт порт или нет. Мы с вами напишем простой сканер на С для Linux.
При таком способе сканирования сканер проводит полностью процедуру подключения (handshake) SYN, SYN/ACK и ACK. Для выполнения такого соединения существует функция connect() и возвращает 0 если соединение выполнено успешно, т.е. порт открыт.
Если это так то мы вызываем функцию getservbyport() которая возвращается информацию о службе, работающей на данном порту.
Функция getservbyport() возвращает структуру типа servent, в которой поле s_name содержит официльное имя службы. Если эта функция вернёт , значит она не смогла определить службу работающюю на этом порту. Тогда мы выводим напротив номера порта (unknown).
В первом аргументе вводим адрес сканируемого хоста, во втором с какого порта начинать сканирование в третьем до какого порта сканировать.
Компилируем стандартным образом:
#gcc tcpscan.c -o tcpscan
anton@anton-laptop:~$ ./tcpscan smilex.8-12.ru 80 80
Running scan…
Open: 80 (www)
Вот сам исходник сканера.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
int main(int argc, char *argv[])
{
int sd;
struct hostent* hp;
struct sockaddr_in servaddr;
struct servent *srvport;
int port, portlow, porthigh;
if (argc != 4) {
fprintf(stderr, “Usage: %s <address> <portlow> <porthigh>\n”, argv[0]);
exit(-1);
}
hp = gethostbyname(argv[1]);
if (hp == NULL) {
herror(”gethostbyname() failed”);
exit(-1);
}
portlow = atoi(argv[2]);
porthigh = atoi(argv[3]);
fprintf(stderr, “Running scan…\n”);
for (port = portlow; port <= porthigh; port++)
{
if ( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror(”socket() failed”);
exit(-1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr = *((struct in_addr *)hp->h_addr);
if (connect(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == 0) {
srvport = getservbyport(htons(port), “tcp”);
if (srvport == NULL)
printf(”Open: %d (unknown)\n”, port);
else
printf(”Open: %d (%s)\n”, port, srvport->s_name);
fflush(stdout);
}
close(sd);
}
printf(”\n”);
return 0;
}
Скачать можно с моего репозитория svn://it.icmp.ru:5557/milkyway
Там помимо этого храниться исходники Linux и видео плеер на Java.
Обсудить здесь (http://linux.ya1.ru/forum/index.php?topic=41.0).
Самый простой и старый способ проверить открыт порт или нет. Мы с вами напишем простой сканер на С для Linux.
При таком способе сканирования сканер проводит полностью процедуру подключения (handshake) SYN, SYN/ACK и ACK. Для выполнения такого соединения существует функция connect() и возвращает 0 если соединение выполнено успешно, т.е. порт открыт.
Если это так то мы вызываем функцию getservbyport() которая возвращается информацию о службе, работающей на данном порту.
Функция getservbyport() возвращает структуру типа servent, в которой поле s_name содержит официльное имя службы. Если эта функция вернёт , значит она не смогла определить службу работающюю на этом порту. Тогда мы выводим напротив номера порта (unknown).
В первом аргументе вводим адрес сканируемого хоста, во втором с какого порта начинать сканирование в третьем до какого порта сканировать.
Компилируем стандартным образом:
#gcc tcpscan.c -o tcpscan
anton@anton-laptop:~$ ./tcpscan smilex.8-12.ru 80 80
Running scan…
Open: 80 (www)
Вот сам исходник сканера.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
int main(int argc, char *argv[])
{
int sd;
struct hostent* hp;
struct sockaddr_in servaddr;
struct servent *srvport;
int port, portlow, porthigh;
if (argc != 4) {
fprintf(stderr, “Usage: %s <address> <portlow> <porthigh>\n”, argv[0]);
exit(-1);
}
hp = gethostbyname(argv[1]);
if (hp == NULL) {
herror(”gethostbyname() failed”);
exit(-1);
}
portlow = atoi(argv[2]);
porthigh = atoi(argv[3]);
fprintf(stderr, “Running scan…\n”);
for (port = portlow; port <= porthigh; port++)
{
if ( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror(”socket() failed”);
exit(-1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr = *((struct in_addr *)hp->h_addr);
if (connect(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == 0) {
srvport = getservbyport(htons(port), “tcp”);
if (srvport == NULL)
printf(”Open: %d (unknown)\n”, port);
else
printf(”Open: %d (%s)\n”, port, srvport->s_name);
fflush(stdout);
}
close(sd);
}
printf(”\n”);
return 0;
}
Скачать можно с моего репозитория svn://it.icmp.ru:5557/milkyway
Там помимо этого храниться исходники Linux и видео плеер на Java.
Обсудить здесь (http://linux.ya1.ru/forum/index.php?topic=41.0).