PDA

Просмотр полной версии : Perl - Порт скан


bul666
10.07.2005, 01:27
Помогите!

Нужен скрипт для сканирования портов...

Плз..

Ну или хотябы принцип работы... )

bul666
10.07.2005, 01:29
Вернее не принцип работы... ) А через что делать... Проюывал через while... Но зашел в тупик!

nerezus
10.07.2005, 09:11
Через for по диапазону

nerezus
10.07.2005, 09:15
Ладно, объясню полностью:
1. Свернуть айпишники в 1 цифру
2. Цикл фор между этими цифрами
3. В цикле: Развернуть айпишники и выполнить действия(например порты проверять)

Это все, что тебе надо(причем детально), если, конечно, ты перл знаешь =)

bul666
11.07.2005, 01:58
Я тока начал изучать перл... )

Непонял следуюзее:

1. Свернуть айпишники в 1 цифру (Всмысле назначить например: $fip = "Тут начальный IP"; и $sip = "Еонечный IP"; ??????

2. Плохо знаю for ((

Наверно надо: for i= 'начальный порт' to 'конечный порт'

3. Какой функицией проверятть IP ??? Использовать Socket?

nerezus
11.07.2005, 09:27
Тебе рано этим заниматься.

Типа: Делаю робота. Он почему-то не работает. А что это за штучки-дрючки внутри должны быть?

Zadoxlik
11.07.2005, 11:19
nerezus, не согласен про свернуть ip в одну цифру, т.к. будет очень много лишней работы. Чтобы гонять IP-ки по циклу надо сделать вложенные циклы, где конечный IP будет монтироваться из переменных полученных после прогона каждого из вложенных циклов причем:

Всего циклов будет 4 (если речь идет о прогоне диапазона на один порт, вслучае прогона IP на много портов - цикл один и IP конечно монтировать ненадо, вслучае прогона диапазона IP на диапазон портов - циклов еще больше), состовляющие IP-адреса должны изменяться от 0-255.

Работа с полученным IP: установить сокетное соединение с данным IP к данному порту. Вслучае неудачи - порт закрыт, вслучаеудачи - открыт, закрыть сокетное соединение и по новой.

KEZ
11.07.2005, 11:39
Блин. Берешь айпи, берешь порт начальный и пробуешь соедениться.
Берешь след. порт (увелю на 1) и пробуешь...

nerezus
11.07.2005, 12:00
Zadoxlik, не говори глупости
спрашиваешь, почему сворачивать? смотри:
прогони от 112.4.6.7 до 112.4.7.1 твоим методом:
сколько машин?

в четвертом цикле будет от 7 до 1 с шагом +1
сколько это? правильно, ноль
поэтому надо свернуть

nerezus
11.07.2005, 12:01
Kez, спор как раз на тему "Берешь айпи"

KEZ
11.07.2005, 12:08
Ой, ну ешь нехватало спорить "как взять айпи"...
Берем последнюю цифру, увеличиваем на 1. Потом когда она будет 254 (255, 0 ненадо)
то ставим ее в 0 а ПРЕДПОСЛ. цифру увеличиваем на 1... и т д... только смысл, если в маленькой локалке маска подсети 255.255.255.0 часто бывает...

Zadoxlik
11.07.2005, 13:08
Это не глупости. Глупости говоришь ты. Прежде чем назвать это глупостью попробуй написать такую программу и посмотри что получится. Глупость про 0 сказал ты. Вероятно ты не понял организации цикла, ведь в самой глубине окажется цикл, гоняющий последний разрят Ip


Единство что внутри каждого цикла надо будет соблюсти одно условие. Но то что говоришь ты - вот так глупость. Зачем скан портов превращать в трехдневное занятие

nerezus
11.07.2005, 13:16
Глупости говоришь ты. Прежде чем назвать это глупостью попробуй написать такую программу и посмотри что получится.


#!/usr/bin/perl -w

# PortMap by nerezus
# The Artistic License
# ICQ 547097
#
# A tool for scan ip range

use strict;
use Socket;

if (@ARGV<2) {print "Usage: portmap.pl from_host(ip) to_host(ip) [portfile.txt(ports via [space])]\n";exit(0);}
my $fremote=shift||'127.0.0.1';
my $tremote=shift||'127.0.0.1';
my $portfile=shift;
my $ports;
if ($portfile) {open (PF, $portfile); $ports=<PF>; close(PF);}
else {$ports="21 80";}
my @ports=split(/ /, $ports);
my @flist=split(/\./, $fremote);
my @tlist=split(/\./, $tremote);
my $fip=$flist[0]*256*256*256+$flist[1]*256*256+$flist[2]*256+$flist[3];
my $tip=$tlist[0]*256*256*256+$tlist[1]*256*256+$tlist[2]*256+$tlist[3];

for (my $i=$fip; $i<=$tip; $i++) {
my $tmp=$i;
my $d1=int($tmp / (256*256*256)); $tmp=$tmp-$d1*(256*256*256);
my $d2=int($tmp / (256*256)); $tmp=$tmp-$d2*(256*256);
my $d3=int($tmp / 256); $tmp=$tmp-$d3*256;
my $d4=$tmp;
my $ip="$d1.$d2.$d3.$d4";
my $host=gethostbyname($ip);
foreach my $port (@ports){
my $dest=sockaddr_in($port, $host);
socket (S, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
if (connect(S, $dest)) {
print "[".scalar(localtime)."] $ip:$port OK\n";}
# else {print "[".scalar(localtime)."] $ip:$port ERR\n";}
close S;
}
}

nerezus
11.07.2005, 13:19
Зачем скан портов превращать в трехдневное занятие

Трехдневное? =)
Просто набор текста и уничтожение опечаток.


Однако готов посмотреть твой код. Сюда его размести плз., пообсуждаем :)

KEZ
11.07.2005, 13:54
Чтото ты накатал кода... Это можно проще написать в несколько строчек...

w00d
11.07.2005, 14:02
2kez:
Ну тогда ждем твоего варианта! +)

Zadoxlik
11.07.2005, 14:07
нерезус, я писать не буду. И непонятно зачем ты написал - ведь и так понятно что хочешь сделать ты и что я. Только я не понимаю как можно не согласиться с моим вариантом, ведь в твоем КПД меньше 50 процентов.

nerezus
11.07.2005, 14:28
Zadoxlik.
В твоем варианте:
1. Надо думать.
2. Возможность появления логической ошибки больше.
3. Вместо 10 строк у меня(разбиение айпи - 1*2, свертывание 1*2, цикл -1, развертка - 4, добавление точек-1) получаем... 9 (разбиение первого айпи - 1, цикл со сравнением со 2 ипом -1, условие - 1*3, действия при условии 1*3, добавление точек). Однако всего 1 строчка разницы. И затраты на твой по времени больше.

Zadoxlik
11.07.2005, 14:33
затраты на что ? На написание?

Все больше писать тут не буду. Повторяться только и тебе и мне