
[ Простейший сканер портов или Учимся работать с WinSocket’ами ]
Date: 3.01.02
Привет, хацкер!!!
Вот и пришло время научится писать проги под сеть.
Сразу хочу оговориться, что этот сканер не будет делать ничего, кроме как проверять,
открыт ли порт, и делать это он будет наипримитивнейшим образом. Это потому, что он
Простейший сканер портов, а цель этой статьи не в написании суперпуперсканера.
Цель этой статьи в том, чтобы показать тебе основные принципы работы с так называемыми
сокетами.
Вполне естественно, что я не буду сейчас вдаваться во все тонкости и хитрости
программирования сокетов, ты всегда сможешь самостоятельно надыбать дополнительную
литературу с исчерпывающими ответами на возникшие у тебя вопросы. Слава Богу, в сети
такой литературы предостаточно.
Ну что ж, приступим.
Программировать сокеты можно на любых языках программирования и под любой(почти)
операционной системой. Вообще понятие сокетов пришло в винду (я имею в виду МАСТДАЙ)
из UNIX'а. А так как основным языком программирования под юникс является C, то и
будет, я считаю, целесообразнее писать на С(я имею в виду писать проги для сети).
Конечно, ярые поклонники Паскаля(к коим и я принадлежу) могут писать
и на нем(в смысле Паскале) (я по прежнему говорю о программировании под сеть), но как
мне кажется Delphi(а именно с этой средой разработки сейчас у многих ассоциируется
Паскаль) предназначена для написания тяжелых приложений с большим количеством форм
и т.д. А вот утилиты(к коим и относятся сканеры портов) следует(это чисто мое мнение)
писать на С++. Как уже все догадались, писать мы будем под МАСДАЙ, и поэтому
воспользуемся VC++(честно говоря у меня только этот С под рукой и есть).
Создаем новый проект консольного приложения, делаем все как обычно, только
вместо Win32 Application и в поле Project name выбираем Win32 Console Application.
Добавляем к нашему проекту Source File и копируем в него нижеследующий исходник:
#include
#include
void main(int argc,char *argv[])
{
WSADATA wsa;
SOCKET s;
SOCKADDR_IN a;
int error,p_start,p_end;
p_start = atoi(argv[2]);
p_end = atoi(argv[3]);
WSAStartup(0x0101,&wsa);
a.sin_family = AF_INET;
a.sin_addr.s_addr = inet_addr(argv[1]);
for(int i=p_start;i<=p_end;i++)
{
s = socket(AF_INET,SOCK_STREAM,0);
a.sin_port = htons(i);
error = connect(s,(struct sockaddr*)&a,sizeof a);
if(error == -1)
printf("Порт %d закрыт\n",i);
else
{
printf("Порт %d открыт\n",i);
shutdown(s,2);
closesocket(s);
}
}
WSACleanup();
}
В настройках проекта нужно добавить библиотеку для работы с сокетами:
wsock32.lib или ws2_32.lib. Далее компиляем и готово.
Программа работает с параметрами из командной строки и при запуске должна иметь
три параметра:
1) IP-адрес сканируемой машины
2) Номер порта-начала сканируемого диапазона.
3) Номер порта-окончание сканируемого диапазона.
Например: easyscan.exe 127.0.0.1 20 30
Хочется сразу сказать, что программа лишена многих проверок на ошибки.
Это сделано для краткости кода и вполне естественно, что при написании нормальных
программ необходимо учитывать все возможные ошибки.
Что ж, теперь разберемся с программой построчно.
#include
Для работы с сокетами нужно подключить соответствующий заголовочный
файл, это winsocket.h
WSADATA wsa;
SOCKET s;
SOCKADDR_IN a;
Это указатели на соответствующие структуры, с ними мы разберемся ниже.
int error,p_start,p_end;
Еще несколько переменных.
p_start = atoi(argv[2]);
p_end = atoi(argv[3]);
Итак, p_start будет содержать начало сканируемого диапазона,
а p_end(естественно) его окончание.
WSAStartup(0x0101,&wsa);
В процессе инициализации приложение должно зарегистрировать себя в библиотеке
WSOCK32.DLL , которая предоставляет приложениям интерфейс Windows Sockets в среде
операционных систем Microsoft Windows 95 и Microsoft Windows NT. В wsa будут
записаны сведения о конкретной реализации интерфейса Windows Sockets.
a.sin_family = AF_INET;
a.sin_addr.s_addr = inet_addr(argv[1]);
Для работы с адресами в формате Internet используется структура SOCKADDR_IN.
Поле sin_family определяет тип адреса. Ты должн записать в это поле значение AF_INET,
которое соответствует типу адреса, принятомув Internet.
В sin_addr указывается IP адрес с которым будет работать сокет.
s = socket(AF_INET,SOCK_STREAM,0);
С помощью этой функции создается сокет. Первый параметр определяет формат адреса.
Для этого параметра ты должн указывать значение AF_INET , что соответствует формату
адреса, принятому в Internet. Следующие два параметры определяют, соответственно тип
сокета и протокол, который будет использован для данного сокета. Подробнее об этих
параметрах я расскажу как ни будь позже.
a.sin_port = htons(i);
Поле sin_port определяет номер порта, который будет использоваться для передачи данных.
error = connect(s,(struct sockaddr*)&a,sizeof a);
Это самая главная строчка программы, мы пытаемся подключиться к текущему(в цикле) порту
удаленной машины. Если нам это удалось, то порт открыт.
(Кстати, корректнее сказать, функция connect создает канал связи с сервером)
WSACleanup();
Перед тем, как завершить свою работу, приложение должно освободить ресурсы,
полученные у операционной системы для работы с Windows Sockets.
Я думаю, что остальные строки кода в комментариях не нуждаются.
Вот, пожалуй, я и показал, как работать с сокетами в КЛИЕНТ-приложениях(пока
без передачи и приема данных). Кто не желает останавливаться на достигнутом, вперед!
Читайте соответствующую литературу. А кому лень, ждите, когда у меня дойдут руки до
следующих статей.
Успехов!
Drakula     [KODSWEB]
!!! Статья является собственностью команды KODSWEB !!!
!!! Любое распространение без нашего разрешения строго запрешено !!!
|