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

Вниз

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

 
Rezya ©   (2004-03-28 00:11) [0]

Привет Всем. Вот занялся написанием снифера. После долгих разбираний продвинулся до перевода простого сокета в режим перехвата входящего трафика и на  этом остановился.
Глянте код в чем моя ошибка при попытке перевести сокет в режим перехвата всего входящего трафика по средством функции ioctlsocket но при этом он мне выдает ошибку 10022. Вот Код:
procedure TForm1.Button1Click(Sender: TObject);
Const
SIO_RCVALL =$98000001;
var
WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;
Sock:TSocket;
Addr:sockaddr_in;
ApAddres:String;
IOCTLFlag:integer;
begin
{----Вычисление IP-адреса}
WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
while (p.h_addr_list^ <> nil) do
begin
  Memo1.Lines.Add("Адрес машины-"+inet_ntoa(PInAddr(p.h_addr_list^)^));
  ApAddres:=inet_ntoa(PInAddr(p.h_addr_list^)^);
  Inc(p.h_addr_list);
end;
{------------------------------------}
Sock:=Socket(Af_Inet,SOCK_RAW,IPPROTO_IP);
If Sock=Invalid_Socket then  Memo1.Lines.Add("Ошибка создания Сокета-"+Inttostr(WsaGetLastError));

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

if bind(Sock, Addr, SizeOf(Addr)) <> 0 then  Memo1.Lines.Add("Ошибка Bind-"+Inttostr(WsaGetLastError));

IOCTLFlag:=1;
if ioctlsocket(Sock, SIO_RCVALL, IOCTLFlag) <> 0 then  Memo1.Lines.Add("Ошибка ioctlsocket-"+Inttostr(WsaGetLastError));

WSACleanup;
end;


 
Piter ©   (2004-03-28 00:39) [1]

Rezya (28.03.04 00:11)
перевода простого сокета в режим перехвата входящего трафика


что за бред? Хочешь писать снифер.. ну почитай про библиотеку  WinPcap что ли...


 
Rezya ©   (2004-03-28 01:07) [2]

Про библиотеку WinPcap я читал но мне надо на простых сокетах.
Почему объяснять не буду.


 
Rouse_ ©   (2004-03-28 01:26) [3]

Ну - ну, и каким же макаром ты решил перевести карту в promiscuous mode без драйвера? Это что по твоему Линукс чтоли?


 
Rouse_ ©   (2004-03-28 01:35) [4]

Кстати под ХР есть вариант воспользоваться их собственным драйвером. В интернете была статья на эту тему - поищи...


 
Rezya ©   (2004-03-28 03:01) [5]

Вся фишка в функциях ioctlsocket и setsockopt какойто из них надо присвоить значение SIO_RCVALL =$98000001; и тогда сокет так сказать будет получать все данные приходящие на IP модуль.
Но какой из них, и как это сделать, только  наверное только богу известно.


 
Rezya ©   (2004-03-28 03:09) [6]

Господа вопрос срочно меняется. Как оказалось когда компьютер не в сети(в данном случае не в Интернете) он выдает ошибку 10022, но когда он в сети все нормально работает. Странно но факт. У кого какие соображения?


 
Rouse_ ©   (2004-03-28 03:28) [7]

И что - даже перехватывается все?


 
Cobalt ©   (2004-03-28 11:38) [8]

А выяснить, что это за ошибка - 10022, не судьба?
Лень-матушка?


 
Verg ©   (2004-03-28 11:57) [9]

Без 2-го винсока не обойдешься.

Возмешь его здесь:
http://home.earthlink.net/~akonshin/index.htm

Кроме того вот еще вспом. модуль
unit mstcpip;

interface
uses Winsock2;
type
   _tcp_keepalive  = packed record
      onoff : u_long;
      keepalivetime : u_long;
      keepaliveinterval : u_long;
   end;

const
// New WSAIoctl Options
SIO_RCVALL                           = IOC_IN or IOC_VENDOR or 1;
SIO_RCVALL_MCAST                     = IOC_IN or IOC_VENDOR or 2;
SIO_RCVALL_IGMPMCAST                 = IOC_IN or IOC_VENDOR or 3;
SIO_KEEPALIVE_VALS                   = IOC_IN or IOC_VENDOR or 4;
SIO_ABSORB_RTRALERT                  = IOC_IN or IOC_VENDOR or 5;
SIO_UCAST_IF                         = IOC_IN or IOC_VENDOR or 6;
SIO_LIMIT_BROADCASTS                 = IOC_IN or IOC_VENDOR or 7;
SIO_INDEX_BIND                       = IOC_IN or IOC_VENDOR or 8;
SIO_INDEX_MCASTIF                    = IOC_IN or IOC_VENDOR or 9;
SIO_INDEX_ADD_MCAST                  = IOC_IN or IOC_VENDOR or 10;
SIO_INDEX_DEL_MCAST                  = IOC_IN or IOC_VENDOR or 11;

// Values for use with SIO_RCVALL* options
  RCVALL_OFF             = 0;
  RCVALL_ON              = 1;
  RCVALL_SOCKETLEVELONLY = 2;

implementation

end.


Т.е. вместо uses Winsock - uses winsock2
а
вместо
WSAStartup($0101, WSAData);
-
WSAStartup(MAKEWORD(2,2), SAData);


 
Verg ©   (2004-03-28 12:05) [10]

Кстати при включении опции SIO_RCVALL на символьном сокете, под виндами (>=W2K) тот сетевой адаптер, к которому этот сокет был прибинден (bind) на самом деле врубается в promiscuous mode.
Это тоже проблема, между прочим, у символьного сокета - либо все принимает (свое, чужое без разбору - это когда SIO_RCVALL), либо только свое, но только не UDP и TCP.

WinPcap в этом смысле - не такое гружево для ядра.


 
Verg ©   (2004-03-28 12:13) [11]


> Rezya ©   (28.03.04 03:09) [6]
> Господа вопрос срочно меняется. Как оказалось когда компьютер
> не в сети(в данном случае не в Интернете) он выдает ошибку
> 10022, но когда он в сети все нормально работает. Странно
> но факт. У кого какие соображения?


Кажется я понял - ты пытаешься прослушивать диалап-адаптер.
Когда нет соединения, то твой bind присваивает сокету локальный адрес 127.0.0.1 (другого адреса (адаптера) просто нет). Конечно же никакого SIO_RCVALL на loopback interface и быть не может.


 
Rezya ©   (2004-03-28 12:26) [12]

Хорошо. Тогда другой вопрос. Я скачал снифер и он работает и в режиме LocalHost. И просматривая код я обнаружил что он написано тоже при помощи простых сокетов.

> И что - даже перехватывается все?

Перехатывается да ещё как....


 
Piter ©   (2004-03-28 13:36) [13]

Rezya (28.03.04 12:26) [12]
Я скачал снифер


ссылочку плиз. А вообще, если есть исходники - то чего ты спрашиваешь? Посмотри чем они от твоих отличаются... а то ты нас спрашиваешь, почему одна программа работает, а твоя нет


 
Verg ©   (2004-03-28 13:45) [14]


> Хорошо. Тогда другой вопрос. Я скачал снифер и он работает
> и в режиме LocalHost. И просматривая код я обнаружил что
> он написано тоже при помощи простых сокетов.


Какой именно вопрос-то?
Что ты называешь режимом LocalHost?

Отслеживай появление/удаление сетевых интерфейсов, вовремя bind на не-лупбэк SOCK_RAW с режимом SIO_RCVALL. А другой, просто SOCK_RAW (даже без локального адреса) будет тебе отлавливать тоже весь IP трафик, но кроме TCP и UDP в то время, когда нет ни одного сетвеого и-фейса, кроме loopback.

Программист ты или где?


 
Rezya ©   (2004-03-28 14:34) [15]

Все все все. Разобрался я со всем. Все у меня заработало. Всем огромное СПАСИБО. В особенности Verg-у.
Тепер у меня другой вопрос как отлавливать исходящий трафик?
ДА и у меня появилась идея. Может написать статью для этого сайта на эту тему. Если идея кому понравилсь то жду двайте вместе напишем. Я к примеру напишу как это делается на прстых сокетах а вы к примеру с помощью WinPcap.
Потому как не я один вас достал этим вопросом.


 
Verg ©   (2004-03-28 14:50) [16]


> Тепер у меня другой вопрос как отлавливать исходящий трафик?


SOCK_RAW/SIO_RCVALL - ловит весь IP трафик своего сет. инт-са, т.е. совсем весь - свой чужой, входящий, исходящий. Весь, как говорится - на букву "ф".

А насчет статьи - напиши свою часть (хотя бы для себя), там посмотрим. Главное - обоснуй для чего, в каких случаях может пригодиться снифер.

Ты знаеь, что SOCK_RAW доступен только для приложений запущенных на правах админа?


 
Rezya ©   (2004-03-28 15:06) [17]


> ловит весь IP трафик своего сет. инт-са, т.е. совсем весь
> - свой чужой, входящий, исходящий.

Мда.... тормознул...
Тогда всем спасибо вопросов больше не имею, пока не имею.


 
Rezya ©   (2004-03-28 15:10) [18]

Мда.. нее я не тормознул вот сейчас он у меня запущен и он на команду Res:=recv(Sock, Buffer, SizeOf(Buffer), 0);
принимает только входящие пакеты.


 
Verg ©   (2004-03-28 15:13) [19]

Да не, проверь все еще раз - все так, как я тебе говорю.- Ловит все. По крайней мере на сетвых картах точно. На RAS адаптерах не пробовал.


 
Rezya ©   (2004-03-28 15:34) [20]

Так дело в том что у меня модем. И он мне ловит только входящие пакеты. К сожалению.


 
Verg ©   (2004-03-28 15:54) [21]

Не знаю, во и прврешиь на счет "модема".

Насчет статей.

http://www.rsdn.ru/article/net/sniffer.xml
http://www.codenet.ru/progr/visualc/sniffer.php

z0mbie советовать не буду - гадюшник полный, думаю, что ты там и сам побывал.


 
Verg ©   (2004-03-28 16:06) [22]

Да, вот почитай еще. Может быть это тебя касается:
http://www.darklab.org/archive/msg00243.html


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

Слушай. Почитал. По поводу статей. Бред, мало  и плохо написано.
Ну а как можно перехватить исходящий трафик если этим способом не получается?


 
Verg ©   (2004-03-29 20:32) [24]


>  По поводу статей. Бред, мало  и плохо написано.


Не говори "бред", пока сам не перепрыгнешь.


 
Rezya ©   (2004-03-30 02:52) [25]

?????????????????????????????????????????

Лучше помоги, конечно если тебе не сложно, с перехватом исходящего трафика.
P.S. Ты что в плохом настроении????????????


 
Verg ©   (2004-03-30 12:55) [26]

Я не понял - как я тебе могу помочь?

У меня этот перехватчик (SOCK_RAW/SIO_RCVALL) прекрасно работает. И исходящий и входящий трафик отлавливает. У меня W2K.
У меня нет модема, я не буду устанавливать XP и покупать модем для того, чтобы разобраться с твоими проблемами.

Я тебе привел даже кусочек разговора, где один чел говорит другому прямым текстом: "Это давно известная проблема с Windows XP, где SIO_RCVALL сокет не перехватывает исходящие пакеты".
И я не знаю, но скорее всего - это правда.


Hi Guy,

Are you using SIO_RCVALL command (Winsock) for sniffing?
If so, there"s a known problem with SIO_RCVALL not receiving outgoing packets on Windows XP.
You can catch both directions on some Windows 2000 machines.

I had the same problem.
I don"t know if this problem solved or not, but it"s known for long time.

Kind Regards,
Evgeny.


Ты это читал? Чего ж еще хочешь?

Тем более, что

Rezya ©   (28.03.04 01:07) [2]
Про библиотеку WinPcap я читал но мне надо на простых сокетах.
Почему объяснять не буду.


............


 
WondeRu ©   (2004-03-30 15:21) [27]

ИСпользуй (пиши!) свой драйвер, который подключается к драйверу IpFilterDriver! Я делал: все пашет!


 
Rezya ©   (2004-03-30 18:45) [28]

По поводу полного перехвата. Я не знаю как на сетевых картах но помимо модема я пробовал через прямое кабельное соединение я тот же эффект.



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

Форум: "Сети";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.032 c
3-1082634420
Frozzen
2004-04-22 15:47
2004.05.16
Позиция курсора в DBGrid


1-1083674882
Girder
2004-05-04 16:48
2004.05.16
Как быстро удалить указатель из списка


8-1077192989
fiction
2004-02-19 15:16
2004.05.16
работа с графическим буфером


3-1082536432
din
2004-04-21 12:33
2004.05.16
Как вывести на форму текущий месяц


1-1082997070
ZedeS
2004-04-26 20:31
2004.05.16
Побайтное чтение файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский