Нет хорошего способа определить, содержит ли пакет UDP
данные DNS
: в заголовке UDP
или заголовке IP
нет ничего, что прямо сообщало бы вам, что это данные DNS
. Однако вы могли бы сделать первый посмотреть, является ли исходный порт в заголовке UDP
порт 53 (DNS's
стандартный UDP
порт) и второй посмотрите, соответствуют ли данные структуре данных, которую вы используете для декодирования заголовка (скорее всего, структура). Это очень хороший вопрос.
Чтобы подогнать пакет под strcut, вы можете использовать следующий код:
Это фактическая структура пакета заголовка DNS, размещенная в структуре в c:
#pragma pack(push, 1)
typedef struct
{
uint16_t id; // identification number 2b
uint8_t rd : 1; // recursion desired
uint8_t tc : 1; // truncated message
uint8_t aa : 1; // authoritive answer
uint8_t opcode : 4; // purpose of message
uint8_t qr : 1; // query/response flag
uint8_t rcode : 4; // response code
uint8_t cd : 1; // checking disabled
uint8_t ad : 1; // authenticated data
uint8_t z : 1; // its z! reserved
uint8_t ra : 1; // recursion available 4b
uint16_t q_count; // number of question entries 6b
uint16_t ans_count; // number of answer entries 8b
uint16_t auth_count; // number of authority entries 10b
uint16_t add_count; // number of resource entries 12b
}Dns_Header, *Dns_Header_P;
#pragma pack(pop)
Чтобы проверить это, вы можете сделать следующее:
Dns_Header_P header = (Dns_Header_P)capture;
capture
это массив байтов с заголовком DNS
.
В зависимости от от того, как вы захватываете пакеты и как вы их сохраняете, вам может потребоваться изменить порядок байтов в структуре. Если вы проверяете это с помощью своей программы, и у нее нет нужных данных или данные меняются местами, дайте мне знать.