Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2010, 20:36   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию Сканер портов (Делфи глазами хакера)

Как вы поняли из названия темыы, речь пойдет о примере из книги. Много опечаток и недоговорок нашел я там когда перепечатывал код. С парой-тройкой разобрался, но начал писать дальше и столкнулся со следующей проблемой:
Код:
function TForm1.LookupName: TInAddr;
var
HostEnt: PHostEnt;
InAddr: TInAddr;
begin
HostEnt := gethostbyname(PChar(Edit1.Text));
FillChar(InAddr, SizeOf(InAddr), 0);
if HostEnt <> nil then
begin
with InAddr, HostEnt^ do
begin
S_un_b.s_b1 :=Byte(h_addr^[0]);
S_un_b.s_b2 :=Byte(h_addr^[1]);
S_un_b.s_b3 :=Byte(h_addr^[2]);
S_un_b.s_b4 :=Byte(h_addr^[3]);
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;
tv: TTimeVal;
tec: PServEnt;
Pname: string;
Ginitdata: TWSAData;
begin
ProgressBar1.Min:=strtoint(Edit2.Text);
ProgressBar1.Max:=strtoint(Edit3.text);
WSAStartup(MakeWord(1,0), Ginitdata);
i:=strtoint(Edit2.Text);
addr.sin_family:=AF_INET;
addr.sin_addr.S_addr:=INADDR_ANY;
RichEdit1.SelAttributes.Color:=clTeal;
RichEdit1.SelAttributes.Style:=RichEdit1.SelAttributes.Style+[fsBold];
RichEdit1.Lines.Add('Ïîèñê õîñòà');
addr.sin_addr.S_addr:=LookupName;
RichEdit1.SelAttributes.Color:=clTeal;
RichEdit1.SelAttributes.Style:=RichEdit1.SelAttributes.Style+[fsBold];
RichEdit1.Lines.Add('Èäåò ñêàíèðîâàíèå...');
index:=40;
hEvent:=WSACreateEvent();
while i<strtoint(Edit3.Text) do
begin
for j:=0 to index do
busy[j]:=false;
for j:=0 to index do
begin
if i>strtoint(Edit3.text) then
begin
index:=j-1;
break;
end;
Fsocket[j]:=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
WSAEventSelect(FSocket[j], hEvent,FD_WRITE+FD_CONNECT);

end;

end.
Код:
addr.sin_addr.S_addr:=LookupName;
Вот тут компилятор ругается:
[Error] Unit1.pas(78): Incompatible types: 'Cardinal' and 'TInAddr'
[Error] Unit1.pas(100): Record, object or class type required
[Error] Unit1.pas(102): 'END' expected but end of file found
[Fatal Error] Project2.dpr(5): Could not compile used unit 'Unit1.pas'
Как мне исправить это?
P.S. Код не дописан, помогите решить проблемы по мере их появления.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 08.03.2010, 20:54   #2
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Мдэ, а не легче использовать TcpClient + поток ?
Цитата:
Код:
var
  i: Integer;
  ipstr: string;
begin
  ipstr := '127.0.0.1';
//Запрашиваем адрес компьютера.
  if not InputQuery('Внимание', 'Введи IP-адрес', ipstr) then exit;
//Запускаю цикл
  for i := StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do
  begin
//Устанавливаем порт
    TcpClient1.RemotePort := IntToStr(i);
//Пытаемся его открыть
    TcpClient1.Open;
//Если удалось, то сообщаем об этом
    if TcpClient1.Connected then
    begin
      Memo1.Lines.Add(IntToStr(i) + ' открыт');
//Закрываем порт
      TcpClient1.Close
    end
  end;
end;
Взял отсюда
Оформляем все в поток, прицепляем прогрессор для красоты и вуаля... Сканер открытых портов готов.
W0LF вне форума Ответить с цитированием
Старый 08.03.2010, 21:01   #3
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Лёгкий вариант, Вульф, я его реализовал уже (из той же книги), но по словам автора сканер, приведенный в вашем примере, гораздо медленнее, чем сканер, при реализации которого я столкнулся с кучей проблем...

Вот полный код, который я перепечатал:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, winsock2, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    GroupBox1: TGroupBox;
    Label2: TLabel;
    Label3: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    RichEdit1: TRichEdit;
    Label4: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    function LookupName: TInAddr;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.LookupName: TInAddr;
var
HostEnt: PHostEnt;
InAddr: TInAddr;
begin
HostEnt := gethostbyname(PChar(Edit1.Text));
FillChar(InAddr, SizeOf(InAddr), 0);
if HostEnt <> nil then
begin
with InAddr, HostEnt^ do
begin
S_un_b.s_b1 :=Byte(h_addr^[0]);
S_un_b.s_b2 :=Byte(h_addr^[1]);
S_un_b.s_b3 :=Byte(h_addr^[2]);
S_un_b.s_b4 :=Byte(h_addr^[3]);
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;
tv: TTimeVal;
tec: PServEnt;
Pname: string;
Ginitdata: TWSAData;
begin
ProgressBar1.Min:=strtoint(Edit2.Text);
ProgressBar1.Max:=strtoint(Edit3.text);
WSAStartup(MakeWord(1,0), Ginitdata);
i:=strtoint(Edit2.Text);
addr.sin_family:=AF_INET;
addr.sin_addr.S_addr:=INADDR_ANY;
RichEdit1.SelAttributes.Color:=clTeal;
RichEdit1.SelAttributes.Style:=RichEdit1.SelAttributes.Style+[fsBold];
RichEdit1.Lines.Add('Ïîèñê õîñòà');
addr.sin_addr.S_addr:=LookupName;
RichEdit1.SelAttributes.Color:=clTeal;
RichEdit1.SelAttributes.Style:=RichEdit1.SelAttributes.Style+[fsBold];
RichEdit1.Lines.Add('Èäåò ñêàíèðîâàíèå...');
index:=40;
hEvent:=WSACreateEvent();
while i<strtoint(Edit3.Text) do
begin
for j:=0 to index do
busy[j]:=false;
for j:=0 to index do
begin
if i>strtoint(Edit3.text) then
begin
index:=j-1;
break;
end;
Fsocket[j]:=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
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[j]:=tru;
end;
port[j]:=i;
i:=i+1;
end;
FD_ZERO(fset);
for j:=0 to index do
begn
if busy[j]<> True then
FD_SET(Fsocket[j], fset);
end;
Application.ProcessMessages;
tv.tv_sec:=1;
tv.tv_usec:=0;
s:=select(1,nil,@fset,nil,@tv);
Application.ProcessMessages;
for j:=0 to index do
begin
if busy[j] then Continue;
if FD_ISSET(Fsocket[j], fset) then
begin
s:=SIZEOF(Opt);
opt:=1;
getsockopt(Fsocket[j], SOL_SOCKET, SO_ERROR @opt, s);
if opt=0 then
begin
tec:=getservbyport(htons(Port[j]),'TCP');
if tec=nil then
Pname:='Unknown'
else
begin
Pname:=tec.s_name;
end;
RichEdit1.Lines.Add('Õîñò:'+Edit1.Text+': ïîðò :'+inttostr(Port[j])+' ('+Pname+') '+' îòêðûò');
end;
end;
closesocket(Fsocket[j]);
ProgressBar1.Position:=i;
WSACloseEvent(hEvent);
RichEdit1.SelAttributes.Color:=clTeal;
RichEdit1.SelAttributes.Style:=RichEdit1.SelAttributes.Style+[fsBold];
RichEdit1.Lines.Add('Ñêàíèðîâàíèå çàâåðøåíî');
ProgressBar1.Position:=0;
end;
end.
Проверьте пожалуйста, где ошибки, старые не устранены. Вот такая вот лажовая эта книга...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 08.03.2010 в 21:18. Причина: Дописал код
ImmortalAlexSan вне форума Ответить с цитированием
Старый 08.03.2010, 21:30   #4
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Вот, изменил, проверил - работает на 100% (тестировал на Delphi7)
P.S.: помог, кликни плиз на весы, а то уже паутиной покроется скоро )
Вложения
Тип файла: rar ScanPort.rar (3.5 Кб, 598 просмотров)
W0LF вне форума Ответить с цитированием
Старый 08.03.2010, 21:49   #5
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Я просто в шоке... Нет слов... Это мастер класс! Бесконечно благодарен за помощь! Как вы так в этом разбираетесь? Для меня это пока что почти набор символов из незнакомого алфавита! Спасибо ещё раз. И кстати, если кто заглянет сюда с подобным вопросом по сканеру портов, то в добавок к уже написанной проге, выложенной выше, выкладываю winsock2 для работы программы в среде Delphi 7. Работоспособность 100%!

Только у меня возник один вопрос: у меня интернет предоставляет компания, у них стоят роутер, при сканировании портов других компьютеров, входящих в мою локальную сеть, scanport не находит ни одного открытого порта. Это потому что роутер всё блокирует? С моим IP шикарно работает.
Вложения
Тип файла: rar winsock2.rar (19.3 Кб, 333 просмотров)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось Stilet; 10.03.2010 в 11:07.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 08.03.2010, 22:25   #6
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Возможно, провел скан по ip соседа (локалка) сразу начало показывать открытые порты... Все работает нормально.
W0LF вне форума Ответить с цитированием
Старый 08.03.2010, 22:29   #7
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

И ещё, видимо дело ещё в файрволе, которые на компах в локалке, сейчас тоже просканировал человека, всё нормально. Всё спасибо за помощь! Можно закрывать тему.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 08.03.2010, 23:44   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Друзья мои...
Автор книги - Михаил Фленов - наш форумчанин.
Кто (или что) мешает вам "выяснить отношения" с ним в ЛС или емэйле ?
Зачем засорять форум ?
mihali4 вне форума Ответить с цитированием
Старый 08.03.2010, 23:57   #9
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Михалыч, я не собирался выяснять ни с кем отношения. Мне было непонятно что там к чему и я отписался здесь. При чем, что я даже не знал о том, что вы сказали. Как с ним можно связаться? На будущее... Потому что я планирую книгу до конца изучить и без посторонней помощи наврятли смогу
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 10.03.2010, 10:04   #10
Blourid
Форумчанин
 
Аватар для Blourid
 
Регистрация: 09.03.2010
Сообщений: 138
По умолчанию

Где то я читал что М.Фленов нарочно в некоторых кодах делал ошибки чтобы так просто не распространять хак тулзы в готовом виде.
Он и сам подтвердит это.
Вчера
Blourid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стоит ли брать c++ глазами хакера Sylar9 Общие вопросы C/C++ 13 24.03.2012 10:13
Delphi глазами хакера 2 ИЗДАНИЕ Onekey Обсуждение статей 5 30.08.2010 15:21
Сканер портов Bat{CMD}_Men Операционные системы общие вопросы 1 28.08.2010 12:29
"Delphi глазами хакера" скачать DeDoK Свободное общение 15 17.04.2009 03:12
Ищу книгу М. Фленов "Програм. delphi глазами хакера" 2-е издание Titan123 Свободное общение 10 15.10.2008 13:47