Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

Пинг UDP-порта   Найти похожие ветки 

 
alexm_hs ©   (2007-02-21 18:28) [0]

Задача, сканер UDP-портов. Есть функция на Indy:

function TfIPScan.ScanUDPPort(_ip_: string; nport: word; timeout: integer): boolean;
var PWS: TIdUDPClient;
 s: string;
begin
 if _ip_ <> "" then begin
   PWS := TIdUDPClient.Create(self);
   try
     PWS.host := _ip_;
     PWS.Port := nport;
     PWS.Send(" ");
     s := PWS.ReceiveString(timeout);
     result := true;
     PWS.free;
   except
     result := false;
     PWS.free;
   end;
 end else result := false;
end;

Но вот беда. В части случаев ищет правильно, а в части (на некоторых хостах) - выдает все порты подряд (т.е. 1,2,3,4...). Что может быть не так?


 
Сергей М. ©   (2007-02-22 08:20) [1]


> Пинг UDP-порта


Нет здесь никакого "пинга".

Пинг - это просто широкоизвестное имя программы (PING.ЕХЕ = Packet INternet Gopher), использующей для проверки доступности хостов (а не портов !) протокол ICMP, коим в твоем коде и не пахнет.


> выдает все порты подряд


Кто выдает-то ?


 
SlymRO   (2007-02-22 08:33) [2]

UDP детектируются не гарантированно и по косвенным признакам типа ICMP_PortUnreachable, но их не каждый узел тебе вернет...
Или детектируются порты с сервисом который по протоколу обязан ответить


 
alexm_hs ©   (2007-02-23 16:57) [3]

Под словом "ПИНГ" я подразумевал именно обнаружение неработоспособности удаленного хоста, на котором, доподлинно известно, должен быть открыт искомый порт. Пример работает в части случаев. Вот только Некоторые хосты присылают ответ, что типа сканируемый порт открыт. Хотя на самом деле он закрыт.


 
Сергей М. ©   (2007-02-26 12:01) [4]


> Хотя на самом деле он закрыт


Ну и причем тут "неработоспособность хоста" ?

Мало ли какие порты он не открыл ! Это же вовсе не говорит о том, что хост "неработоспособен" ..

А еще и файрволы к тому же существуют.


 
alexm_hs ©   (2007-02-28 20:37) [5]

дело в том, что я точно знаю, что такой-то порт открыт. Например UDP:161 - на нем SNMP-агент висит. Так вот, задавая диапазон сканирования UDP портов данного хоста с 1 по 200 й к примеру, я получаю, что открыт 1,2,3,4,5...199,200. И это происходит на части хостов. Другая я же часть верно откликается только на 161. Я пробовал разные сканеры - на всех хостах отрабатывает нормально - показывают только те, кот действительно открыты (161 например). Дело в моем коде. Вот я и спрашиваю, как правильно определить, что порт UDP не открыт.


 
alexm_hs ©   (2007-02-28 20:43) [6]


> А еще и файрволы к тому же существуют.


если бы файрвол даже был бы включен - так сканирование ни к чему не результативному не привело - т.е. ни один порт бы не нашелся. У меня обратная проблема - находятся лишние "открытые" порты. Причем, видно, что это "лажа" т.к. из диапазона от 1 до 1000 не могут быть открыты все сразу.


 
Сергей М. ©   (2007-03-01 08:24) [7]


> задавая диапазон сканирования UDP портов данного хоста с
> 1 по 200 й к примеру, я получаю, что открыт 1,2,3,4,5...
> 199,200


Я не понимаю, с какого перепугу служба, например, на 199-м порту обязана "понимать" посылаемую тобой пустую строку, да еще и отвечать (!) на твой посыл именно строкой (!), а не чем-то иным..

Поясни свою логику ...


 
Rouse_ ©   (2007-03-01 11:29) [8]


> с какого перепугу служба, например, на 199-м порту обязана
> "понимать" посылаемую тобой пустую строку, да еще и отвечать
> (!) на твой посыл именно строкой (!), а не чем-то иным..
>

Сергей, тут все хуже :)
    s := PWS.ReceiveString(timeout);
    result := true;

У него функция возвращает валидный результат после таймаута или если не поднялось исключение (а откуда ему там взяться)? :)


 
Сергей М. ©   (2007-03-01 11:45) [9]


> Rouse_ ©   (01.03.07 11:29) [8]


> тут все хуже


Ну это само собой ляп)


 
alexm_hs ©   (2007-03-01 22:13) [10]

Попробуйте сами этот пример. Он работает :) Но для эксперимента его можно попробовать так же на выключенном или не существующем хосте - рез-т будет что я и говорил - все порты подряд.


> или если не поднялось исключение (а откуда ему там взяться)?
>  :)


Таки берется ведь! Я не настаиваю, но предлагаю попробовать. Делов-то на 5 мин. На включенных хостах пример работает. А вот на выкл - исключения не возникает и возвращается пустая строка. Соотв. вопрос, тем кто знает: ПОЧЕМУ выключенный или несуществующий хост возвращает строку и отправка этой строки данному хосту не вызывает исключение?


 
alexm_hs ©   (2007-03-01 22:23) [11]


> с какого перепугу служба, например, на 199-м порту обязана
> "понимать" посылаемую тобой пустую строку, да еще и отвечать
> (!) на твой посыл именно строкой (!), а не чем-то иным..
>


Почему  же службы

137 (netbios-ns) UDP
138 (netbios-dgm) UDP
161 (snmp) UDP
445 (microsoft-ds) UDP
500 (isakmp) UDP

к примеру все-таки отвечают на пустую строку? Порты, открытые этими службами найдены именно этим примером


 
SlymRO ©   (2007-03-02 04:59) [12]

На недоступный порт сервер должен послать ICMP type:Destination Unreachable code:Port Unreachable
Если пришел пришел такой пакет ВинСок может сгенерить эксепшн сокету. Если такого пакета или эксепшина нет то отправка UDP может считаться состоявшейся т.е. порт вероятно открыт.


 
Сергей М. ©   (2007-03-02 10:10) [13]


> Почему  же службы


> к примеру все-таки отвечают на пустую строку?


Да нифига они не отчечают.
Какой м.б. ответ на галиматью в запросе ?
По таймауту ReceiveString возвращает управление, и это вовсе нельзя назвать ответом.


 
alexm_hs ©   (2007-03-02 17:32) [14]


> По таймауту ReceiveString возвращает управление, и это вовсе
> нельзя назвать ответом.


интересно получается, что каждый раз при отправке пустой строки (не пустой, кстати, а пробела) одним и тем же портам (137,138 161,445, 500) возвращается управление после ReceiveString  и result принимает значение true, а все посыл остальным портам той же строки вызывает исключение. Закономерность чтоль по Вашему?


 
alexm_hs ©   (2007-03-02 17:36) [15]


> На недоступный порт сервер должен послать ICMP type:Destination
> Unreachable code:Port Unreachable
> Если пришел пришел такой пакет ВинСок может сгенерить эксепшн
> сокету. Если такого пакета или эксепшина нет то отправка
> UDP может считаться состоявшейся т.е. порт вероятно открыт.
>


уже что-то. Есть направление. А конкретную реализацию не подскажете? Т.е. я так понял, лучше всего самому пакет собирать и сокет открывать?


 
Сергей М. ©   (2007-03-05 13:47) [16]


> не пустой, кстати, а пробела


Да по барабану, хоть пустая хоть пробел !
Есть такое понятие - "протокол прикладного информационного обмена", и если для конкретного сервиса он не подразумевает запросов вида "пустая строка" или "пробел", то строки с таким содержимым и есть галиматья, на которую конкретный сервис отвечать НЕ обязан.


> Закономерность чтоль по Вашему?


Конечно закономерность !

Не активен (или не доступен) конкретный порт на заведомо доступном хосте ? Заполучи исключение !



Страницы: 1 вся ветка

Текущий архив: 2007.11.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
2-1192539115
фыва
2007-10-16 16:51
2007.11.11
TCheckListBox


15-1191931910
YuriKoltsov
2007-10-09 16:11
2007.11.11
Кодировка


8-1168871218
olegnik
2007-01-15 17:26
2007.11.11
сжатия изображения bitmap.


15-1191840512
allrussia
2007-10-08 14:48
2007.11.11
"Кракозябры" при вставке из буфера


2-1192781260
Abcdef123
2007-10-19 12:07
2007.11.11
Как грамотрее написать вот такой код