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