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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.025 c
1-1083573849
Amid
2004-05-03 12:44
2004.05.16
Создать Функцию каторая ждала сообщение от Сервера


1-1083219222
WondeRu
2004-04-29 10:13
2004.05.16
GetDIBBits - нот а гуд!!!


14-1082899941
Piter
2004-04-25 17:32
2004.05.16
Wine


6-1080031119
dnsokol
2004-03-23 11:38
2004.05.16
Подключение Telnet клиентов к серверу и как это разрулить?


1-1083240819
фыва
2004-04-29 16:13
2004.05.16
canvas