Если Delphi уже запустился, то давай приступим к оформлению формы.
Последовательно выполняй следующие действия: поставь на форму Panel из закладки
"Standard" и измени его свойство Align на "alTop". Как менять свойства, я уже
рассказывал в других статьях этого номера. Поэтому теперь я буду просто
говорить, какие свойства изменить, а ты будешь выделять объект и искать такую
строку в ObjectInspector (и, конечно же, ставить то, что я скажу :0) ).
Теперь поставь на форму RichEdit из закладки "Win32" и измени его свойство
Align на "alClient". Теперь установи на Pantl1 три Label и один Edit из закладки
"Standard". У всех Label-ов измени свойство "Caption" на:
Label1 - "Host address" (IP адрес жертвы).
Label2 - "First port" (первый порт).
Label3 - "Last port" (последний порт).
Можешь написать это на русском, но я предпочитаю такие вещи видеть на
английском (да простит меня редактор :)).
Теперь установи на Pantl1 два компонента SpinEdit из закладки "Samples" и
кнопку из закладки "Standard".
Все, с оформлением покончено. Теперь переходим к программированию. Много мы
писать не будем, нам понадобится только одна процедура. Дважды кликни по
Button1, и она у тебя перед глазами появится. Дополни ее этим текстом:
procedure TScanPortForm.Button1Click(Sender: TObject);
var
index:Integer;
initdata:WSADATA;
ws:TSOCKET;
addrport:TSockAddrIn;
begin
RichEdit1.Lines.Clear;
WSAStartup($101, InitData);
socket(PF_INET, SOCK_STREAM,0);
addrport.sin_family := PF_INET;
addrport.sin_addr.s_addr := inet_addr(PChar(Edit1.Text));
index:=SpinEdit1.Value;
while index<spinedit1.value p="" do<=""> </spinedit1.value>
begin
addrport.sin_port := htons(index);
if connect(ws,addrport,sizeof(addrport))=0 then
RichEdit1.Lines.Add('Port '+IntToStr(index)+' открыт');
Inc(index);
end;
RichEdit1.Lines.Add(' Готово');
closesocket(ws);
end;
На первый взгляд очень много. Но ничего страшного здесь нет. Сейчас я все
аккуратно распишу. Давай рассмотрим каждую строчку в отдельности:
RichEdit1.Lines.Clear - очищает RichEdit1.
WSAStartup($101, InitData); - запускаем библиотеку winsock, которая
используется для работы с сокетами. Я здесь работаю с сокетами через API, а не
через ClientSocket, как в статье про троянов. Это сделано для увеличения
скорости сканирования. Ты же не хочешь, чтобы тебя выловила наша доблестная
милиция.
В качестве первого параметра ($101) указывается версия необходимого драйвера
winsock.dll. Второй параметр нами не используется, поэтому там пустая переменная
типа WSADATA.
socket(PF_INET, SOCK_STREAM,0) - открывает сеанс работы с сокетами. Кстати,
сокет - это по-нашему гнездо. AF_INET говорит, что меня интересует один из
протоколов TCP или UTP. SOCK_STREAM - указывает, что мне нужен протокол из
семейства TCP. Третий параметр 0 означает TCP.
Дальше я заполняю структуру addrport, в которой я должен указать адрес жертвы
и протокол.
addrport.sin_family := PF_INET - указываю протокол PF_INET.
addrport.sin_addr.s_addr := inet_addr(PChar(Edit1.Text))- устанавливаю адрес
жертвы, введенный в Edit1.
index:=SpinEdit1.Value - запоминаю порт, с которого нужно начать
сканирование.
Дальше идет цикл. Я его распишу на русском, а ты разберешься методом
сравнения с кодом:
Пока текущий < конечный порт делать
Начать цикл
установить текущий порт
Если коннект прошел удачно, то
В RichEdit1 добавляю строку: "Port такой-то открыт"
Следующий порт сделать текущим
Конец цикла
После этого я вывожу сообщение RichEdit1.Lines.Add('Готово') в RichEdit, что
сканирование закончено.
В самом конце я закрываю порт с помощью closesocket.
Перед запуском перейди в начало исходного кода и добавь слово "winsock" в
раздел "uses". Такие вещи мы тоже уже делали в других статьях этого номера,
поэтому у тебя не должно возникнуть никаких проблем. Жми "F9", и твой сканер
портов взлетит в бой.
Больше не буду напрягать твои мозги, ты и так нахватал слишком много инфы :).
Дополнительную информацию о сокетах ищи в разделе статей по дельфи. Там все
очень хорошо расписано, и если ты чего-то не понял, то там догонишь.
Удачных тебе сканов!!!
|