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; }
/// <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)); }
/// <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}";
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); } } }