Форум: "Сети";
Текущий архив: 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.055 c