Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.036 c
7-1079196947
nikitos
2004-03-13 19:55
2004.05.23
Как сделать программу, которая будет закрывать/открывать дисковод


9-1074578911
Hex0DesiMaL
2004-01-20 09:08
2004.05.23
Епрст....


1-1083747384
Islander
2004-05-05 12:56
2004.05.23
Как преобразовать параметр сообщения WM_SETTEXT в строку?


6-1080659019
Rezya
2004-03-30 19:03
2004.05.23
recv не верно возвращает колличество принятых байт.


14-1083217242
han_malign
2004-04-29 09:40
2004.05.23
WebFile.ru - открылся прикольный сервис...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский