Beispiel #1
0
            public DnsResponse(IDnsResponse response)
            {
                header            = new DnsHeader();
                Questions         = new List <DnsQuestion>(response.Questions);
                AnswerRecords     = new List <IDnsResourceRecord>(response.AnswerRecords);
                AuthorityRecords  = new List <IDnsResourceRecord>(response.AuthorityRecords);
                AdditionalRecords = new List <IDnsResourceRecord>(response.AdditionalRecords);

                header.Response = true;

                Id = response.Id;
                IsRecursionAvailable = response.IsRecursionAvailable;
                IsAuthorativeServer  = response.IsAuthorativeServer;
                OperationCode        = response.OperationCode;
                ResponseCode         = response.ResponseCode;
            }
Beispiel #2
0
        /// <summary>
        /// Parses Bytes from DNS to IDnsPacket Object
        /// </summary>
        /// <param name="data"></param>
        /// <param name="sendDnsPacket"></param>
        /// <returns></returns>
        public static IDnsPacket Parse(byte[] data, SendDnsPacket sendDnsPacket)
        {
            IDnsHeader header = DnsHeader.Parse(data.Take(12).ToArray()); //Take First 12x Bytes which should always equal to DNS header

            if (header.Parameters.Response != ResponseCode.Ok)            //If other response to OK, then return.
            {
                return(new ReceiveDnsPacket(header, sendDnsPacket.Questions, null));
            }

            int byteCount = 12;                                                             //Amount of bytes before answer (Start with header)

            sendDnsPacket.Questions.ToList().ForEach(n => byteCount += n.ToBytes().Length); //Question Byte Count
            byte[] answerArr = data.TakeLast(data.Length - byteCount).ToArray();            //Extracts answers from data

            IEnumerable <IResource> answers = Resource.Parse(data, new ReceiveDnsPacket(header, sendDnsPacket.Questions, null));

            return(new ReceiveDnsPacket(header, sendDnsPacket.Questions, answers));
        }
Beispiel #3
0
        /// <summary>
        /// Create new header from byte reader.
        /// </summary>
        public static DnsHeader FromByteReader(ByteReader byteReader)
        {
            var header = new DnsHeader();

            header.ID     = byteReader.GetUshort();
            header.QR     = byteReader.GetBits(1);
            header.OPCODE = byteReader.GetBits(4);
            header.AA     = byteReader.GetBits(1);
            header.TC     = byteReader.GetBits(1);
            header.RD     = byteReader.GetBits(1);

            header.RA    = byteReader.GetBits(1);
            header.Z     = byteReader.GetBits(3);
            header.RCODE = byteReader.GetBits(4);

            header.QDCOUNT = byteReader.GetUshort();
            header.ANCOUNT = byteReader.GetUshort();
            header.NSCOUNT = byteReader.GetUshort();
            header.ARCOUNT = byteReader.GetUshort();

            return(header);
        }
 private string GetCacheKey(DnsHeader header) => $"{header.Host}~{header.QueryType}~{header.QueryClass}";
Beispiel #5
0
        private void ProcessUdpRequestAsync(object parameter)
        {
            object[] parameters = parameter as object[];

            EndPoint    remoteEP = parameters[0] as EndPoint;
            DnsDatagram request  = parameters[1] as DnsDatagram;

            try
            {
                DnsDatagram response = ProcessQuery(request, remoteEP);

                //send response
                if (response != null)
                {
                    byte[]       sendBuffer       = new byte[512];
                    MemoryStream sendBufferStream = new MemoryStream(sendBuffer);

                    try
                    {
                        response.WriteTo(sendBufferStream);
                    }
                    catch (NotSupportedException)
                    {
                        DnsHeader header = response.Header;
                        response = new DnsDatagram(new DnsHeader(header.Identifier, true, header.OPCODE, header.AuthoritativeAnswer, true, header.RecursionDesired, header.RecursionAvailable, header.AuthenticData, header.CheckingDisabled, header.RCODE, header.QDCOUNT, 0, 0, 0), response.Question, null, null, null);

                        sendBufferStream.Position = 0;
                        response.WriteTo(sendBufferStream);
                    }

                    //send dns datagram
                    _udpListener.SendTo(sendBuffer, 0, (int)sendBufferStream.Position, SocketFlags.None, remoteEP);

                    LogManager queryLog = _queryLog;
                    if (queryLog != null)
                    {
                        queryLog.Write(remoteEP as IPEndPoint, false, request, response);
                    }

                    StatsManager stats = _stats;
                    if (stats != null)
                    {
                        stats.Update(response, (remoteEP as IPEndPoint).Address);
                    }
                }
            }
            catch (Exception ex)
            {
                LogManager queryLog = _queryLog;
                if (queryLog != null)
                {
                    queryLog.Write(remoteEP as IPEndPoint, false, request, null);
                }

                LogManager log = _log;
                if (log != null)
                {
                    log.Write(remoteEP as IPEndPoint, ex);
                }
            }
        }