Создаем собственный сканер IP адресов

Создаем собственный сканер IP адресов Примеры скриптов и макросов для Word и WSH

Всем привет, с вами автор блога 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 адресов в сети – приступаем к программированию

Создание сканера 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 адресов и портов в сети

сканер IP - внешний вид

Скачать архив с примером

Хотелось бы обратить ваше внимание, что на одном ІР-шнике может работать несколько служб (сервисов или приложений, называйте как хотите), каждая будет использовать свой порт (прописывается в конце после двоеточия), если вы просто введете айпишник в браузере, то фактически отправите запрос на 80 порт, но, как я сказал, на других портах тоже что то может быть. Наш IP сканер адресов фактически отправляет HTTP запрос на 80 порт – работу с HTTP протоколом можно изучить в статье «Штурмуем протокол HTTP — методы, заголовки и запросы«. Для анализа остальных портов я в следующей статье напишу пример сканера портов, поэтому подписывайтесь на новые стать, что бы быть всегда в курсе и всегда первым, удачи вам.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий