Всем привет, с вами автор блога scriptcoding.ru. В этой статье мы рассмотрим, как можно программным путем создать собственный сканер IP адресов.
IP сканер – это, как правило, некая программа, которая позволяет определить наличие работающей службы или сервиса в заданном диапазоне. IP сканеры, как правило, используются для анализа определенной сети, например, можно просканировать изнутри локальную сеть, или диапазон ІР адресов, выделенных провайдеру. Прежде чем приступить к рассмотрению данной статьи, давайте посмотрим, что именно в ней будет рассмотрено:
- Вкратце я расскажу про IP адреса.
- Познакомимся с ActiveX компонентами WindowSystemObjectи XMLHTTP.
- Рассмотрим исходный программный код скрипта для сканера IP адресов на языке программирования JScript и проведем его анализ.
- В конце, я немного затрону тему «Сканер портов«.
И так, давайте продолжим…
IP сканер сети — немного про интернет адреса…
Прежде чем приступать к написанию сканера IP адресов, давайте немного вспомним теорию. В четвертой версии ІР протокола (IPv4) каждый адрес состоит из 4 байт (1 байт равен 8 битам), в простом варианте это 4 десятичных числа (от 0 до 255), которые разделенные между собой точками. Если вспомнить уроки информатики, то увидим, что 2 в 8 степени ровно 256, так как у нас 4 байта (4 по 8 бит ровно 32 бита), то общие число возможных комбинаций ровно: 2 в 32 степени – 4294967296 комбинаций. Так как количество вариаций не бесконечно, то сейчас уже используется версия IPv6. Но, старые ІР никто не отменял, поэтому и сценарий будет рассчитан на версию IPv4. Более подробно, данную тему и работу интернета в целом я рассмотрел в статье — «Как работает интернет»
Сканер IP адресов — пакуем сумку с компонентами
Для работы нашего сценария нам понадобятся всего два компонента.
- XMLHTTP – позволит нам отправлять HTTP запросы на заданный ІР, если ошибки не возникнет (то есть, скрипт получит ответ на отправленный запрос), то мы заносим данный хост в список.
- WindowSystemObject – данный компонент позволяет создавать форму для сценария Windows Script Host, плюс, в нем есть одно преимущество – метод CreateIPAddress который позволит добавить на форму форматированные поля для ввода ІР.
Сканер IP адресов в сети – приступаем к программированию
Давайте для начала посмотрим на программный код в общем, а потом его разберем. Открываем редактор Notepad++ и прописываем строки кода, файл сохраним под именем ip_scaner.js.
// *********************************************************** // IP сканер сети // ip_scaner.js // *********************************************************** var wso, f, MSG, ListBox, IPAddress1, IPAddress2, Button; // Создаем экземпляр объекта WindowSystemObject wso = new ActiveXObject("Scripting.WindowSystemObject"); // Задаем начальные размеры и отступы f = wso.CreateForm(0,0,0,0); with(f){ //Задаем через свойства ширину и высоту ClientWidth = 500; ClientHeight = 400; //Центрируем форму CenterControl(); //Заголовок окна Text = "Сканер ip адресов в сети" //нельзя менять размеры SizeGrip = false; //нельзя развернуть форму MaximizeBox = false; } MSG="Сайт: scriptcoding.ru \nАвтор:Владимир Баталий \nПоиск производится по последним двум байтам"; f.TextOut(10,10,MSG); // Компонент список ListBox = f.CreateListBox(5,80,300,300); f.TextOut(320,80,"Начальный ІР адрес:"); // Компонент для ввода ІР IPAddress1 = f.CreateIPAddress(320,100,150,25); IPAddress1.Text="195.225.228.0"; f.TextOut(320,140,"Конечный ІР:"); IPAddress2 = f.CreateIPAddress(320,160,150,25); IPAddress2.Text="195.225.228.178"; Button = f.CreateButton(320,200,75,25,"Поиск"); // Вызов функции searchIP после нажатия на кнопку Button.OnClick = searchIP; //метод делает форму видимой f.Show(); wso.Run(); //Собственно, функция определяющая работу IP сканера function searchIP(){ var timer=0, ip_list="", i, j, host, inc, fromIP, toIP, iFrom, iTo, jFrom, jTo, browser; Wscript.Echo("Начинаем сканирование!!!"); //Преобразуем начальный IP в массив, разделителем является точка romIP=IPAddress1.Text.split("."); //Преобразуем конечный IP в массив, разделителем является точка toIP=IPAddress2.Text.split("."); //Переменная ІР хранит первые два байта IP=fromIP[0]+"."+fromIP[1]; iFrom=fromIP[2]; //Начальный третий байт iTo=toIP[2]; //Конечный третий байт jFrom=fromIP[3]; //Начальный четвертый байт jTo=toIP[3]; //Конечный четвертый байт browser = new ActiveXObject("MSXML2.XMLHTTP"); //Цикл, в котором IP сканер сети перебирает адреса for (i=iFrom; i<=iTo; i++){ for (j=jFrom; j<=jTo; j++){ host=IP+"."+i+"."+j; browser.open("GET","http://"+host, false); timer++; try{ inc=0; browser.send(null); }catch(e){ if (e!=0){ inc=1; } } if (inc==0){ ip_list+="\n"; //Добавляем найденный хост в список ListBox.Add(host); ip_list+=host; //Записываем список хостов в файл write_data(ip_list); } if (timer==50){ WScript.echo("IP сканер прошел 50 адресов, нажмите ОК для продолжения, текущий IP: "+host); timer=0; } } } WScript.echo("IP сканер сети завершил работу!!!!"); } //Функция, отвечающая за запись списка в файл function write_data(data){ var FSO=WScript.CreateObject ("Scripting.FileSystemObject"); var F=FSO.CreateTextFile("ip_scan.txt", true); F.WriteLine(data); F.Close (); } |
Начнем с конца, в нашем сценарии есть переменная timer, значение которой обнуляется после каждых найденных 50 хостов, при желании вы можете ее убрать, она является счетчиком для информирования пользователя о том, что уже пройдено 50 адресов. Ошибка обрабатывается с помощью конструкции try … catch. Перед отправкой запроса переменная inc ровна 0, если ошибка возникнет, то inc присваивается 1. Как вы уже догадались, список будет наполняться только тогда, если inc ровно 0. Сканер IP адресов в сети будет записывать список с результатом работы в файл ip_scan.txt и в текстовое поле на форме. Сам скрипт использует два цикла для перебора диапазона, то есть, третий и четвертый байт.
Теперь рассмотрим немного сам программный код, точнее его синтаксис. Обратите внимание, что для подключения внешних классов мы использовали как внутреннюю функцию ActiveXObjectязыка JSCRIPT, так и метод CreateObjectкласса WScript, в данном случае особой разницы нет. Обработка начальных и конечных байт происходит в цикле FOR, в котором задается диапазон для начального и конечного четвертого и третьего байта. Текстовый файл будет создан в текущем каталоге с помощью метода CreateTextFile класса FileSystemObject.
Сканер IP адресов и портов в сети
Хотелось бы обратить ваше внимание, что на одном ІР-шнике может работать несколько служб (сервисов или приложений, называйте как хотите), каждая будет использовать свой порт (прописывается в конце после двоеточия), если вы просто введете айпишник в браузере, то фактически отправите запрос на 80 порт, но, как я сказал, на других портах тоже что то может быть. Наш IP сканер адресов фактически отправляет HTTP запрос на 80 порт – работу с HTTP протоколом можно изучить в статье «Штурмуем протокол HTTP — методы, заголовки и запросы«. Для анализа остальных портов я в следующей статье напишу пример сканера портов, поэтому подписывайтесь на новые стать, что бы быть всегда в курсе и всегда первым, удачи вам.