Можно ли написать пакет, прочитанный libpcap, с помощью libnet? в с?

Я пытаюсь заставить libpcap прочитать файл pcap, заставить пользователя выбрать пакет и записать этот пакет, используя libnet, в c.

Я получил чтение из файловой части сделано. Libpcap помещает этот пакет в константный беззнаковый символ. Я работал с libnet раньше, но никогда не работал с расширенными функциями libnet. Я бы просто создал пакет, используя функции сборки libnet, а затем пустил их в путь. Я понимаю, что есть функция, libnet_adv_write_link() это берет контекст libnet, указатель на пакет для вставки (const uint8_t) и размер пакета. Я попытался передать "пакет", полученный от libpcap, и он скомпилирован и выполнен без ошибок. Тем не менее, я не вижу ничего в Wireshark.

Будет ли это правильным способом решения этой проблемы, или я должен прочитать из libpcap и собрать отдельный пакет с libnet, основываясь на том, что libpcap прочитал?

РЕДАКТИРОВАТЬ: Я думаю, что я несколько решил проблему. Я прочитал пакет с помощью libpcap. Поместите все байты после 16-го байта в другой uchar и записали это в провод. используя libnet_adv_write_raw_ipv4(), libnet инициализируется с помощью LIBNET_RAW4_ADV. Я полагаю, возможно из-за водителя, у меня нет большой власти над слоем ETH. так что в основном я просто позволил этому быть написанным автоматически таким образом, и новый пакет uchar - это то, что осталось после уровня ETH в исходном пакете. Пока работает нормально.

2 ответа

Решение

Я текущий сопровождающий libnet.

Вы должны вызвать libnet_write_link(), чтобы написать пакет. Если вы его не видите, возможно, вы не открыли правильное устройство, у вас нет разрешений (я надеюсь, вы проверили возвращаемое значение libnet_write_link), а также возможно, что введенный пакет был недействительным.

Если вам не нужно собирать пакет, похоже, что для отправки пакета вам следует использовать pcap, см. http://www.tcpdump.org/manpages/pcap_inject.3pcap.html

Кроме того, ваше утверждение "Libpcap помещает этот пакет в константный беззнаковый символ" является странным. Пакет не помещается в один символ, pcap, в зависимости от API, возвращает указатели на данные пакета. Стоит включить фрагмент кода, показывающий, как вы получаете пакет из данных и как вы передаете его в libnet. Возможно, вы не правильно используете указатели.

  1. Если вы используете libpcapпочему бы не использовать libpcap отправить пакет? Нет, это не очень хорошо известно, но да, это работает. Смотрите функцию pcap_sendpacket,

  2. Пакет libpcap return - это просто массив байтов. Все, что занимает массив байтов (включая кадр Ethernet), должно работать. Тем не менее, обратите внимание, что ваша ОС и / или оборудование может помешать вам отправлять пакеты с неверными или искаженными исходными MAC-адресами.

Другие вопросы по тегам