Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Tutor
1 / 0 / 2
Регистрация: 08.05.2014
Сообщений: 36
1

Создать модуль быстрого сканера портов

05.11.2014, 11:16. Просмотров 375. Ответов 1
Метки нет (Все метки)

Доброго времени суток форумчане! У меня есть код, но необходимо сделать файл .exe. Помогите с визуализацией программного кода (чтобы это всё было на Форме)
Вот он:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, winsock2, ComCtrls;
 
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    AddressEdit: TEdit;
    Label2: TLabel;
    StartPortEdit: TEdit;
    EndPortEdit: TEdit;
    Label3: TLabel;
    Button1: TButton;
    DisplayMemo: TRichEdit;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function LookupName: TInAddr;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
//Функция преобразвывающся введённый адрес сервера в спецформат
//Если введено символьное имя, то она преобразовывает его сначала в IP адрес,
//а потом переводит в спец формат
function TForm1.LookupName: TInAddr;
var
 HostEnt: PHostEnt;
 InAddr: TInAddr;
begin
 if Pos('.', AddressEdit.Text)>0 then
  InAddr.s_addr := inet_addr(PChar(AddressEdit.Text))
 else
  begin
  HostEnt := gethostbyname(PChar(AddressEdit.Text));
  FillChar(InAddr, SizeOf(InAddr), 0);
  if HostEnt <> nil then
   begin
    with InAddr, HostEnt^ do
     begin
      S_un_b.s_b1 := h_addr^[0];
      S_un_b.s_b2 := h_addr^[1];
      S_un_b.s_b3 := h_addr^[2];
      S_un_b.s_b4 := h_addr^[3];
     end;
   end
  end;
  Result := InAddr;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
 i,j,s, opt, index: Integer;
 FSocket: array [0..41] of TSOCKET; //Массив сокетов
 busy   : array [0..41] of boolean; //Массив, в котором будет храниться информация о каждом сканируемом сокете
 port   : array [0..41] of integer; //Массив сканируемых портов
 addr   : TSockAddr;
 hEvent : THandle; //Объект для обработки сетевых событий
 fset   : TFDset;
 tv     : TTimeval;
 tec    :PServEnt;
 PName:String;
 GInitData : TWSADATA;
begin
 // Устанавливаю максимальное и минимальное значение полоски состояния сканирования
 //Я устанавливаю в минимум начальный порт сканирования, а в максимум - конечный порт
 ProgressBar1.Min:=StrToInt(StartPortEdit.Text);
 ProgressBar1.Max:=StrToInt(EndPortEdit.Text);
 
 //Инициализирую WinSock
 WSAStartup(MAKEWORD(2,0), GInitData);
 
 //Записываю в переменную i значение начального порта
 i:=StrToInt(StartPortEdit.Text);
 
 //Заполняю основные поля структуры addr, которая будет использоваться
 //при вызове функции connect
 addr.sin_family := AF_INET;
 addr.sin_addr.s_addr := INADDR_ANY;
 
 //Вывожу сообщение о том, что начат поиск введённого хоста
 DisplayMemo.SelAttributes.Color:=clTeal;
 DisplayMemo.SelAttributes.Style:=DisplayMemo.SelAttributes.Style+[fsBold];
 DisplayMemo.Lines.Add('Поиск хоста');
 
 //LookupName - эта функция написана выше и она возвращяет адрес в спец формате указанного сервера
 //Результат этой функции я записываю в поле адреса сервера структуры addr
 addr.sin_addr := LookupName;
 
 //Вывожу сообщение о том, что начато сканирование
 DisplayMemo.SelAttributes.Color:=clTeal;
 DisplayMemo.SelAttributes.Style:=DisplayMemo.SelAttributes.Style+[fsBold];
 DisplayMemo.Lines.Add('Сканирование...');
 
 //В index находиться количество сокетов проверяемых за один раз
 index:=40;
 
 //Создаю объект для обработки сетевых событий
 hEvent := WSACreateEvent();
 while i<StrToInt(EndPortEdit.Text) do
  begin
   ///Всем элементам массива busy присваиваю значение false
   for j:=0 to index do
    busy[j]:=false;
 
   //В этом цикле будут асинхронно посылаться запросы на моединение
   //переменная j будет изменяться от 0 до максимального количества
   //элементов в массиве
   for j:=0 to index do
    begin
     //Если j-й порт превысил значение указанного максимального
     //порта, то прервать цикл
     if i>StrToInt(EndPortEdit.Text) then
      begin
       index:=j-1;
       break;
      end;
 
     //Инициализирую очередной j-й сокет из массива FSocket
     FSocket[j] := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
 
     //Добавляю j-й сокет к объекту событий с помощью WSAEventSelect
     //1-й параметр - Добавляемый сокет
     //2-й параметр - объект событий, который был создан с помощью WSACreateEvent
     //3-й параметр - какие события ожидать. Тут я указываю FD_WRITE - события записи и FD_CONNECT - события о заключении соединения
     WSAEventSelect(FSocket[j], hEvent, FD_WRITE + FD_CONNECT);
 
     //Указываем порт, на который надо произвести попытку соединения
     addr.sin_port := htons(i);
 
     //Попытка коннекта на очередной порт
     connect(FSocket[j], @addr, sizeof(addr));
 
     //Даём ОС поработать и обработать накопившиеся события.
     //Если этого не делать, то вовремя сканирования будет
     //происходить эффект зависания
     Application.ProcessMessages;
 
     //Проверяю, были ли ошибки.
     if WSAGetLastError()=WSAEINPROGRESS then
      begin
       //Если ошибка произошла, то закрываю этот порт
       closesocket (FSocket[j]);
       //Устанавливаю соответствующий элемент в массиве busy в true
       //чтобы потом не проверять этот порт, потому что он всё равно
       //уже закрыт
       busy[j]:=true;
      end;
 
     //Указываю в массиве port, на какой именно порт мы сейчас послали запрос
     port[j]:=i;
 
     //Увеличиваю счётчик i в котором я отслеживаю, какой порт сейчас сканируеться
     //чтобы на следующем этапе цикла for запустить сканирование следующего порта
     i:=i+1;
    end;
 
   //Обнуляю переменную fset
   FD_Zero(fset);
 
   //Заполняю сканируемый массив сокетов в переменную fset
   for j := 0 to index do
    begin
     if busy[j] <> true then
      FD_SET (FSocket[j], fset);
    end;
 
   //Даём ОС поработать и обработать накопившиеся события.
   Application.ProcessMessages;
 
   //Заполняю структуру, в которой указано время ожидания события от сокета
   tv.tv_sec := 1; //Мы будем ждать 1 секунду
   tv.tv_usec := 0;
 
   //Ожидаем пока произойдёт хотя бы одно событие от любого из сокетов
   s:=select (1, nil, @fset, nil, @tv);
 
   //Даём ОС поработать и обработать накопившиеся события.
   Application.ProcessMessages;
 
   //Запускаю массив, в котором будет проверятся, какие из сокетов в массиве FSocket
   //прошли коннект успешно, а какие нет.
   for j := 0 to index do
    begin
     //Проверяем, был ли закрыт соответствующий порт из-за ошибки
     //Если да, то нет смысла его проверять
     if busy[j] then continue;
 
     if FD_ISSET (FSocket[j], fset) then
      begin
       //В переменную s записываеться размер перменной Opt
       s:=Sizeof(Opt);
       opt:=1;
       //Получаю состояние текущего j-го сокета
       //результат состояния будет в переменной opt
       getsockopt(FSocket[j], SOL_SOCKET, SO_ERROR, @opt, s);
 
       //Если opt равно 0 то порт открыт и к нему можно подключится
       if opt=0 then
         begin
          //Пытаюсь узнать символьное имя порта
          tec := getservbyport(htons(Port[j]),'TCP');
          if tec=nil then
           PName:='Unknown'
          else
           begin
            PName:=tec.s_name;
           end;
          //Вывожу сообщение об открытом порте
          DisplayMemo.Lines.Add('Хост:'+AddressEdit.Text+': порт :'+IntToStr(Port[j])+' ('+Pname+') '+' открыт ');
         end;
      end;
     //Закрыть j-й сокет, потому что он больше уже не нужен
     closesocket(FSocket[j]);
    end;
   //Увеличивею позицию в ProgressBar1
   ProgressBar1.Position:=i;
  end;
 //Закрываю объект событий
 WSACloseEvent(hEvent);
 
 //Вывожу сообщение о конце сканирования
DisplayMemo.SelAttributes.Color:=clTeal;
 DisplayMemo.SelAttributes.Style:=DisplayMemo.SelAttributes.Style+[fsBold];
 DisplayMemo.Lines.Add('Сканирование закончено...');
 ProgressBar1.Position:=0;
end;
 
end.
P.S. И объясните пожалуйста, для чего этот сканер портов необходим? Для локальной сети?
0
Миниатюры
Создать модуль быстрого  сканера портов  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2014, 11:16
Ответы с готовыми решениями:

В консольном режиме Delphi создать модуль, реализующий ниже перечисленные задачи и использовать его в программе для их решения.
Помогите плиз... В текстовом файле представлена информация об аудиофайлах....

Создать дополнительный модуль
1. Все объявления классов пользователя (Point, Circle, Box), связанных с ними...

создать модуль с процедурами
-положение максимального и минимального элементов массива -вывод элементов...

Создать модуль. Пошаговая инструкция
http://storage8.static.itmages.ru/i/13/0316/s_1363455567_1067613_d41d8cd98f.jpg...

Создать модуль для просмотра паролей
Доброго времени суток форумчане! У меня есть код, но необходимо сделать файл...

1
mss
2634 / 2258 / 276
Регистрация: 24.12.2010
Сообщений: 13,725
05.11.2014, 14:47 2
Цитата Сообщение от Tutor Посмотреть сообщение
для чего этот сканер портов необходим? Для локальной сети?
Для для любой сети, базирующейся на протоколе транспортного уровня TCP
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2014, 14:47

Создать модуль управления системным указателем Мышь
Доброго времени суток форумчане! У меня есть код (.pas), но необходимо сделать...

Создать отдельный модуль для построения графика(сhart) - выдает ошибку, что series1 не известен
Нужно создать отдельный модуль для построения графика(сhart). Но во время...

Построение сканера
Мне нужно разделить код на литералы, разделители и идентификатор. Вот код: int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru