2012-11-21 2 views
0

브라우저에 보낼 DNS 응답을 만들고 싶습니다. 나는 RFC처럼 어떤 구조체를 만들었습니다 DNS 응답 메시지 생성

//DNS header 
struct DNS_HEADER 
{ 
    unsigned short id; 
    unsigned char rd :1; 
    unsigned char tc :1; 
    unsigned char aa :1; 
    unsigned char opcode :4; 
    unsigned char qr :1; 

    unsigned char rcode :4; 
    unsigned char cd :1; 
    unsigned char ad :1; 
    unsigned char z :1; 
    unsigned char ra :1; 

    unsigned short q_count; 
    unsigned short ans_count; 
    unsigned short auth_count; 
    unsigned short add_count; 
}; 

#pragma pack(push, 1) 
struct R_DATA 
{ 
    unsigned short type; 
    unsigned short _class; 
    unsigned int ttl; 
    unsigned short data_len; 
}; 
#pragma pack(pop) 

struct RES_RECORD 
{ 
    unsigned char *name; 
    struct R_DATA *resource; 
    unsigned char *rdata; 
}; 

지금 내가 올바른 DNS 응답을 보낼 수 있도록이 구조체 채우기 위해 노력하고있어. ipaddres 112.12.12.12 (예 : 재미 만)와 함께 예를 들어 www.google.com을 보내려고합니다. .

내가 무엇을 가지고 : 또한

dns = (DNS_HEADER*)malloc(sizeof(DNS_HEADER)); 
dns->id = (unsigned short) htons(GetCurrentProcessId()); // ID 
dns->qr = 1; // We give a response, Volgens RFC: (= query (0), or a response (1).) 
dns->opcode = 0; // default 
dns->aa = 0; //Not Authoritative,RFC: (= Authoritative Answer - this bit is valid in responses, and specifies that the responding name server is an authority for the domain name in question section.) 
dns->tc = 0; // Not truncated 
dns->rd = 1; // Enable recursion 
dns->ra = 0; // Nameserver supports recursion? 
dns->z = 0; // RFC: (= Reserved for future use. Must be zero in all queries and responses.) 
dns->rcode = 0; // No error condition 
dns->q_count = 0; // No questions! 
dns->ad = 0; // How man resource records? 
dns->cd = 0; // !checking 
dns->ans_count = 1; // We give 1 answer 
dns->auth_count = 0; // How many authority entries? 
dns->add_count = 0; // How many resource entries? 

을하지만 보시다시피 난에 기입 할 작업에 대한 몇 가지 질문이있어 R_Data 및 res_record은 내가 RFC를 통해 찾을 수없는 것을 무작위 응답을 작성하려면 ...

누군가가 도와 줄 수 있습니까?

답변

0

몇 가지 간단한 정보 : 응답에서 id은 쿼리에서받은 ID 여야합니다. q_count은 1이어야하고받은 검색어를 반복해야합니다 (예 : \x03www\x06google\x03com\x00\x00\x01\x00\x01www.google.com IN A). rdata에 들어가야 할 사항은 RFC1035 3.4.1 절에 설명되어 있습니다 (예 : \x70\x0c\x0c\x0c).

0

귀하의 접근 방법은 근본적으로 결함이 있습니다. 구조체로 DNS 패킷을 표현할 수 없습니다. 왜냐하면 DNS 패킷의 문자열은 가변 길이입니다. 즉, 문자열 뒤에 나오는 필드는 앞의 문자열 길이에 따라 패킷의 다른 오프셋에 위치합니다.

구조체에는 각 문자열 대신 char 포인터가 있으며 일반적으로 각 포인터는 메모리의 다른 위치를 가리키는 32 비트 값입니다. 따라서 메모리에 표시된대로 구조체를 보내려고하면 문자열 대신 무작위 32 비트 값을 전송하게됩니다.

다음은 DNS 패킷의 모양에 대한 설명 가이드입니다. http://www.tcpipguide.com/free/t_DNSMessageProcessingandGeneralMessageFormat.htm