Доброго времени суток всем читателям блога scriptcoding.ru. В данной статье, я опишу «Сканер портов», точнее его реализацию с помощью языка программирования JScript.
Сканер портов, фактически, тот же сканер IP адресов, только там, мы исследовали диапазон хостов на предмет открытого 80 порта, а тут будем исследовать все остальные открытые порты. Я решил разделить публикацию на две части, сначала, немного теории, а далее, собственно, сам сценарий «Сканер портов» и пояснения к нему, и так, приступим.
Сканер портов – немного теории
Вообще, по теме сетевого взаимодействия (IP адреса, сокеты, протоколы и так далее) я напишу отдельные статьи, где все подробно разъясню. А так, как цель данной публикации – написать собственный порт сканер, то я затрону лишь верхушку айсберга. На каждом компьютере может работать не одна, а несколько программ (служб), которые предназначены для приема/отправки данных по сети (интернету), так, одна программа отвечает за работу сайта, на который вы часто заходите, вторая позволяет вам отправлять электронные письма, третья – лицезреть через веб камеры, что делают ваши сотрудники в офисе. Все вроде прекрасно, но есть одна загвоздка – IP адрес всего один.
Когда на ваш компьютер приходят данные, то в них не указано, какой службе они предназначены, зато в них прописан порт, а уже по нему понятно, что именно и кто должен обработать. Так, ваш браузер по умолчанию отправляет запрос на 80 порт, но вы и сами можете его задать, он прописывается после имени хоста или ip адреса через двоеточие (например, 195.225.224.11:21), но тут есть один подвох – интернет протоколы. Если порт обрабатывается протоколом типа HTTP, HTTPS или FTP, то проблем нет, но если на сервере работает почтовая служба, которая требует совсем другой протокол, то простым браузером уже не подключится. В статье «Штурмуем протокол HTTP» я описал его основную архитектуру и написал сценарий, который позволяет на практике посмотреть как происходит диалог вида клиент-сервер, советую почитать. Также можете почитать статью «Как работает интернет«.
Хорошо, вступительное слово мы прошли, теперь стоит перейти к написанию программного кода для сканера портов. Программный код написан на языке JSCRIPT и работает под управлением сервера Windows Script Host.
Пишем скрипт «Сканер портов»
Для нашего создания порт сканера, мы будем использовать компонент для сетевых взаимодействий WinHttpRequest, есть и другие с похожей логикой, так, для ip сканера я использовал MSXML2.XMLHTTP, так как у них фактически одинаковые методы и свойства, для их описания я написал отдельную статью «Компоненты для создания HTTP запроса«, советую тоже ознакомиться. Что бы наш сценария для сканера заданных портов имел привлекательный вид, я использовал компонент WindowsSystemObject для создания формы.
Теперь немного про логику работы сканера портов по IP. Сначала, мы задаем ip адрес для анализа, далее, в цикле FOR будет происходить отправка HTTP данных на заданные порты, нам придется сделать два блока для обработки ошибок:
- Первый – будет обрабатывать ошибки, возникшие при отправке данных на закрытый порт.
- Второй – будет перехватывать ошибки, которые возникнут при попытке отправить HTTP запрос на открытый (действующий) порт, но требующий отличного от HTTP протокола.
В отдельной функции будет происходить запись открытых портов в текстовый файл, также, в сканере портов будет происходить вывод информации в текстовое поле.
Хорошо, а теперь давайте посмотрим на наш сценарий:
// *********************************************************** // Сканер портов // port_scaner.js // *********************************************************** var wso, f, MSG, t, ListBox, IPAddress, port1, port2, Button; //Создаем экземпляр объекта WindowSystemObject wso = new ActiveXObject("Scripting.WindowSystemObject"); //Задаем начальные размеры и отступы f = wso.CreateForm(0,0,0,0); with(f){ //Задаем через свойства ширину и высоту ClientWidth = 500; ClientHeight = 400; //Центрируем форму CenterControl(); //Заголовок окна Text = "Порт сканер"; //нельзя менять размеры SizeGrip = false; //нельзя развернуть форму MaximizeBox = false; MSG="Автор:Владимир Баталий"; t = f.CreateHyperLink(10,10,250,20,"scriptcoding.ru"); TextOut(10,30,MSG); } //Компонент список ListBox = f.CreateListBox(5,80,300,300); f.TextOut(320,80,"IP адрес:"); //Компонент для ввода ip адреса IPAddress = f.CreateIPAddress(320,100,150,25); IPAddress.Text="195.225.228.0"; f.TextOut(320,140,"Диапазон портов:"); port1 = f.CreateEdit(320,160,50,20,wso.Translate("ES_MULTILINE")); //Задаем тип вводимых данных port1.DataType=wso.Translate("DT_INTEGER"); port1.Text="800"; port2 = f.CreateEdit(380,160,50,20,wso.Translate("ES_MULTILINE")); port2.DataType=wso.Translate("DT_INTEGER"); port2.Text="1024"; Button = f.CreateButton(320,200,75,25,"Поиск") //Вызов функции searchPort после нажатия на кнопку Button.OnClick = searchPort; //метод делает форму видимой f.Show(); wso.Run(); //Собственно, функция определяющая работу сканера портов по IP function searchPort(){ var timer=0, port_list="", ini="", fromPort, toPort, IP, browser; WScript.Echo("Сканер портов по IP начинает работу!"); //Начальный port fromPort=wso.Translate(port1.Text); //Конечный port toPort=wso.Translate(port2.Text); IP=IPAddress.Text; browser = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); //Цикл в котором сканер портов перебирает заданный диапазон for (i=fromPort; i<=toPort; i++){ host=IP+":"+i; try{ //Если порт не поддерживается HTTP протоколом ini=0; browser.open("GET","http://"+host, false); }catch(err){ if (err!=0){ port_list+="\n"; ListBox.Add(host); port_list+=host; //Записываем список в текстовый файл write_data(port_list); ini=1; } } timer++; try{ if (ini==0){ inc=0; browser.send(null); } }catch(e){ if (e!=0){ inc=1;} } if (inc==0){ port_list+="\n"; //Добавляем найденный хост в список ListBox.Add(host); port_list+=host; //Записываем список в текстовый файл write_data(port_list); } if (timer==100){ WScript.echo("Сканер обработал100 портов, нажмите ОК для продолжения, текущий IP: "+host); timer=0; } } WScript.echo("Порт сканер завершил свою работу!!!!"); } //Функция, отвечающая за запись списка в файл function write_data(data){ var FSO, F; FSO=WScript.CreateObject ("Scripting.FileSystemObject"); F=FSO.CreateTextFile("port_scan.txt", true); F.WriteLine(data); F.Close (); } |
Если вы посмотрите на программный код, то увидите, что в блоке «if (timer==100){…}» происходит проверка количества пройденных циклов, при проходе 100 циклов (можно менять) будет выводиться сообщение, можете включить данный блок на свое усмотрение. Функция CreateEditотвечает за добавление на форму текстового поля, его тип определяется параметром ES_MULTILINE, через свойство DataTypeмы определяем тип вводимых данных, в данном случае только целые числа (DT_INTEGER). Для ввода IP адреса в сканере портов используется функция CreateIPAddress. Также стоит обратить внимание на строки fromPort=wso.Translate(port1.Text); и toPort=wso.Translate(port2.Text);, тут используется метод Translate, не знаю почему, но без него некоторые диапазоны не хотели проверяться, в справке говорится: «Метод переводит строку текста Text в значение Data«, довольно скудное объяснение, ну да ладно, главное, что сканер портов работает, тестируйте и подписывайтесь на новые публикации блога…