0

ブラウザに送信する DNS 応答を作成したいと考えています。rfc のような構造体をいくつか作成しました。

//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 応答を送信できるように、この構造体に入力しようとしています。たとえば、www.google.com を ipadres 112.12.12.12 で送信しようとしています (楽しみのため)。

これは私が持っているものです:

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 経由で見つけることができません...

誰かがこれで私を助けることができますか?

4

2 に答える 2

0

一目でわかるいくつかのポイント:id応答には、クエリで受け取った ID が必要です。q_countは 1 で、受け取ったクエリを繰り返します (例では\x03www\x06google\x03com\x00\x00\x01\x00\x01for になりますwww.google.com IN A)。何を入力する必要があるかrdataは、RFC1035 セクション 3.4.1 で説明されています (あなたの例では\x70\x0c\x0c\x0c)。

于 2013-04-25T05:03:25.970 に答える
0

あなたのアプローチには根本的な欠陥があります。DNS パケットの文字列は可変長であるため、DNS パケットを構造体で表現することはできません。つまり、文字列に続くフィールドは、前の文字列の長さに応じてパケット内の異なるオフセットになります。

構造体には各文字列の代わりに文字ポインターがあり、各ポインターは通常、メモリ内の他の場所を指す 32 ビット値です。したがって、メモリ内で表現されている構造体を送信しようとすると、文字列の代わりに多かれ少なかれランダムな 32 ビット値が送信されます。

以下は、DNS パケットがどのように見えるべきかについてのかなり説明的なガイドです: http://www.tcpipguide.com/free/t_DNSMessageProcessingandGeneralMessageFormat.htm

于 2013-09-11T11:53:27.813 に答える