Приветствую, читатель.
Сегодня мы напишем простой однопоточный сканер TCP-портов в 50 строк.
Главная его особенность состоит в том, что для его создания нам понадобится только блокнот и операционная система*.
В штатную поставку каждой Windows NT входит скриптовый хост WSH (Windows Script Host) с интерпретаторами VBScript и JScript.
Доступ ко множеству вкусностей ОС нам предоставит основанная на COM централизованная подсистема WMI.
В ней есть недокументированный MSDN'ом класс для сетевой диагностики «NetDiagnostics», с ним-то и сварим кашу.
[code]'*****************************************************************************************
'* Name: PortScaner
'* Language: VBScript
'* CommandLine: PortScaner.vbs [[host[=localhost]] portStart[=7] portEnd]
'* Description: Сканер открытых TCP-портов и диапазонов портов.
'************************************************************************************
'* CopyLeft: kiber_punk, 19 spt 2011
'*************************************************************************************
SELECT CASE wsh.arguments.count
CASE 0: MSGBOX «USAGE:» & VBCR & «cscript.exe PortScaner.vbs [host] port» & VBCR &_
«cscript.exe PortScaner.vbs [host] portStart portEnd»,,«Port-scaner»
WSH.Quit
CASE 1:
host=«localhost»
port=WSH.ARGUMENTS(0)
CASE 2:
host=WSH.ARGUMENTS(0)
port=WSH.ARGUMENTS(1)
CASE 3:
PoprtRange = (WSH.ARGUMENTS(2) — WSH.ARGUMENTS(1))
REDIM port(PoprtRange)
host = WSH.ARGUMENTS(0)
j=0
FOR i = WSH.ARGUMENTS(1) TO WSH.ARGUMENTS(2)
port(j)=i
j=j+1
NEXT
END SELECT
set wmi = GetObject («winmgmts:NetDiagnostics»).instances_
'----прозвон единственного порта----
if NOT IsArray(port) THEN
FOR EACH net IN wmi
res = net.ConnectToPort ( host ,port)
if (res) THEN wscript.echo (host &": "& port)
next
else
'----проверка диапазона----
FOR EACH net IN wmi
for each p in port
res = net.ConnectToPort (host ,p)
IF (res) THEN
wscript.echo (host & ": " & p & " GOOD")
ELSE
wscript.echo (host &": "& p)
END IF
next
NEXT
end if
[/code]
Можно сканить как диапазон, так единственный порт.
Код скрипта предельно ясен и в случае чего легко допиливается под нужды пользователя.
Запускать его лучше через консольный интерпретатор, по понятным причинам.
Вывод можно перенаправить во внешний файл, например:
[quote]
cscript PortScaner.vbs ya.ru 75 200 > c:\ipports.txt
cscript PortScaner.vbs 127.0.0.1 135
[/quote]
* после XP/2k3 класс исчез из внутреннего CIM-репозитория Windows.
Скорее всего, его заменили более совершенным, но поковыряться в более молодых ОС у меня нет возможности.