Люди! Помогите! Уже неделю маюсь.
Задача такая: нужна программа, которая реально может читать из RAW сокета,
то что ниже - сокет открывает, бинд выполняет, и ждет (бедная) пакеты, пока Ctrl-C не нажму.Где собака зарыта?
Или каким другим другим способом получть необработанные пакеты (хоть прямо с Ethernet интерфейса)
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/uio.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>#define MAX_PACKET_SIZE 1024*4
int main()
{char buf[MAX_PACKET_SIZE];
struct sockaddr_in fromaddr;
struct sockaddr_in sa;
int readlen;
unsigned int fromlen;int fd;
fd=socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
if (fd<0)
{
perror("open");
exit(-1);
}memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = INADDR_ANY;
sa.sin_port = htons(0);
if ( bind(fd, (struct sockaddr *)&sa, sizeof(sa)) == 0)
{
printf("bind divert socket: %d\n", fd);
}for (;;)
{
fromlen = sizeof(struct sockaddr_in);
readlen = recvfrom(fd, buf, MAX_PACKET_SIZE, 0, (struct sockaddr *) &fromaddr, &fromlen);
printf("got packet of %i bytes\n", readlen);
}
}
>Где собака зарыта?Совсем не уверен и FreeBSD далеко, что бы проверить, но мне не
нравятся размер пакета (4K) и порт 0 в sa.sin_port= 0.
>Совсем не уверен и FreeBSD далеко, что бы проверить, но мне не
>нравятся размер пакета (4K) и порт 0 в sa.sin_port= 0.Дак ведь в том то и дело, что нужны пакеты, приходящие на любой порт.
А размер - дак ведь это размер буфера. По моему тут лучше переборщить...
Хотя больше чем 1500 на езернете быть не должно конечно.
>Дак ведь в том то и дело, что нужны пакеты, приходящие на
>любой порт.
>А размер - дак ведь это размер буфера. По моему тут лучше
>переборщить...
>Хотя больше чем 1500 на езернете быть не должно конечно.А как проверяется работоспособность этого кода?
>А как проверяется работоспособность этого кода?В том-то и фишка, что ни как. Этот код под фрей не работает. Замирает на recvfrom, и ждет пакет, и ждет ..... :-(
Черт возьми... Не понятно, что ты хочешь сделать. Все пакеты с сети ч\з хаб сливать? - ставь сетевуху в неразборчивый интерфейс, и она будет все пакеты принимать... или тебе что-то другое надо. Исходники других людей смотреть надо! Большинство софтин вообще-то конектиться к определенному порту... дык поэтому на нулевой ничего не приходит. -) (совет смотреть исходники\примеры написания сниферов под *никс лайк системы -)
>Черт возьми... Не понятно, что ты хочешь сделать. Все пакеты с сети
>ч\з хаб сливать?Если грубо, то именно этого и хочу (тонкости в данном случае не существенны)
> - ставь сетевуху в неразборчивый интерфейс, и она
>будет все пакеты принимать... или тебе что-то другое надо.Дак сетевуха-то принимает - только recvfrom молчит, как партизан, блин. :-)
> Исходники других людей смотреть надо!
Смотрел, смотрю ...
В начале обсуждения исходник не из головы придуманый, а с этого сайта выкопанный - только под Linux. Потому и не работает без адаптации - а как адаптировать пока не допер.
В принципе конкретную задачу я уже в первом приближении решил - через PCAP, но тут уже вопрос азарта - как это через сокеты сделать.
Ткните мне плиз пальцем в исходник для FreeBSD, который будет работать, а то я уже ядро шерстить начал. :-)> Большинство софтин вообще-то конектиться к определенному порту... дык
>поэтому на нулевой ничего не приходит. -)А я то по наивности своей считал, что если ADDR_ANY = 0.0.0.0, то
PORT_ANY = 0. :-)> (совет смотреть исходники\примеры написания сниферов под *никс лайк системы -)
Нашел кстати весьма неплохой примерчик, с помощью которого дело и продвинулось, но ссылка на работе осталась. Если интересно - завтра выложу. Только там все по французски - но си он и во Франции си.
> Дак сетевуха-то принимает - только recvfrom молчит, как партизан, блин.гы--. ресивфром с конкреткного сокета принимать пытаеться, что-то мне кажется, что там просто recv надо юзать.
> В начале обсуждения исходник не из головы придуманый, а с
> этого сайта выкопанный - только под Linux. Потому и не работает
> без адаптации - а как адаптировать пока не допер.Интересно... даже странно -)
> В принципе конкретную задачу я уже в первом приближении решил
>- через PCAP, но тут уже вопрос азарта - как это
>через сокеты сделать.
> Ткните мне плиз пальцем в исходник для FreeBSD, который будет
>работать, а то я уже ядро шерстить начал. :-)...ядро шерстить тяжело. Исходник посмотрю, где-то дома на каком-то компакте куча всякой подобной вещи было.
>= 0.0.0.0, то
>PORT_ANY = 0. :-)оно почти то так, но только для дефаул сокетов. Я когда ICMP ч\з raw писал, то наткнулся на эту проблему. (правда софтина под винды была, и на winsocketax естессно) -).
> Нашел кстати весьма неплохой примерчик, с помощью которого дело и
> продвинулось, но ссылка на работе осталась. Если интересно - завтра
> выложу.
> Только там все по французски - но си он и во
> Франции си.Выкладывай. Интересно посмотреть будет... может что-то новенькое там ;)
Как адаптация Linuxovix sources прошла? Кстати, на какой сети ты тестишь свой софт.? как проверяешь софтину, шлеш на тачку пинг? -))))
>> Дак сетевуха-то принимает - только recvfrom молчит, как партизан, блин.
>
>гы--. ресивфром с конкреткного сокета принимать пытаеться, что-то мне кажется, что там
>просто recv надо юзать.
>и recv пробовал, и даже read-ом пытался. Результат одинаковый = 0 :-(
>...ядро шерстить тяжело. Исходник посмотрю, где-то дома на каком-то компакте куча всякой
>подобной вещи было.Это может быть интересным.
>> Нашел кстати весьма неплохой примерчик, с помощью которого дело и
>> продвинулось, но ссылка на работе осталась. Если интересно - завтра
>> выложу.
>> Только там все по французски - но си он и во
>> Франции си.
>
>Выкладывай. Интересно посмотреть будет... может что-то новенькое там ;)Новенького наверное не много, но не мне судить. Вот оно:
http://www.minithins.net/papers/sniff.txt> Как адаптация Linuxovix sources прошла?
Это дело я пока бросил. Чуть попозже может займусь.
> Кстати, на какой сети ты тестишь свой софт.? как проверяешь софтину,
> шлеш на тачку пинг? -))))Экспериминтирую на роутере - днем порядка 20 машин в инет лезут, так-что дополнительно ничего слать не приходится :-).
Если интересно могу положить свой исходник (~8kb) - он осуществляет захват и простейший анализ пакетов. (сборная солянка из трех программ, плюс немного моего творчества).
man bpf
http://www.opennet.me/docs/FAQ/network/raw-ip-faq.html/poige
--
http://www.morning.ru/~poige/