#c #networking #pcap #libpcap #arp
#c #сеть #pcap #libpcap #arp
Вопрос:
Я пытаюсь использовать pcap
библиотеку для перехвата пакетов. До сих пор мне удавалось перехватывать IP-и ARP-пакеты из трафика моей локальной сети. Теперь я хочу отправить запрос ARP на сервер шлюза по умолчанию. Я не уверен, но я думаю, что мне придется использовать pcap_sendpacket
функцию. Я не понимаю, как создать запрос arp, потому что, когда я проверил arphdr
структуру, определенную в net/if_arp.h
, это что-то вроде этого:
struct arphdr
{
unsigned short int ar_hrd; /* Format of hardware address. */
unsigned short int ar_pro; /* Format of protocol address. */
unsigned char ar_hln; /* Length of hardware address. */
unsigned char ar_pln; /* Length of protocol address. */
unsigned short int ar_op; /* ARP opcode (command). */
#if 0
/* Ethernet looks like this : This bit is variable sized
however... */
unsigned char __ar_sha[ETH_ALEN]; /* Sender hardware address. */
unsigned char __ar_sip[4]; /* Sender IP address. */
unsigned char __ar_tha[ETH_ALEN]; /* Target hardware address. */
unsigned char __ar_tip[4]; /* Target IP address. */
#endif
};
Как видно, аппаратный адрес находится в #if 0..#endif
блоке, что означает, что он фактически закомментирован. Я не понимаю, почему это делается таким образом. Чтобы отправить запрос ARP, я должен заполнить эти поля. Может кто-нибудь дать какие-либо предложения о том, как отправить один запрос ARP с помощью pcap_sendpacket и заполнить эти поля в arphdr?
Комментарии:
1. Вам действительно нужно понимать ARP, и это объясняется в RFC 826, протоколе разрешения адресов Ethernet , который является определением ARP. Каждое поле объясняется.
2. @RonMaupin Не могли бы вы рассказать мне, как заполнить поля заголовка arp. Предоставленная вами ссылка объясняет протокол ARP в целом… но я не нашел ответа на свой вопрос.
3. По сути, вы вводите необходимую информацию: аппаратные и протокольные адреса и длины, а также код операции для запроса. Точно так же, как это объясняется в RFC. Я не понимаю, в чем проблема.
4. В этом определении заголовка часть аппаратного адреса была закомментирована в самой системной библиотеке. Поле __ar_sha не может быть использовано. Как тогда заполнить аппаратный адрес?