fronik

Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Я тут маленький скриптик накатал, который пингует сеть и по таблице ARP смотрит кто менял IP адреси или MAC адреса. Но как обычно везде есть подводные камни. Таблица ARP не проверяет реальность IP мака, т.е. если нарушитель сменил IP адрес, то в таблице ARP получаются два разных IP адреса с одинаковым MAC адресом, до тех пор пока он не сменит свой IP обратно или на какойнибудь другой. В связи с этим мне удалось отсеевать только свежие подставные IP адреса. Т.е. если человек сменил IP1 на IP2, то скрипт переодически (раз в цыкл) кидает сообщение в файлик, что IP1 был заменен на IP2. Но если он вернет себе IP обратно, то скрипт это не фиксирует. Лишь перестают падать алерты в файлик о смене IP1 на IP2. Я не програмист, по этому по голове чур не бить, кидаю скрипт как есть, наверняка найдуться умные люди кто сможет устранить и этот недочет. Или я в будущем устраню если найду способ, пока работаю над этим. А нет - и суда нет. Хочу также напомнить, что время цикла установлено в "0" потомучто время пинга сети занимает около 4 минут. Может кому пригодиться, я в своей сети только запустил на тестирование. Cкопируйте код в текстовый файлик и переименуйте его в IP-MAC_Detect_v1.2.vbs Код: Dim WshShell, fso, oFileOut, OutFile, I1, I2, txtStream, IP_MAC, ping, Lines1, Lines2, X, WARNING, Hiden, Auto, ExitScript, Scan, Pause Dim IP(99999), MAC(99999), IP_NEW(99999), MAC_NEW(99999) ExitScript = 0 Auto = 1 Scan = "192.168.0" pause = 1 SmartARP = 0 I=0 SmartARPFile = "SmartARP.bat" ScanLocalFile = "scan_local.bat" ConfigFile = "Config.ini" Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set WshShell = WScript.CreateObject("WScript.Shell") '------------------------------------------------------------------------------------ ' Запускаем цикл в котором будем пинговать нашу сетку с таймаутом и вести учет '------------------------------------------------------------------------------------ Do While Not ExitScript = 1 If (fso.FileExists(ConfigFile)) = False Then Set oFileOut = fso.OpenTextFile (ConfigFile, 2, True) WriteFile = "# Пауза между повторами сканирования сети. в минутах." & VbCrLf & _ "Pause 0" & VbCrLf & _ "" & VbCrLf & _ "# Переменная отвечающая за завершение скрипта. 0-работает, 1-выход." & VbCrLf & _ "Exit 0" & VbCrLf & _ "" & VbCrLf & _ "# Режим сканирования сети, 0-использует редактированый батник, 1-использует свои настройки (батник затирается)." & VbCrLf & _ "Auto 1" & VbCrLf & _ "" & VbCrLf & _ "# Область сети для сканирования. ""A.B.C"". D - всегда находится в диаппазоне от 1 до 254" & VbCrLf & _ "Scan 192.168.0" & VbCrLf oFileOut.WriteLine WriteFile oFileOut = 0 ConfigFile = "" End If '------------------------------------------------------------------------------------ ' Подгружаем некоторые настройки из файла '------------------------------------------------------------------------------------ InFile = "config.ini" Set txtStream = fso.OpenTextFile(InFile) Do While Not(txtStream.AtEndOfStream) LineRead = txtStream.ReadLine If Mid(LineRead, 1, 5) = "Pause" Then pause = Mid(LineRead, 6) + 0 If Mid(LineRead, 1, 4) = "Exit" Then ExitScript = Mid(LineRead, 5) + 0 If Mid(LineRead, 1, 4) = "Scan" Then Scan = Mid(LineRead, 5) Loop '------------------------------------------------------------------------------------ ' Я ненашел более аптимального способа быстро получить ARP таблицы локальной сети ' если у вас есть утилита, с помощью которой через командную строку можно быстро ' послать запросы на диаппазон IP адресов, то вы можете использовать ее в батнике. ' В батнике вы можете добавлять свои операции сканирования диаппазонов, не удаляя при ' этом ARP запросы. Если батник удалить, то он будет создан снова. '------------------------------------------------------------------------------------ If (fso.FileExists(ScanLocalFile)) = False Then Set oFileOut = fso.OpenTextFile (ScanLocalFile, 2, True) I=0 For I=1 To 254 WriteFilePing = WriteFilePing & "ping " & Scan & "." & I & " -n 1 -w 500" & VbCrLf Next WriteFilePing = WriteFilePing & "arp -a > arp.Log" & VbCrLf WriteFilePing = WriteFilePing & "arp -d *" oFileOut.WriteLine WriteFilePing oFileOut = 0 WriteFilePing = "" End If '------------------------------------------------------------------------------------ ' Запускаем пинг локальной сети. '------------------------------------------------------------------------------------ WshShell.Run ScanLocalFile, 0, True '------------------------------------------------------------------------------------ ' Сливаем полученный arp ответ в массив и делаем сверку старого массива IP и MAC ' адресов с новым массивом IP и MAC адресов. При обнаружении разниц в IP или MAC ' адресе скидываем предупреждение в переменную WARNING '------------------------------------------------------------------------------------ I2=1 Lines2 = 0 InFile = "arp.Log" Set txtStream = fso.OpenTextFile(InFile) Do While Not(txtStream.AtEndOfStream) LineRead = txtStream.ReadLine If Mid(LineRead, 4, 1) = "." Or Mid(LineRead, 5, 1) = "." Or Mid(LineRead, 6, 1) = "." Then If Mid(LineRead, 25, 17) <> "00-00-00-00-00-00" Then IP_NEW(I2) = Mid(LineRead, 3, 15) MAC_NEW(I2) = Mid(LineRead, 25, 17) I2 = I2+1 Lines2 = Lines2 + 1 End If End If Loop For I = 1 To Lines1 For I2 = 1 To Lines2 If MAC(I) <> "00-00-00-00-00-00" And MAC_NEW(I2) <> "00-00-00-00-00-00" Then If IP(I) <> IP_NEW(I2) Then If MAC(I) = MAC_NEW(I2) Then WARNING = WARNING & Date & "/" & Time & " - IP: " & IP(I) & " >> " & IP_NEW(I2) & " MAC: " & MAC(I) & VbCrLf MAC_NEW(I2) = "00-00-00-00-00-00" End If End If End If If MAC(I) <> "00-00-00-00-00-00" And MAC_NEW(I2) <> "00-00-00-00-00-00" Then If MAC(I) <> MAC_NEW(I2) Then If IP(I) = IP_NEW(I2) Then WARNING = WARNING & Date & "/" & Time & " - MAC: " & MAC(I) & " >> " & MAC_NEW(I2) & " IP: " & IP(I) & VbCrLf End If End If End If Next Next '------------------------------------------------------------------------------------ ' После сверки массивов, удаляем старый массив и сливаем в него новый. '------------------------------------------------------------------------------------ IP_MAC = "" Lines1 = 0 I2=1 For I2=1 To Lines2 IP(I2) = IP_NEW(I2) MAC(I2) = MAC_NEW(I2) IP_MAC = IP_MAC & IP(I2) & " - " & MAC(I2) & VbCrLf Lines1 = Lines1 + 1 Next '------------------------------------------------------------------------------------ ' Сливаем в файл накопительную переменную IP_MAC '------------------------------------------------------------------------------------ OutFile = "IP_MAC.Log" Set oFileOut = fso.OpenTextFile (OutFile, 2, True) oFileOut.WriteLine IP_MAC oFileOut = 0 '------------------------------------------------------------------------------------ ' Сливаем в файл накопительную переменную WARNING '------------------------------------------------------------------------------------ OutFile = "WARNING.Log" Set oFileOut = fso.OpenTextFile (OutFile, 2, True) oFileOut.WriteLine WARNING oFileOut = 0 '------------------------------------------------------------------------------------ ' Запускаем таймаут на длительность указанную в файле конфигурации pause. '------------------------------------------------------------------------------------ Pause = Pause * 60 * 1000 'Переводим минуты в милисекунды для функции Sleep WScript.Sleep Pause Loop WScript.Quit |
| Всего записей: 439 | Зарегистр. 26-07-2004 | Отправлено: 20:21 11-04-2005 | Исправлено: fronik, 20:25 11-04-2005 |
|