Пишем простейший сканер портов на Delphi

Пишем простейший сканер портов на Delphi

  В свое время именно такой документ я искал бороздя просторы рунета. Сегодня мы напишем самую распространенную хакерскую утилиту - Сканер портов на Delphi. Хочу еще раз напомнить, что нижеприведенныйкод написан лишь в обучающих целях.
  Итак, для начала хочу объяснить тебе принцип работы программы. Делаем попытку соединения с портом, если сервер не отвечает, то значит значит порт закрыт. Если же наоборот, то выводим номер открытого порта на экран.

Приступим-с...

При написании нашей программы мы будем использовать библиотеку WinSock.dll

Для ее использования добавляем в раздел uses строчку WinSock.

Cтартуем библиотеку WinSock функцией WSAStartup.
Аргументами этой функции являются:
wVersion - параметр типа WORD который обозначает версию стартующей библиотеки.
WSDATA - параметр в который будет записана информация о текущем состоянии библиотеки, этот параметр имеет тип TWSAData.
Фунция при успешном выполнении возвращает 0.

  Но просто работающая библиотека нам не поможет, мы должны соединятся с сервером через сокет.
Подготовить сокет к работе очень просто, для этого есть функция socket.
Итак, аргументы:
af - Тип адресации: PF_INET - синхронная, AF_INET - асинхронная.
struct - базовый протокол: SOCK_STREAM - TCP, SOCK_DGRAM - UDP.
protocol - используемый протокол.
В случае ошибки функция возвращает INVALID_SOCKET, прои успешном завершении структуру типа TSocket.

  Про то, как адресовать соединение тебе станет ясно из кода проги, а я лучше расскажу тебе как его установить. Для установления соединения нужно выполнить функцию connect.
Как обычно:
Socket - переменная которую мы получили с помощю socket();
addr - пременная типа TSockAddr
addr_size - размер переменной addr.
Фунция при успешном соединении возвращает 0.

В принципе я рассказал тебе все что нужно, осталось только дать исходник. program e2s;

  {$APPTYPE CONSOLE}
  
  uses
  Winsock;
  
  var
  WSAData:TWSAData; //В эту переменную будет возвращатся информация о состоянии WinSock
  FSocket:TSocket; //Сокет
  addr:TSockAddr; //Структура адреса
  host:String; //Адрес сканируемого хоста
  beg_port,end_port:integer; //Начальный и конечный порты
  i:integer; //Счетчик (в дальнейшем понадобится)
  err_code:integer; //Сюда вернется код ошибки выполнения операции перевода 
  String->Integer
  
  begin
  Writeln('Port scanner by x4re$ [Dark software]');
 //Выводим на экран строку about. Фон кстати черный, как и положено
  //Проверяем все ли параметры были введены.
  if(Paramstr(1)='') or (Paramstr(2)='') or ((Paramstr(3)='')) 
  then begin
  Writeln('USAGE: e2s.exe servername 21 80');
  halt;
  end;
  host:=ParamStr(1); //Присваеваем переменной host первый параметр командной строки.
  //Присваеваем переменным beg_port и end_port 2 и 3 параметры командной строки.
  //Я использую здесь именно эту процедуру т.к. не хочу использовать модуль SysUtils.
  Val(ParamStr(2),beg_port,err_code);
  Val(ParamStr(3),end_port,err_code);
  //Проверяем правильность диапазона портов
  if beg_port>end_port then begin
  writeln('ERROR: Invalid port range.');
  halt;
  end;
  writeln('Scanning ',host,' for open ports.'); //Вопросы есть ?
  addr.sin_family:=AF_INET; //Мутим адресацию, в нашем случае - асинхронная.
  addr.sin_addr.S_addr:=inet_addr(pchar(host)); //Заполняем поле адреса.
  if WSAStartup($101,WSAData)<>0 then begin
  //Если произошла ошибка при старте WinSock выводим сообщение и выходим.
  Writeln('ERROR: Initialization error.');
  halt;
  end;
  
  for i:=beg_port to end_port do begin // С перврго по последний порт начинаем сканить.
  FSocket:=socket(AF_INET,SOCK_STREAM,0); //Создаем гнездо.
  if FSocket=INVALID_SOCKET then begin
  //Если если ошибка при создании гнезда то...
  Writeln('ERROR: Initialization error.');
  halt;
  end;
  addr.sin_port:=htons(i); //Присваеваем значению порта текущее значение счетчика.
  if connect(FSocket,addr,sizeof(addr))=0 then begin
  //Ури, открытый порт.
  Writeln(host,':',i,' - opened.');
  CloseSocket(FSocket);
  end;
  end;
  WriteLn('Scanning complete');
  WSACleanup;
 

Информация о статье "Пишем простейший сканер портов на Delphi"

Автор DeVoid | Сайт http://devoid.com.ua/ | Добавлена 6 Декабря 2007 | Просмотрели 6761 раз

  • Digg it!
  • Delicious
  • +МоёМесто.ru
  • Добавить страницу к Мистеру Вонгу
  • Добавить страницу к Мистеру Вонгу

Комментарии КОММЕНТАРИИ

Комментариев еще нет.

Зарегистрируйтесь или выполните Вход для того чтобы оставлять комментарии