Вітаю читачів. Отже, зараз ми напишемо на нашому улюбленому Перлі сканер, який буде відображати, які порти відкриті на віддаленому комп’ютері. Давайте домовимося, що ip-адреси сканованих комп’ютерів, тип протоколу, початковий і кінцевий порти для сканування будуть зберігатися в будь-якому файлі у вигляді ip-адреса:: протокол(0 для udp, 1 для tcp):: начальный_порт:: конечный_порт, наприклад:
127.0.0.1::0::0::1024
Сканер просканує всі комп’ютери зазначені у файлі (інформація про 1-му комп’ютері на 1 рядок). Ще нам знадобиться файл для відображення результатів сканування (якщо він не існує, буде створено новий (користувачі Unix, не забудьте подбати про права)), у нього будуть занесені тільки вдалі спроби. Також наш сканер буде відображати, який комп’ютер, він сканує всі порти та інформацію, відкритий порт, чи ні (якщо для вас це небажано, приберіть ділянки коду, які за це відповідають). Сканер буде запускатися з командного рядка таким чином:
«название_скрипта файл_с_информацией_о_сканируемых_компьютерах файл_для_результатов».
Як же буде працювати наш сканер? Він буде встановлювати з’єднання з кожним комп’ютером зі списку, на кожному порту, якщо з’єднання встановлено, то спроба буде вважатися вдалою. Але, як казав один з комп’ютерних піонерів (начебто Брайан Керріган, але не пам’ятаю точно), що найкращий спосіб вивчити мову програмування — писати на ньому програми, чим ми, власне, зараз і займемося. Отже, поїхали.

#!/usr/bin/perl
# Only for article
# 5p4x2knet a.k.a. Apocalyptic’s scanner
use IO::Socket; # після того, як ми пройшли всі формальності, підключаємо #сокети.
if(@ARGV != 2) #якщо не вказані параметри, повідомляємо як треба робити і виходимо
{
print(«Скрипту повинно бути передано 2 параметра: файл, в якому зберігаються ip-адреси сканованих комп’ютерів, протокол (1 для tcp, 0 для UDP), початковий і кінцевий порт у вигляді адреса:: протокол:: начальный_порт:: конечный_порт і файл, в який будуть записуватися результати, наприклад: scanner.pl ip.txt results.txt n натисніть для виходу»);

}
#До речі, при використанні програми WINDOWS-системах краще переписати цей #текст по-англійськи, інакше — проблеми з #кодуванням.
else #якщо все правильно
{
open(fl “; #скидаємо в масив
close(fl); #і закриваємо
open(FILE, “>>$ARGV[1]”); #відкриваємо файл для результатів
foreach $x (@ip) #і наш сканер починає сканування
{
($ip_addr, $protocol, $from, $to) = split(/::/, $x); #поділяємо ip, протокол, початковий #і кінцевий порти для сканування
print(“$ip_addr… n”); #відображаємо ip комп’ютера, який будемо сканувати
if($protocol == 1) #визначаємо протокол
{
$z = ‘tcp’;
}
else
{
if($protocol == 0)
{
$z == ‘udp’;
}
}
print FILE “n open: n”; #пишемо в файл результатів #ip сканованого комп’ютера і протокол
for($i = $from; $i new(Proto => $z, PeerPort => $i, PeerAddr => $ip_addr); #робимо з’єднання
if($socket) #якщо воно успішно, то
{
print (FILE “$i n”); #вписуємо у файл для результатів і
print(«is open n»); #повідомляємо, що порт відкритий
}
else
{
print(«is not open n»); #в іншому випадку просто повідомляємо, що порт закритий
}
}
print (FILE “n”); #вписуємо в файл з результатами інформацію про #те, що сканування комп’ютера
#закінчено
print(«Done n»); #виводимо напис, що сканування комп’ютера #закінчено
}
close(FILE); #закриваємо файл з результатами
}

Все, що ми написали сканер. Зрозуміло, сканер не ідеальний, це лише кістяк повноцінного сканера, на основі якого ви можете написати свої шедеври. Наприклад, вбудувати можливість визначення сервісу, що висить на порту. Саме визначення, а не виведення інформації про те, що висить на цьому порту по дефолту, так як хитрі адміністратори часто ставлять сервіс на нестандартний порт. Та багато чого можна зробити. Попереджаю, що якщо ви будете застосовувати інформацію, отриману з цієї статті в цілях, що суперечать законам вашої країни, то всю відповідальність несете ви. Вибачте, але я повинен був це сказати :). Гаразд, поки що. Твори, удачі тобі.