[Java / DNS] hoe DNS berichten (de)coderen?

Pagina: 1
Acties:

  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 03-04 12:13
Hallo allemaal,

Op dit moment ben ik bezig een eigen DNS server met logging etc aan het maken. Het probleem is echter dat ik de binnekomende berichten niet kan uitlezen / decoderen. En daarnaast weet ik niet in welke format ik de berichten moet versturen / coderen.

Ik heb nu:
- via DatagramSocket een UDP verbinding op poort 53
- via DatagramPacket kan ik het ip-request binnenkrijgen

en de volgende stappen:
- dit request netjes decoderen en er wat mee doen
- een antwoord formuleren en terug sturen
... krijg ik niet voor elkaar.

het request ziet er in decimale asciiwaardes zo uit:
code:
1
2
3
4
0 47 1 0 0 1 0 0 0 0 0 0 3 87 87 87 6 71 79 79 71 76 69 2 78 76 0 0 1 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... en zo nog een hoop nullen ( 0 )
   en omgezet naar characeters:
 -          www google nl

(zie voor de asciitabel: www.asciitabel.nl)

Ik heb heel veel informatie op Google en GoT kunnen vinden over DNS, zoals het aantal servers, rechten enzo, maar ik kan nergens vinden hoe dus de berichten/verzoeken er letterlijk uit zien. Dus bijv.:


headerurlfeet
20 char130 char3 char


en hoe je deze moet (de)coderen.
Kan iemand me op het goede spoor zetten?

Wie nooit tijd heeft, kan er niet mee omgaan.


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 00:56

Nick_S

++?????++ Out of Cheese Error

Ik neem aan dat je DNS informatie in de RFC's moet zoeken.

FF een linkje erbij gezocht: http://www.dns.net/dnsrd/rfc/. Heb er zelf ook geen verstand van, maar misschien dat je hier iets kan vinden.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nick_S schreef op dinsdag 22 februari 2005 @ 23:16:
Ik neem aan dat je DNS informatie in de RFC's moet zoeken.

FF een linkje erbij gezocht: http://www.dns.net/dnsrd/rfc/. Heb er zelf ook geen verstand van, maar misschien dat je hier iets kan vinden.
Geef dan meteen de juiste RFC :Y)
http://www.faqs.org/rfcs/rfc1035.html

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 00:56

Nick_S

++?????++ Out of Cheese Error

Sorry, zoals ik al zei, heb ik er ook geen verstand van. Het was meer om de topicstarter op het idee te brengen in de RFC's te gaan zoeken.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 03-04 12:13
Beetje veel laat, maar hier is de oplossing

(een klasse die een DNS-request bevat, en op dit moment alleen nog maar de domein-naam teruggeeft)

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package DNS_server;

/**
 * <p>Title: HTTP server & client</p>
 * <p>Description: This class managed one dns-request</p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author Johnny
 * @version 1.0
 */

public class DNSRequest
{
    private final int DNS_LENGTH = 512;
    private final int REQUEST_DOMAIN = 13;
    private byte[] sentence;
    private String domainName;

    /**
     * DNSRequest
     *
     * @param sentence byte[]
     */
    public DNSRequest(byte[] sentence)
    {
        this.sentence = sentence; 
        setRequest();
    }

    /**
     * Returns the domein-name included in the dns-request.
     *
     * @return String
     */
    public String getDomainName()
    {
        return domainName;
    }

    /**
     * Returned a string, repesented the dns-request.
     *
     * @return String
     */
    public String toString()
    {
        String line = "";

        for (int i = 0; i <= sentence.length; i++)
        {
            line += (char)sentence[i];
        }

        return line;

    }

// -------------------      private methods      ------------------------

    /**
     * Sets the current request as global variabele
     */
    private void setRequest()
    {
        int requestLength = determineRequestLength();
        domainName = getBytes(REQUEST_DOMAIN, requestLength);
    }

    /**
     * Returns some bytes as a string of the DNS-Request, starts at a specified
     * place and with a specified length.
     *
     * @param beginAt int
     * @param length int
     * @return String
     */
    private String getBytes(int beginAt, int length)
    {
        String line = "";
        String dot = ".";

        for (int i = beginAt; i <= length; i++)
        {
            if (sentence[i] < 32)
                line += dot;
            else
                line += (char)sentence[i];
        }

        return line;
    }

    /**
     * Returns the length of the requested domain-name.
     * (e.g. www.dns-query.com returns 17)
     *
     * @return int
     */
    private int determineRequestLength()
    {
        for (int i = REQUEST_DOMAIN; i <= DNS_LENGTH; i++)
        {
            if (sentence[i] == 0)
                if (sentence[++i] == 0)
                    if (sentence[++i] == 1)
                        if (sentence[++i] == 0)
                            if (sentence[++i] == 1)
                                return i - 5;
        }
        return DNS_LENGTH - REQUEST_DOMAIN;
    }
}

[ Voor 3% gewijzigd door Black Hawk op 10-05-2010 14:52 ]

Wie nooit tijd heeft, kan er niet mee omgaan.


  • Onno
  • Registratie: Juni 1999
  • Niet online
Sorry dat ik het zeg, maar dit lijkt compleet nergens naar. Waardeloos.

Waarom lees je niet eerst gewoon even de DNS specificaties voordat je DNS requests probeert te ontcijferen? Denk je echt dat je ooit een goede DNS server kunt maken door zomaar te gokken wat de verschillende bytes betekenen? :?

De manier waarop je bepaalt waar het einde van de opgevraagde domeinnaam is wazig (en klopt niet), en het ontcijferen van de domeinnaam zelf lijkt ook nergens naar. Je kunt niet zomaar even alle tekens < 32 door een punt gaan vervangen om er zo een domeinnaam uit te krijgen, vraag maar eens een domeinnaam van meer dan 32 tekens op en het gaat al fout.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Volgens mij gaat het ook fout met international host names (www.ü.de)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1