Захват ответов DNS с pcap.net?
Вопрос
Q1 - возможно ли захватить запрос / ответы DNS с библиотекой?
Q2 - Если да, как только у меня есть пакет, у кого-нибудь есть любой образец код, который показывает, как я могу извлечь поля из ответа DNS? В частности, IP-адрес, который DNS разрешен для данного имени DNS, представленного в частности.
Решение
Да, это возможно.
Образец кода будет немного на длинной стороне, хотя ...
По сути, вам нужно:
- Извлечь заголовок Ethernet
- Извлеките заголовок IP
- Извлеките заголовок UDP [при условии, что пакет не фрагментирован или использует TCP
- Извлечь полезную нагрузку DNS
затем обрабатывать остальную часть пакета в соответствии с очень тщательным описанием, приведенным в RFC 1035..
На практике это означает:
- Игнорировать запросы - вся необходимая информация, которая вам нужна в ответах (
QR == 1
) - проверить
RCODE == 0
иANCOUNT > 0
- посмотреть в Вопрос раздел, чтобы найти имя, которое было запрошено
- Ищите ответы в Отвечать (Дух!) Раздел
Чтобы еще больше усложнить вопросы, вы должны обрабатывать этикетки DNS (серия <count><data...>
Поля) и потенциально обрабатывают сжатые этикетки тоже!
Это звучит неприятно, но ничто из этого на самом деле тот жесткий. У меня есть код C ++, который делает все это, и это не так долго, но я не могу его выпустить.