Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно отправить принятый пакет! код под LINUX.. 
:(
    Опции темы
ДК2009
Дата 29.9.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Не могу отправить принятый пакет!
(на приеме обычный код пассивного сниффера)


 
Код

char buf[1500];
  if ( (sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
   perror("socket() failed");
   exit(-1);

 
Код

m = recvfrom(sd, buf, sizeof(buf), 0, 0, 0);


Дальше читаю служебную информацию из пакетов:
       
Код

struct ethhdr eth;
       struct iphdr *ip;
 
      ip = (struct iphdr *)(buf + sizeof(struct ethhdr));
      printf("==IP_HEADER==================================\n");
      printf("IP version            :%d\n", ip->version);
      printf("IP header length      :%d\n", ip->ihl);
      printf("TOS                   :%d\n", ip->tos);
      printf("Total length          :%d\n", ntohs(ip->tot_len));
      printf("ID                    :%d\n", ntohs(ip->id));
      printf("Fragment offset       :%#x\n", ntohs(ip->frag_off));
      printf("MF                    :%d\n", ntohs(ip->frag_off)&IP_MF?1:0);
      printf("DF                    :%d\n", ntohs(ip->frag_off)&IP_DF?1:0);
      printf("TTL                   :%d\n", ip->ttl);
      printf("Protocol              :%d\n", ip->protocol);
      ipsource->s_addr=ip->saddr;
      printf("IP source             :%s\n", inet_ntoa(*ipsource));
      ipdest->s_addr=ip->daddr;
      printf("IP destination        :%s\n", inet_ntoa(*ipdest));
  

Далее необходимо отправить пакет получателю(его ip находится в поле destination )
Код C

        
Код

struct sockaddr_in servaddr;   
       servaddr.sin_family=AF_INET;
      servaddr.sin_port=0;
       servaddr.sin_addr.s_addr=ip->daddr;
        fromlen = sizeof(servaddr);
       if (sendto(sd,buf,sizeof(buf),0,(struct sockaddr *)&servaddr,fromlen))
        printf("Size buf :%d\n",  sizeof(buf));
        {perror("sendto() failed");} 


Код компилируется без ошибок.При выполнении программы принимаю пакеты из интерфейса, читаю поля, но при попытке отправить пакет дальше получателю(машина-шлюз через который идет транзитный траффик) в QTCreator'e выводится строка : sendto failed Недопустимый аргумент!!!!!!!!!(подозреваю - buf)

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

M
MAKCim
Модератор: Пользуйтесь тегом "код"!

PM MAIL   Вверх
MAKCim
Дата 29.9.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(ДК2009 @  29.9.2009,  08:15 Найти цитируемый пост)
Что происходит с буфером buf при приеме пакета и как его отправить дальше что то не совсем понятно...(может в него необходимо добавить новое значение контрольной суммы или что либо наподобие) Чую что многого здесь не понимаю..... 

buf - это весь пакет включая L2, L3, L4 заголовки, в sendto нужно передавать все, что дальше L4
т. е к buf нужно прибавить длину заголовков IP и TCP/UDP
это раз
во-вторых, если servaddr.sin_addr.s_addr соответствует тому же хосту, на котором работает снифер, то отправка не прокатит, т. к на пакетный сокет приходит _копия_ пакета и велика вероятность, что оригинал уже доставлен
аналогично, если включен форвардинг пакетов, в этом случае оригинал уже может быть отправлен хосту адресату



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ДК2009
Дата 29.9.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



1.Так а зачем прибавлять к buf  длину заголовков IP и TCP/UDP если buf уже содержит эти все заголовки? что то я не пойму....
Или buf все таки содержит только пользовательские данные а рядом с ним в памяти содержатся заголовки? 

2. похоже я там опечатался- servaddr.sin_addr.s_addr поменять на servaddr.sin_addr.d_addr. 
на этом компе forwarding отключен, пакеты идут на него транзитом с помощью подмены mac адресов путем статистических записей на клиентах и сервере(в arp таблицах).Т.е. я патаюсь сделать что то наподобие функции ip_forwarding только основная цель это вносить изменения в проходящий траффик(весь)
!!!!!!
Так что думаю оригинал проходить не должен дальше......
Будет ли такая система работать вообще?
Спасибо за внимание!!!  smile 
PM MAIL   Вверх
ДК2009
Дата 29.9.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



про servaddr.sin_addr.d_addr ступил такого члена в данной структуре нет...
PM MAIL   Вверх
MAKCim
Дата 29.9.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(ДК2009 @  29.9.2009,  08:51 Найти цитируемый пост)
Так а зачем прибавлять к buf  длину заголовков IP и TCP/UDP если buf уже содержит эти все заголовки? что то я не пойму....

в sendto нужно передавать только пользовательские данные
у тебя же buf содержит весь пакет включая L2, L3, L4
поэтому если передать его как есть, то в пакете, который придет к адресату, будет куча "мусора" до фактических данных

 
Цитата(ДК2009 @  29.9.2009,  08:51 Найти цитируемый пост)
Будет ли такая система работать вообще?

да


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
svlary
Дата 30.9.2009, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата

При выполнении программы ... в QTCreator'e выводится строка : sendto failed Недопустимый аргумент!

   НЕ очень понял, как программа выполняется в креаторе, но ладно... По смыслу :
  •  "Недопустимый аргумент" - надо понимать, означает код ошибки "EINVAL  - Передан неверный аргумент".
  •  Аргументы вызова функции sendto(sd,buf,sizeof(buf),0,(struct sockaddr *)&servaddr,fromlen) все представляют из себя КОНСТАНТЫ, за исключением sd и fromlen. Можно проверить допустимость их значений перед вызовом sendto(...), но я думаю, что все-таки дело не в них.
  •  Скорее всего, дело в недопустимости значений некоторых полей структуры servaddr :
    •  Почему не сделали bzero(servaddr, sizeof(servaddr)) ?
    •  Этот оператор : servaddr.sin_port=0 вызывает у меня большие сомнения. Что, в самом деле, на том конце кто-то слушает нулевой порт ?! Обычно пишется так : servaddr.sin_port=htons(DEST_PORT);
    •  Может быть Вы перепутали этот параметр с третьим параметром ф-ции создания сокета ? У Вас написано htons(ETH_P_ALL), а по man для socket там должен стоять параметр : " protocol задает конкретный протокол, который используется  на  сокете.   Обычно      существует  только один протокол, обеспечивающий конкретный тип сокета в заданном наборе протоколов.  Однако, возможно существование  нескольких  таких  протоколов  --  тогда  и  используется   этот   параметр.    Номер  протокола  зависит  от  используемого  “домена коммуникации”, см.  protocols(5).  См.  getprotoent(3), где  описано,  как  сопоставлять имена протоколов их номерам." - т.е. к номеру порта пункта назначения этот параметр отношения не имеет.

PM MAIL   Вверх
ДК2009
Дата 30.9.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Вот, это уже на правду похоже....

to MAKCim   
1. Понятно, получается L2 L3 L4 уровни в  sendto достравивает сама система? Что же тогда будет на передаче из сервера если на приеме будут пакеты служебные какие набудь, например ARP ICMP запросы, ответы?(все таки траффик нужно передавать не изменяя) будут ли "проходить" TCP пакеты устанавливающие соединения?(я как понимаю флаги SYN ACK то передаваться не будут.........)
2. Не подскажете что конкретно делает эта строка , а то везеде при описании только сленг используется в материалах: ip = (struct iphdr *)(buf + sizeof(struct ethhdr));

to svlary
■ Почему не сделали bzero(servaddr, sizeof(servaddr)) ?
- Учту

■ Этот оператор : servaddr.sin_port=0 вызывает у меня большие сомнения. Что, в самом деле, на том конце кто-то слушает нулевой порт ?! Обычно пишется так : servaddr.sin_port=htons(DEST_PORT);
- Как тогда передавать принятые IP,ARP,ICMP пакеты, ведь в них нет полей портов? 

■ Может быть Вы перепутали этот параметр с третьим параметром ф-ции создания сокета ? У Вас написано htons(ETH_P_ALL), а по man для socket там должен стоять параметр : " protocol задает конкретный протокол, который используется  на  сокете.   Обычно      существует  только один протокол, обеспечивающий конкретный тип сокета в заданном наборе протоколов.  Однако, возможно существование  нескольких  таких  протоколов  --  тогда  и  используется   этот   параметр.    Номер  протокола  зависит  от  используемого  “домена коммуникации”, см.  protocols(5).  См.  getprotoent(3), где  описано,  как  сопоставлять имена протоколов их номерам." - т.е. к номеру порта пункта назначения этот параметр отношения не имеет.
- в файле /usr/include/linux/if_ether.h прописана переменная ETH_P_ALL, на приеме работает отлично, принимает все пакеты с разбором заголовков всех трех уровней(L2-L4). Пробовал указывать IPPROTO_ICMP и пинговал данную машину - пинг не проходил, все та же ошибка в sendto()

PM MAIL   Вверх
MAKCim
Дата 30.9.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(ДК2009 @  30.9.2009,  09:48 Найти цитируемый пост)
Понятно, получается L2 L3 L4 уровни в  sendto достравивает сама система? 

да

Цитата(ДК2009 @  30.9.2009,  09:48 Найти цитируемый пост)
Что же тогда будет на передаче из сервера если на приеме будут пакеты служебные какие набудь, например ARP ICMP запросы, ответы?(все таки траффик нужно передавать не изменяя) будут ли "проходить" TCP пакеты устанавливающие соединения?(я как понимаю флаги SYN ACK то передаваться не будут.........)

вам для передачи также нужно использовать пакетный сокет (а не AF_INET)
но в этом случае маршрктизацией вы сами будете заниматься (искать сетевой интерфейс для передачи) ;)

Добавлено через 39 секунд
Цитата(ДК2009 @  30.9.2009,  09:48 Найти цитируемый пост)
Не подскажете что конкретно делает эта строка 

получаем адрес ip заголовка


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
svlary
Дата 30.9.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата

Как тогда передавать принятые ICMP пакеты

   Похоже, решение Вашей проблемы описано тут :
Анализатор пакетов ICMP - своими руками

  А собака зарыта, похоже, вот здесь :

Код

protoent *protocol;
protocol = getprotobyname("icmp");   /// !!!!!!

int sock;
sock = socket(AF_INET,SOCK_RAW,protocol->p_proto);


PM MAIL   Вверх
ДК2009
Дата 1.10.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



1. На приеме я использую пакетный сокет(PF_PACKET,SOCK_RAW) для доступа к канальному уровню. 
2. Далее нужно выделить польз-е данные и заголовки?
3. Потом  отправить через этот же сокет поль-е данные но с  флагами которые были в принятом пакете на  всех уровнях...?

В сыром сокете  можно установить через setsockopt переменную IP_HDRINCL в 1 и создать свой IP заголовок.
Можно ли создать свои заголовки в оставшихся канальном и транспортном уровнях?
Вобщем как отправить принятые пакеты именно в первоначальном виде?использовать для каждого уровня свой сокет или все таки можно в моем сокете 
(sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) 
вручную набрать все заголовки?


PM MAIL   Вверх
MAKCim
Дата 1.10.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(ДК2009 @  1.10.2009,  08:14 Найти цитируемый пост)
Можно ли создать свои заголовки в оставшихся канальном и транспортном уровнях?

только через пакетный сокет

Цитата(ДК2009 @  1.10.2009,  08:14 Найти цитируемый пост)
Вобщем как отправить принятые пакеты именно в первоначальном виде?

у тебя же уже есть _весь_ пакет в buf
изменяешь нужные данные, поправляешь контрольные суммы и передаешь через твой пакетный сокет этот буфер

НО
фишка в том, что если форвардинг на хосте отключен и адрес получателя в пакете не соответствует ни одному из локальных адресов сетевого интерфейса, через который он был получен, то генерируется ICMP  вида "хост недоступен"
как я уже говорил, пакетный сокет предствляет собой фильтр, который получает _копии_ пакетов, т. е. оригинал передается дальше по сетевой подсистеме и уже независимо от нас генерируется ICMP

преодолеть это можно 2-мя путями
1. блокировать исходящий ICMP через netfilter/iptables
2. использовать цель QUEUE в iptables
далее через netlink сокет получать уже оригиналы пакетов, фильтровать их, сопоставлять с копиями, полученными через iptables и через пакетный сокет отправлять дальше

с ARP и прочими L3 еще сложнее



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ДК2009
Дата 1.10.2009, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Вообще общая задача для чего эта программа мне понадобилась состоит с следующем:
- в локальной сети несколько компов, один сервер.
- необходимо организовать прохождение всего траффика между клиентами только через сервер!
- на программном уровне(как я себе представляю) вносить изменения в проходящий траффик(отбросить n-й пакет,исказить содержимое и т.п.)

Добавлено через 4 минуты и 13 секунд
to MAKCim Понятно, я так и пытался изначально сделать......может из за контрольных сумм ошибка получается.....
PM MAIL   Вверх
MAKCim
Дата 1.10.2009, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



ДК2009
что мешает сделать сервер дефолтным gateway'ем в локалке
и настроить форвардинг через iproute2 на нем?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ДК2009
Дата 1.10.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



пробовал прописать в route gateway default но из материалов узнал что на этот сервер пойдет траффик не предназначенный для локального адресата, да и прописать вроде не полусилось в таблицу маршрутизации, уже не помню почему


По проге:
1.получается что для пакетного сокета не нужно утанавливать никаких опций, подаешь на вход собранный вручную пакет и все.
2.Т.К. я пакет не меняю вообще то и суммы контрольные тоже не меняются, так?
3.на вход sendto нужно подать buf(адрес его начала а функция уже оправит то что содержится в куске длины buf+заголовки,ты кстати это уже писал))) а длину нужно сделать соотв-ю отправляемому пакету, для ICMP получается
sendto(sd,buf,sizeof(buf + sizeof(struct ethhdr) + sizeof(struct iphdr)),0,(struct sockaddr *)&servaddr,fromlen)?
попробовал, что то не хочет опять....

думал может не правильно пробую тестить......може например послать самому себе пинг а в servaddr в sendto записать сторонний ip?(думаю должен же логически пакет уйти даже если в source destination будут мой ip на входе)

короче попробовал
           struct hostent* hp;
           servaddr.sin_family=AF_INET;
           hp = gethostbyname("192.168.1.15");
           servaddr.sin_addr = *((struct in_addr *)hp->h_addr);
           servaddr.sin_port=0;
не идет...
PM MAIL   Вверх
MAKCim
Дата 1.10.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(ДК2009 @  1.10.2009,  10:50 Найти цитируемый пост)
пробовал прописать в route gateway default но из материалов узнал что на этот сервер пойдет траффик не предназначенный для локального адресата

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0928 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.