Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Простой сниффер   Найти похожие ветки 

 
V@LER@N ©   (2004-04-03 13:16) [0]

Написал недавно программу, для образца взял сниффер с исходников.ру, но он, почему-то не работает (зависает на recv). Что я сделал не так?
Привожу текст программы:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, Buttons, XpSpeed, StdCtrls, winsock;

type
 TForm1 = class(TForm)
   Timer: TTimer;
   XPSpeedButton1: TXPSpeedButton;
   Memo1: TMemo;
   procedure XPSpeedButton1Click(Sender: TObject);
   procedure TimerTimer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const SIO_RCVALL =$98000001;

var
 Form1: TForm1;
 Sock: TSocket;

implementation

{$R *.DFM}

procedure TForm1.XPSpeedButton1Click(Sender: TObject);
var
 sa: SOCKADDR_IN;  
 flag:integer;  
 wsa: WSADATA;
begin
flag:=1;
WSAStartup(MAKEWORD(2,2), wsa);
Sock := socket(PF_INET, SOCK_RAW, 0);
ZeroMemory( @sa, sizeof(sa) );
sa.sin_family := PF_INET;
sa.sin_port:=2048;
sa.sin_addr.s_addr := inet_addr("127.0.0.1");
bind(sock,  sa, sizeof(TSOCKADDR));
ioctlsocket(sock, SIO_RCVALL, flag);
Timer.Enabled := True;
end;

procedure TForm1.TimerTimer(Sender: TObject);
var buffer:array [0..$FFFF] of byte;
len:integer;
begin
  len := 0;
  len:=recv( sock, Buffer, sizeof(Buffer), 0 );
  if len>=0 then
  Memo1.lines.Add("Recieved "+IntToStr(Len)+" bytes")
  else Memo1.lines.Add("-1 байт почему-то... :(");
end;

end.


 
Rezya ©   (2004-04-03 15:47) [1]

Даа Тяжко. Для начала попробуй поменять PF_INET на  AF_INET.
-1  он тебе возвращает потому что у тебя функция recv возвражает -1 Т.Е. произошла ошибка. Изучи такую функцию как WSAGetLastError.
А потом иди сюда. http://delphimaster.net/view/6-1080924168/ и бери код снифака на любой выбор.


 
Verg ©   (2004-04-03 16:29) [2]


> Rezya ©   (03.04.04 15:47) [1]


Хм, но вот у тебя-то оно не -1 возвращало, а все же 1, не так ли? :)


> код снифака на любой выбор.


Дык он же у тебя все равно не заработает. ;)


 
Rezya ©   (2004-04-03 18:42) [3]

Не подкалывай. Я все правельно сказал.


 
Rouse_ ©   (2004-04-03 19:05) [4]

Оффтоп:
> [3] Rezya ©   (03.04.04 18:42)
И где там на любой выбор?
Код Андрея верен, а в твоем на вскидку 2 грубых ошибки...

> Для начала попробуй поменять PF_INET на  AF_INET.
Мдяя - звезные войны, часть вторая...
{$EXTERNALSYM PF_INET}
PF_INET         = AF_INET;


 
Verg ©   (2004-04-03 19:21) [5]


> sa.sin_addr.s_addr := inet_addr("127.0.0.1");


На самом деле ошибка здесь.
Когда подается команда SIO_RCVALL сокету должен быть назначен локальный IP адрес (bind) реального физического сетевого интерфейса, т.е ни INADDR_ANY (0.0.0.0), ни INADDR_LOOPBACK (127.0.0.1) НЕ подходят.

На всякий случай:

sa.sin_port:=2048;

Не ошибка, но и не надо этого, т.к. RAW сокет не имеет ни малейшего понятия о портах. Чхал он на них :)


 
Rezya ©   (2004-04-03 20:03) [6]

Удалено модератором
Примечание: Он и есть Андрей, хоть смотрел бы с кем общаешся...


 
AndersonRules ©   (2004-04-03 21:58) [7]

Удалено модератором
Примечание: Задай вопрос в своей ветке...


 
Rezya ©   (2004-04-04 01:35) [8]


> Код Андрея верен, а в твоем на вскидку 2 грубых ошибки...

Какие к примеру.


 
Rouse_ ©   (2004-04-04 01:54) [9]

Ну для начала посмотри:

If Sock=Invalid_Socket then Synchronize(error1);

Addr.sin_family :=AF_INET;
Addr.sin_addr.s_addr :=inet_addr(PChar(ApAddres));

if bind(Sock, Addr, SizeOf(Addr)) <> 0 then Synchronize(error2);


Тут ты ничего не забыл?

Вторая тут же:
If Sock=Invalid_Socket then Synchronize(error1);
после явной ошибки ты пытаешся продолжать работу...
Ну чего могу сказать - проффесионал, блин...


 
Rouse_ ©   (2004-04-04 02:00) [10]

Потом, что за байду означает этот код?

WSAStartup(MAKEWORD(2,2), SAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
while (p.h_addr_list^ <> nil) do
begin
 Synchronize(Message1);
 ApAddres:=inet_ntoa(PInAddr(p.h_addr_list^)^);
 Inc(p.h_addr_list);
end;


Я его приводил для вывода всех локальных IP адресов, а ты за каким чертом его туда присобачил?


 
Rezya ©   (2004-04-04 02:43) [11]

Да Звездные войны часть третья.
Для начала:
> If Sock=Invalid_Socket then Synchronize(error1);
>
> Addr.sin_family :=AF_INET;
> Addr.sin_addr.s_addr :=inet_addr(PChar(ApAddres));
>
> if bind(Sock, Addr, SizeOf(Addr)) <> 0 then Synchronize(error2);


Что я здесь мог забыть?

Продолжим:

If Sock=Invalid_Socket then Synchronize(error1);

Выход у меня в функции error1.

И напоследок:

> Потом, что за байду означает этот код?
>
> WSAStartup(MAKEWORD(2,2), SAData);
> GetHostName(name, $FF);
> p := GetHostByName(Name);
> while (p.h_addr_list^ <> nil) do
> begin
>  Synchronize(Message1);
>  ApAddres:=inet_ntoa(PInAddr(p.h_addr_list^)^);
>  Inc(p.h_addr_list);
> end;
>
> Я его приводил для вывода всех локальных IP адресов, а ты
> за каким чертом его туда присобачил?

Таким образом я вылавливаю IP-своего компа. Он У меня Один И присваивается провайдером.


 
Rouse_ ©   (2004-04-04 02:47) [12]

Тебе Verg уже один раз сказал:
У тебя поразительная способность нести бред с чесными глазами...

По первому - не указан порт
По второму - выход из тела продцедуры из другой процедуры? Ну-ну..
По третьему - таким образом ты ловишь незнамо что... (если у тебя нет сетевухи - ты молодец)...


 
Rouse_ ©   (2004-04-04 03:09) [13]

В качестве материала для изучения посмотри следующие ресурсы:

http://book.itep.ru/7/sock_71.htm
http://gem.dpt.ustu.ru/InterNetBook/Contents.htm

Желаю успехов


 
Rezya ©   (2004-04-04 11:32) [14]


> Тебе Verg уже один раз сказал:
> У тебя поразительная способность нести бред с чесными глазами...

Да ты тоже не отличаешся особой собразительностью.

>По первому - не указан порт


Зачем нам указывать порт. Если SIO_RCVALL переводит сокет в режим прослушивания всего что приходит. Без всяких портов.
Смотри [5].

По третьему - таким образом ты ловишь незнамо что... (если у тебя нет сетевухи - ты молодец)...


Я ловлю то что надо. Если не знаешь то не лезь. (См. Начало).
Поставь модем, если у тебя его нету, и посмотри  что будет.
Модему по подключению присваивается IP-адрес также как и сетевухе. Так что в этом смыселе практически одно и тоже.

И вообще у меня создалось впечатление что единственный человек который во все это врубается это Verg.


 
Rouse_ ©   (2004-04-04 13:06) [15]

Стоп:
во первых - будешь продолжать таким тоном, будем разговаривать по другому
во вторых - про порт я дествительно нагнал, не о том думал
в третьих - еще раз повторяю, результатом выполнения приведенной мной процедуры будет не то, что тебе нужно в очень многих случаях.
К примеру:
у меня стоит модем и две сетевухи, функция переберет их IP и выведет последний, а откуда ты знаешь что последний - это будет IP модема? А если ты хочешь слушать вторую сетевуху? А если первую? Вот к этому я тебя и подвожу...


 
Rezya ©   (2004-04-04 14:22) [16]


> в третьих - еще раз повторяю, результатом выполнения приведенной
> мной процедуры будет не то, что тебе нужно в очень многих
> случаях.


Я это прекрасно знаю. Но мне эта процедура прекрасно подходит для моих целей т.к. у меня всего один ip-адрес.


> во первых - будешь продолжать таким тоном, будем разговаривать
> по другому


Сам первый начал....

> Тебе Verg уже один раз сказал:
> У тебя поразительная способность нести бред с чесными глазами...


А сам:

> во вторых - про порт я дествительно нагнал, не о том думал

:-)))))


 
Verg ©   (2004-04-04 14:31) [17]


> И вообще у меня создалось впечатление что единственный человек
> который во все это врубается это Verg.


Тут ты ошибаешься, просто у меня еще пока хватает терпения...


 
Verg ©   (2004-04-04 14:42) [18]

Хватало....



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.07 c
4-1081280247
anod
2004-04-06 23:37
2004.05.23
Обновление меню


3-1082626061
Eleonora
2004-04-22 13:27
2004.05.23
Interbase, Query, DBMemo


3-1083051197
kdv1977
2004-04-27 11:33
2004.05.23
фильтр БД


6-1080606162
Керик
2004-03-30 04:22
2004.05.23
Фактическое число байт


8-1078568613
Pat
2004-03-06 13:23
2004.05.23
Сжатие звука по G723.1