ЖУРНАЛ ХАКЕР

Kylix. Сканер портов заказывали?

Xakep, номер #034, стр. 034-073-2


Теория

Ну а теперь давай разберемся, как же работает наш сканер. В разделе var я объявил две переменные i типа целое число (intrger) и ipstr типа строка (String). После начала блока кода (после begin), в первой строке я присваиваю переменной ipst значение '127.0.0.1'. Это будет значение по умолчанию для адреса сканируемой машины.

Следующей строкой я запрашиваю у юзера ip адрес машины:

if not InputQuery('Atention', 'Enter IP Address', ipstr) then exit;

Здесь я использую функцию InputQuery. Она выводит стандартное окно ввода (ты можешь его увидеть на рисунке 4). Функции передается три параметра:

1. Текст заголовка окна.

2. Текст, отображаемый над строкой ввода.

3. Переменная типа строки, куда запишется результат.

Если пользователь ввел значение и нажал ОК, то функция вернет true, иначе вернет false. Поэтому я использую конструкцию:

if not InputQuery(...) then exit;

Которая означает: "Если пользователь не нажал ОК, то выйти".

После этого я запускаю цикл:

for i:=StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do

Эта строка звучит так: "Для переменной i присвоить значение, указанное в Edit1, и до значения, указанного в Edit2, выполнять следующую строку". Вместо следующей строки у меня идет блок begin ... end, поэтому будет выполняться код, указанный в этом блоке. Чтобы было понятней, давай рассмотрим пример цикла:

for i:=1 to 10 do

begin

print('ОК');

end;

Строка for i:=1 to 10 do запускает цикл от 1 до 10. Это значит, что код, указанный за последующими begin ... end, будет выполняться 10 раз. После каждого выполнения i будет увеличиваться на 1. После первого выполнения print('ОК') переменная i будет равна 2, после второго - равна 3, и так держать.

И, наконец, IntToStr - функция, которой передается строка, а она превращает ее в число. Если ты передашь ей '1', то получишь число 1. Но если передашь 'a24gd', то получишь дулю с маком, потому что здесь не только числа, но и буквы.

Понеслась душа в рай

Теперь посмотрим на само сканирование, которое находится между begin и end. Первая строка указывает, какой порт мы хотим открыть:

TcpClient1.RemotePort:=IntToStr(i);

Эта строка на русском звучит так: "у компонента TcpClient1 свойство RemotePort установить в значение, указанное в переменной "i". Свойство RemotePort является строковым, поэтому я конвертирую число i в строку с помощью IntToStr.

Едем дальше. Следующей строкой я пытаюсь открыть порт: "TcpClient1.Open". После этого произвожу проверку:

if TcpClient1.Connected then

Если компонент TcpClient1 смог законнектиться, то вывожу об этом сообщение "Memo1.Lines.Add(IntToStr(i) + ' open')".

И самое последнее, что я делаю, - закрываю порт. Если порт открылся и мы его не закрыли, то при следующей попытке открыть произойдет ошибка.

Итоги

Вот и готов первый сканер. В Linux он у меня просканировал 1024 порта за несколько секунд. В Windows сканирование проходило около 5 минут, после чего я его вырубил. Так что под окнами сканируй не более десяти портов. Ты, наверно, спросишь, а как же тогда другие проги сканируют так быстро? Но это уже совсем другая история, о которой я расскажу в другой раз.

Назад на стр. 034-073-1  Содержание  Вперед на стр. 034-073-3