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