Как я могу захватывать dns-пакеты в c? - PullRequest
2 голосов
/ 04 августа 2020

Я пишу программу сниффера пакетов на c. Теперь он может находить только HTTP пакетов, но я хочу сделать так, чтобы получать также DNS пакетов. Я знаю, что DNS пакеты - это UDP, но я не знаю, как идентифицировать DNS пакеты. Есть ли в пакетах DNS особая c вещь, которую нужно проверять, чтобы найти? Я знаю, что порт 53 - это порт по умолчанию для запросов DNS, но надежный ли это способ их найти?

1 Ответ

1 голос
/ 04 августа 2020

Нет хорошего способа определить, содержит ли пакет 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.

В зависимости от от того, как вы захватываете пакеты и как вы их сохраняете, вам может потребоваться изменить порядок байтов в структуре. Если вы проверяете это с помощью своей программы, и у нее нет нужных данных или данные меняются местами, дайте мне знать.

...