URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1469
[ Назад ]

Исходное сообщение
"Raw socket под FreeBSD"

Отправлено dmitrij_b , 10-Мрт-03 13:03 
Люди! Помогите! Уже неделю маюсь.
Задача такая: нужна программа, которая реально может читать из 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);
  }
}


Содержание

Сообщения в этом обсуждении
"Raw socket под FreeBSD"
Отправлено SergeiZz , 12-Мрт-03 18:08 
>Где собака зарыта?

Совсем не уверен и FreeBSD далеко, что бы проверить, но мне не
нравятся размер пакета (4K) и порт 0 в sa.sin_port= 0.


"Raw socket под FreeBSD"
Отправлено dmitrij_b , 12-Мрт-03 18:20 
>Совсем не уверен и FreeBSD далеко, что бы проверить, но мне не
>нравятся размер пакета (4K) и порт 0 в sa.sin_port= 0.

Дак ведь в том то и дело, что нужны пакеты, приходящие на любой порт.
А размер - дак ведь это размер буфера. По моему тут лучше переборщить...
Хотя больше чем 1500 на езернете быть не должно конечно.


"Raw socket под FreeBSD"
Отправлено SergeiZz , 12-Мрт-03 18:33 
>Дак ведь в том то и дело, что нужны пакеты, приходящие на
>любой порт.
>А размер - дак ведь это размер буфера. По моему тут лучше
>переборщить...
>Хотя больше чем 1500 на езернете быть не должно конечно.

А как проверяется работоспособность этого кода?


"Raw socket под FreeBSD"
Отправлено dmitrij_b , 12-Мрт-03 21:36 
>А как проверяется работоспособность этого кода?

В том-то и фишка, что ни как. Этот код под фрей не работает. Замирает на recvfrom, и ждет пакет, и ждет ..... :-(


"Raw socket под FreeBSD"
Отправлено Ункновн , 12-Мрт-03 19:18 
Черт возьми... Не понятно, что ты хочешь сделать. Все пакеты с сети ч\з хаб сливать? - ставь сетевуху в неразборчивый интерфейс, и она будет все пакеты принимать... или тебе что-то другое надо. Исходники других людей смотреть надо! Большинство софтин вообще-то конектиться к определенному порту... дык поэтому на нулевой ничего не приходит. -) (совет смотреть исходники\примеры написания сниферов под *никс лайк системы -)

"Raw socket под FreeBSD"
Отправлено dmitrij_b , 12-Мрт-03 21:34 
>Черт возьми... Не понятно, что ты хочешь сделать. Все пакеты с сети
>ч\з хаб сливать?

  Если грубо, то именно этого и хочу (тонкости в данном случае не существенны)

> - ставь сетевуху в неразборчивый интерфейс, и она
>будет все пакеты принимать... или тебе что-то другое надо.

  Дак сетевуха-то принимает - только recvfrom молчит, как партизан, блин. :-)

> Исходники других людей смотреть надо!

  Смотрел, смотрю ...
  В начале обсуждения исходник не из головы придуманый, а с этого сайта выкопанный - только под Linux. Потому и не работает без адаптации - а как адаптировать пока не допер.
  В принципе конкретную задачу я уже в первом приближении решил - через PCAP, но тут уже вопрос азарта - как это через сокеты сделать.  
  Ткните мне плиз пальцем в исходник для FreeBSD, который будет работать, а то я уже ядро шерстить начал. :-)

> Большинство софтин вообще-то конектиться к определенному порту... дык
>поэтому на нулевой ничего не приходит. -)

  А я то по наивности своей считал, что если ADDR_ANY = 0.0.0.0, то
PORT_ANY = 0. :-)

> (совет смотреть исходники\примеры написания сниферов под *никс лайк системы -)

  Нашел кстати весьма неплохой примерчик, с помощью которого дело и продвинулось, но ссылка на работе осталась. Если интересно - завтра выложу. Только там все по французски - но си он и во Франции си.


"Raw socket под FreeBSD"
Отправлено Ункновн , 13-Мрт-03 17:43 
>  Дак сетевуха-то принимает - только recvfrom молчит, как партизан, блин.

гы--. ресивфром с конкреткного сокета принимать пытаеться, что-то мне кажется, что там просто recv надо юзать.

>  В начале обсуждения исходник не из головы придуманый, а с
>  этого сайта выкопанный - только под Linux. Потому и не работает
>  без адаптации - а как адаптировать пока не допер.

Интересно... даже странно -)

>  В принципе конкретную задачу я уже в первом приближении решил
>- через PCAP, но тут уже вопрос азарта - как это
>через сокеты сделать.
>  Ткните мне плиз пальцем в исходник для FreeBSD, который будет
>работать, а то я уже ядро шерстить начал. :-)

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

>= 0.0.0.0, то
>PORT_ANY = 0. :-)

оно почти то так, но только для дефаул сокетов. Я когда ICMP ч\з raw писал, то наткнулся на эту проблему. (правда софтина под винды была, и на winsocketax естессно) -).

> Нашел кстати весьма неплохой примерчик, с помощью которого дело и
> продвинулось, но ссылка на работе осталась. Если интересно - завтра
> выложу.
> Только там все по французски - но си он и во
> Франции си.

Выкладывай. Интересно посмотреть будет... может что-то новенькое там ;)
Как адаптация Linuxovix sources прошла? Кстати, на какой сети ты тестишь свой софт.? как проверяешь софтину, шлеш на тачку пинг? -))))


"Raw socket под FreeBSD"
Отправлено dmitrij_b , 16-Мрт-03 19:59 
>>  Дак сетевуха-то принимает - только recvfrom молчит, как партизан, блин.
>
>гы--. ресивфром с конкреткного сокета принимать пытаеться, что-то мне кажется, что там
>просто recv надо юзать.
>

и recv пробовал, и даже read-ом пытался. Результат одинаковый = 0 :-(

>...ядро шерстить тяжело. Исходник посмотрю, где-то дома на каком-то компакте куча всякой
>подобной вещи было.

  Это может быть интересным.

>> Нашел кстати весьма неплохой примерчик, с помощью которого дело и
>> продвинулось, но ссылка на работе осталась. Если интересно - завтра
>> выложу.
>> Только там все по французски - но си он и во
>> Франции си.
>
>Выкладывай. Интересно посмотреть будет... может что-то новенькое там ;)

  Новенького наверное не много, но не мне судить. Вот оно:
  http://www.minithins.net/papers/sniff.txt

> Как адаптация Linuxovix sources прошла?

  Это дело я пока бросил. Чуть попозже может займусь.

>  Кстати, на какой сети ты тестишь свой софт.? как проверяешь софтину,
> шлеш на тачку пинг? -))))

  Экспериминтирую на роутере - днем порядка 20 машин в инет лезут, так-что дополнительно ничего слать не приходится :-).

  Если интересно могу положить свой исходник (~8kb) - он осуществляет захват и простейший анализ пакетов. (сборная солянка из трех программ, плюс немного моего творчества).


"Raw socket под FreeBSD"
Отправлено Parish , 13-Мрт-03 21:14 
man bpf

"Raw socket под FreeBSD"
Отправлено poige , 17-Мрт-03 12:43 
http://www.opennet.me/docs/FAQ/network/raw-ip-faq.html

/poige
--
http://www.morning.ru/~poige/