
27.10.2018, 14:47
|
|
Новичок
Регистрация: 05.08.2018
Сообщений: 0
С нами:
4091032
Репутация:
0
|
|
Приветствую всех читателей!
Начну с того, а зачем изобретать велосипед, если их уже куча написана? Все мы понимаем, что велосипеды разные - чёрные, белые, красные )))
Когда я посмотрел примеры многопоточных сканеров, то понял, что большая часть из них имеет диапазон типа
Код:
for port in range(1,100):
, значит перебор портов будет с 1 по 99. Если мне понадобится порт например 20000, то при попытке записи
Код:
]for port in range(1,20001):
сканер загнётся от переполнения памяти и невозможности создания нового потока.
Сканеры же, имеющий подобранные порты типа [21, 22, 23, 25, 38, 43, и т.д. были однопоточными, и работали весьма медленно...
В итоге я решил собрать новый велосипед из старых запчастей. Я хотел следующее:
1) Простой короткий код
2) Многопоточность
3) Указания нужных портов
Погнали:
Подключаем модуль threading для работы с потоками. Подключаем модуль socket для работы с сокетами (интерфейс для обеспечения обмена данными между процессами)
Python:
Код:
import
threading
import
socket
Вводим хост для сканирования
Python:
Код:
print
(
'-'
*
35
)
target
=
input
(
'Enter host:\n\n'
)
print
(
'-'
*
35
)
Создаём функцию сканирования портов, в которой создаём сокет, и выставляем таймаут
Python:
Код:
def
portscan
(
port
)
:
s
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_STREAM
)
s
.
settimeout
(
0.5
)
Продолжаем функцию, добавляем в блоке обработки исключений попытку приконнектиться к хосту, и в случае соединения, пишем что порт открыт. Открытое соединение закрываем. Ставим оператор-заглушку pass, в случае отсутствия соединения, ничего не выполняем.
Python:
Код:
try
:
connection
=
s
.
connect
(
(
target
,
port
)
)
print
(
'Port :'
,
port
,
"is open."
)
connection
.
close
(
)
except
:
pass
Пишем список портов (можете добавить любые по желанию).
Python:
Код:
ports
=
[
21
,
22
,
23
,
25
,
38
,
43
,
80
,
109
,
110
,
115
,
118
,
119
,
143
,
# Список портов
194
,
220
,
443
,
540
,
585
,
591
,
1112
,
1433
,
1443
,
3128
,
3197
,
3306
,
4000
,
4333
,
5100
,
5432
,
6669
,
8000
,
8080
,
9014
,
9200
]
Ну вот и подошли к самому главному и интересному.
Делаем следующую запись, в которой мы запускаем перебор в цикле портов, создаём и запускаем потоки.
Python:
Код:
for
element
in
ports
:
t
=
threading
.
Thread
(
target
=
portscan
,
kwargs
=
{
'port'
:
element
}
)
t
.
start
(
)
input
(
)
Рассмотрим подробнее, что происходит в этом блоке
Для этого я пошагово запустил скрипт в Pycharm. Хост взял наобум из сети, поэтому я его закрасил. Смотрим внимательнее на скрин - когда у нас шаг прошёл создание потока, появилась надпись, в которой мы видим инициализацию нового потока. Значит всё работает как надо.
На следующем шаге поток запустился.
Если в потоке поставленная задача выполнена, то он останавливается
Результат работы программы наглядно показывает, что потоки закрываются не в том порядке, что открывались. То есть они действительно работают параллельно. На каждый порт запускается отдельный поток. В процессе сканирования, количество потоков разное, взависимости от количества уже отработанных потоков.
На моём стареньком компе 2010 года и модемной связи от сотового оператора, скрипт выполняется за мгновенье.
Получилось всё как было задумано.
Исходный код с подробными комментариями
|
|
|

31.10.2018, 11:41
|
|
Новичок
Регистрация: 25.04.2017
Сообщений: 0
С нами:
4763401
Репутация:
0
|
|
привет, подскажите пожалуйста как запустить данный код, с-под винды 7? в каком формате файл сохранить?
|
|
|

31.10.2018, 12:21
|
|
Новичок
Регистрация: 05.08.2018
Сообщений: 0
С нами:
4091032
Репутация:
0
|
|
Anonimyc сказал(а):
привет, подскажите пожалуйста как запустить данный код, с-под винды 7? в каком формате файл сохранить?
Любой код Python сохраняется с расширением py. Копируете код, вставляете в блокнот и сохраняете, например portscan.py
Для запуска программы должен быть установлен Python3 и поставлены зависимости Пуск --> Выполнить --> cmd.exe:
pip install socket
pip install threading
Потом можно запускать двойным кликом по программе.
|
|
|

20.08.2020, 20:59
|
|
Новичок
Регистрация: 07.08.2020
Сообщений: 0
С нами:
3035929
Репутация:
0
|
|
explorer сказал(а):
pip install socket
pip install threading
Потом можно запускать двойным кликом по программе.
Указанные модули являются стандартными, их установка - не нужна.
По-моему, это основы языка.
|
|
|

20.08.2020, 22:51
|
|
Новичок
Регистрация: 05.08.2018
Сообщений: 0
С нами:
4091032
Репутация:
0
|
|
Моя_ПреЛесТь сказал(а):
Указанные модули являются стандартными, их установка - не нужна.
По-моему, это основы языка.
Спасибо за внимательность, странно что никто ранее не заметил. Конечно не нужно, видимо я на автомате написал, много раз в разных темах про установку модулей одно и тоже спрашивали.
|
|
|

20.08.2020, 20:53
|
|
Новичок
Регистрация: 07.08.2020
Сообщений: 0
С нами:
3035929
Репутация:
0
|
|
explorer сказал(а):
В итоге я решил собрать новый велосипед из старых запчастей. Я хотел следующее:
1) Простой короткий код
2) Многопоточность
3) Указания нужных портов
Этот код - не работает.
Здесь нет многопоточности.
У пользователя нет возможности указать номера портов, а также адрес цели.
Предоставленный автором скрипт - не более чем тест на внимательность, а не сканер портов.
|
|
|

20.08.2020, 23:25
|
|
Новичок
Регистрация: 07.08.2020
Сообщений: 0
С нами:
3035929
Репутация:
0
|
|
explorer, беда вашего кода не в импортировании библиотек, а в отсутствии всего трёх знаков:
строку
connection = s.connect((target, port))
надо заменить:
connection = s.connect_ex((target, port))
Метод - connect_ex
Но и это не всё )
Вы не вложили в него свою душу.
Вы написали его так, как ученик пишет контрольную работу. Написали, сдали и легко вздохнули. - Нет "защиты от дурака",
- Пользователю не предоставлена возможность выбора портов и целей.
- Где изысканность мышления ?
Я - гастербайтер.
Если-бы гастербайтеры делали свою работу так, как пишут код некоторые пРагРамМысТЫ, то люди жили-бы в руинах.
|
|
|

21.08.2020, 15:47
|
|
Новичок
Регистрация: 05.05.2019
Сообщений: 0
С нами:
3697991
Репутация:
0
|
|
Моя_ПреЛесТь сказал(а):
надо заменить:
Почему вы используете утверждение " надо"?
Смотрим доки
socket.connect_ex(address)
Like connect(address), but return an error indicator instead of raising an exception for errors returned by the C-level connect() call (other problems, such as “host not found,” can still raise exceptions). The error indicator is 0 if the operation succeeded, otherwise the value of the errno variable. This is useful to support, for example, asynchronous connects.
Главное отличие - вместо исключения при неудачном подключении, мы получаем обычный int.
Какого-то иного смысла в код программы это изменение не вносит.
Исключение обрабатывалось изначально.
explorer сказал(а):
Python:
Код:
try
:
connection
=
s
.
connect
(
(
target
,
port
)
)
print
(
'Port :'
,
port
,
"is open."
)
connection
.
close
(
)
except
:
pass
Моя_ПреЛесТь сказал(а):
Cenzor воплотил в коде аналогичную Вашему коду многопоточность, использовал ООП и тот-же метод (я считаю - не совсем корректный метод ), а также использовал модули: - argparse - для ввода аргументов , как в nmap
- tqdm - для вывода работы скрипта в виде прогресс-бара.
А с чего вы решили, что любая программа должна писаться в ООП стиле?
При чём тут необходимость ввода аргумента, если код автора может быть использован в каком-то ином скрипте/программе, где аргументы могут передаваться иными способами.
Моя_ПреЛесТь сказал(а):
Но и это не всё )
Вы не вложили в него свою душу.
Вы написали его так, как ученик пишет контрольную работу. Написали, сдали и легко вздохнули. - Нет "защиты от дурака",
- Пользователю не предоставлена возможность выбора портов и целей.
- Где изысканность мышления ?
Ну что за ересь? В названии статьи где-то есть упоминание о финальном коммерческом продукте для конечного пользователя?
Автор предложил своё видение реализации, вот и всё.
Требовать от него чего-то ещё, как минимум неприлично.
Хочется - реализуйте сами, не знаете как - задайте вопрос.
Моя_ПреЛесТь сказал(а):
Попробуйте в Linux просканировать локальную сеть.
Ваши скрипты не обнаружат открытые порты.
Что за бред?
Вы скрипт-то хоть запускали?
|
|
|

21.08.2020, 16:02
|
|
Новичок
Регистрация: 07.08.2020
Сообщений: 0
С нами:
3035929
Репутация:
0
|
|
f22, при всём уважении к тебе, ты чё злой такой ?
Когда глаза отойдут от злобной красноты, попробуй адекватно перечитать мои посты.
Я нигде не давал повода тому, что любая программа должна писаться в ООП.
Я ни от кого ничего не требую.
К конструкции try-except нигде претензий не высказывал.
С чего Вы решили, что я должен с вами соглашаться, почему я не имею права на критику ?
f22 сказал(а):
Что за бред?
Вы скрипт-то хоть запускали?
Сам бред несёшь.
Запусти и протестируй, вместо того, чтобы аргументировать выдержками из доков.
|
|
|

21.08.2020, 16:31
|
|
Новичок
Регистрация: 05.05.2019
Сообщений: 0
С нами:
3697991
Репутация:
0
|
|
Моя_ПреЛесТь сказал(а):
Я нигде не давал повода тому, что любая программа должна писаться в ООП.
Тогда к чему вы написали это?
Моя_ПреЛесТь сказал(а):
Cenzor воплотил в коде аналогичную Вашему коду многопоточность, использовал ООП
Моя_ПреЛесТь сказал(а):
Я ни от кого ничего не требую.
Как это не требуете?
Вы упрекаете автора в том, что он по вашему мнению написал код, в который не вложил душу, в котором нет защиты от дурака, код в котором нет изысканности мышления, априори требуя от автора его поменять.
Моя_ПреЛесТь сказал(а):
К конструкции try-except нигде претензий не высказывал.
Тогда на каком основании вы утверждаете, что
Моя_ПреЛесТь сказал(а):
Нужен, нужен .
Моя_ПреЛесТь сказал(а):
С чего Вы решили, что я должен с вами соглашаться, почему я не имею права на критику ?
А где я утверждаю, что вы должны со мной соглашаться?
Вы критикуете чужой код с позиции "мне такой код не нравится, в нём изысканности мышления нет!" - а это абсолютно нелепый аргумент.
Моя_ПреЛесТь сказал(а):
Запусти и протестируй, вместо того, чтобы аргументировать выдержками из доков.
Пожалуйста

|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|