LINUX.ORG.RU

как pcap ловит траффик?

 , ,


0

1

здравствуйте, хочу разобраться и написать пет-проект сниффа траффика... интересует как pcap сниффит траффик, по прерыванию сетевой карты или еще как? хочется сделать это с нуля самому без pcap

по прерыванию сетевой карты

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

хочется сделать это с нуля самому без pcap

это будет намного сложнее, т. к. помимо создания raw-сокетов (это-то как раз просто), придётся ещё парсить и компилировать bpf-выражения.

aureliano15 ★★
()

по прерыванию сетевой карты

прерывания - это прерогатива ядра. А pcap и сырые сокеты работают в юзерспейсе, хоть и от рута.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

придётся ещё парсить и компилировать bpf-выражения

хм, чет я про это не подумал... а во что это добро компилируется? глянул мельком в гугле, чет туманно про это написано

xperious ★★
() автор топика

Да не, там не сложно. Делаешь настройки сокета в формат af_packet. man 7 packet. В protocol устанавливаешь ETH_P_ALL. Если не заработает, из-за устройства, то надо заполнить структуру sockaddr_ll и в этой структуре указать ssl_ifindex = if_nametoindex ( «wlan0» );. А потом создаёшь обычный буфер символьный и принимаешь через read. Чтобы разобрать что есть что, делаешь указатель ether заголовка на начало буфера, там узнаешь наверное тип пакета. А вообще посмотри какой формат pcap файла, именно заголовок с магическим номером. Я как то делал, использовал их формат сохранения, и он отлично работал. Сохранял всё принятое в файл, а потом его открывал в wireshark и смотрел какие пакеты были.

u0atgKIRznY5
()
Ответ на: комментарий от u0atgKIRznY5

спасибо, правда про AF_PACKET первый раз слышу...

xperious ★★
() автор топика
Ответ на: комментарий от xperious

bpf-выражения

а во что это добро компилируется?

Это набор числовых констант BPF_*, записываемых в структуру struct bpf_program (определены в заголовке <pcap/bpf.h>, макросы ещё определены в <linux/filter.h>, но структуры там нет), представляющие из себя псевдо-ассемблер для задания фильтров для прослушки. Если писать сразу на этом ассемблере, то ничего компилировать не придётся. А если делать по-человечески, как в утилите tcpdump, то выражение «src port НОМЕР and dst port ДРУГОЙ_НОМЕР» для прослушки только трафика от src-порта к dst-порту, придётся откомпилировать в bpf-ассемблер, после чего передать указатель на структуру bpf_program в setsockopt. Можно, конечно, сделать совсем просто: тупо слушать абсолютно весь трафик. Тогда фильтры не нужны. Но производительность сильно упадёт, ведь весь трафик, нужный и не нужный, будет гоняться между ядром и сырым сокетом.

aureliano15 ★★
()

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

amd_amd ★★★★★
()
Ответ на: комментарий от xperious

подход с raw-сокетом и bpf ортогонален к предложению с сокетами типа AF_PACKET?

Пакетные сокеты - более низкого уровня. На сырых ты можешь слушать трафик tcp, udp и т. д., а на канальном уровне - вообще ip и даже больше - вообще любые сетевые протоколы (если у тебя есть что-то помимо tcp/ip, например ipx).

aureliano15 ★★
()
Ответ на: комментарий от xperious

ловить хотел

Вообще есть готовые удобные решения: tcpdump, tethereal, wireshark для захвата всего трафика с учётом bpf-фильтров. Или ngrep для захвата только того, что соответствует регулярке в стиле grep.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

канальном уровне

на пакетных сокетах, блин. А семиуровневые модели - ф топку, они только путают.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

На сырых ты можешь слушать трафик tcp, udp

ну в идеале я хотел как wireshark чтоб - переключаться только по интерфейсам, а слушать вообще начиная с ethernet, чтоб mac-адрес, например, отправителя увидеть(хотя не помню можно ли это увидеть в ethernet-кадрах)

xperious ★★
() автор топика

Ну кинули же вам линк на соус libpcap. Что-то в коде не понятно? Или тут кружок юных сниферов-теоретиков? В толксы! Либо давайте код, который у вас не работает и будем говорить по существу.

anonymous
()
Ответ на: комментарий от xperious

слушать вообще начиная с ethernet, чтоб mac-адрес, например, отправителя увидеть(хотя не помню можно ли это увидеть в ethernet-кадрах)

Можно, в пакетных сокетах или с помощью pcap.

да чет много исходников, я думал там поменьше будет

Начинай от простого и двигайся к сложному.

Кстати, если ты книги ищешь, рекомендую ещё поискать книгу Склярова «Программирование боевого софта под Linux».

aureliano15 ★★
()
Ответ на: комментарий от xperious

читать такие исходники походу не мой уровень... либо надо знать где там что находится

Скачай dbg-версию и запусти в пошаговом режиме, всё сразу станет ясно. Ну, может не сразу, но ясно.

aureliano15 ★★
()
Ответ на: комментарий от xperious

Так в этом и цель - узнать где что находится, что с чем взаимодействует, какие ситуации обрабатывает, какие ошибки предотвращает. Все ответы есть в коде! Да, это не просто, но нельзя стать мастером не прилагая усилий или трудясь в полсилы. Ты же этот проект затеял, чтобы чему-то научиться - так вперед! Трудностей бояться глупо, не для того нам страх природой дан.

anonymous
()
Ответ на: комментарий от aureliano15

А боль дана, чтобы страдать? :)

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

anonymous
()
Ответ на: комментарий от anonymous

спасибо за воодушевление, но пока это нецелесообразно имхо

xperious ★★
() автор топика
Ответ на: комментарий от xperious

Ты их не читай, а под отладчиком погоняй.

pon4ik ★★★★★
()

Я еще давным-давно в одной далекой-далекой галактике (2013)... писал свой минималистичный сниффер на raw сокетах, если надо, можешь посмотреть код: тыц

maxis11
()

всем спасибо за ответы

xperious ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.