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