Exemplo n.º 1
0
        public static byte[] CreatePacket(DnsPacket packet)
        {
            var result     = new List <byte>();
            var queryBytes = BitConverter.GetBytes(packet.QueryId);

            Array.Reverse(queryBytes);
            result.AddRange(queryBytes);

            var flags     = DnsFlags.CreateFlags(packet.Flags);
            var flagsByte = BitConverter.GetBytes(flags);

            Array.Reverse(flagsByte);
            result.AddRange(flagsByte);

            var questionsCount = BitConverter.GetBytes((short)packet.Queries.Count);

            Array.Reverse(questionsCount);
            result.AddRange(questionsCount);

            var answersCount = BitConverter.GetBytes((short)packet.Answers.Count);

            Array.Reverse(answersCount);
            result.AddRange(answersCount);

            var authoritativeCount = BitConverter.GetBytes((short)packet.AuthorityAnswers.Count);

            Array.Reverse(authoritativeCount);
            result.AddRange(authoritativeCount);

            var additionalCount = BitConverter.GetBytes((short)packet.AdditionalAnswers.Count);

            Array.Reverse(additionalCount);
            result.AddRange(additionalCount);

            var nameCache = new Dictionary <string, int>();

            foreach (var query in packet.Queries)
            {
                result.AddRange(CreateQuery(query, result.Count, nameCache));
            }
            foreach (var answer in packet.Answers)
            {
                result.AddRange(CreateAnswer(answer, result.Count, nameCache));
            }
            foreach (var answer in packet.AuthorityAnswers)
            {
                result.AddRange(CreateAnswer(answer, result.Count, nameCache));
            }
            foreach (var answer in packet.AdditionalAnswers)
            {
                result.AddRange(CreateAnswer(answer, result.Count, nameCache));
            }

            return(result.ToArray());
        }
Exemplo n.º 2
0
 public static DnsPacket ParsePacket(byte[] packet)
 {
     using (var stream = new MemoryStream(packet))
     {
         using (var reader = new BigEndianBinaryReader(stream, Encoding.BigEndianUnicode))
         {
             var id                     = reader.ReadUInt16();
             var flagsByte              = reader.ReadUInt16();
             var flags                  = DnsFlags.ParseFlags(flagsByte);
             var questionsCount         = reader.ReadUInt16();
             var answersCount           = reader.ReadUInt16();
             var authorityAnswersCount  = reader.ReadUInt16();
             var additionalAnswersCount = reader.ReadUInt16();
             var nameCache              = new Dictionary <int, byte[]>();
             var questions              = new List <DnsQuery>();
             var answers                = new List <DnsAnswer>();
             var additionalAnswers      = new List <DnsAnswer>();
             var authoritativeAnswers   = new List <DnsAnswer>();
             for (var i = 0; i < questionsCount; i++)
             {
                 questions.Add(ParseQuery(reader, packet, (int)reader.BaseStream.Position, nameCache));
             }
             for (var i = 0; i < answersCount; i++)
             {
                 answers.Add(ParseAnswer(reader, packet, (int)reader.BaseStream.Position, nameCache));
             }
             for (var i = 0; i < authorityAnswersCount; i++)
             {
                 authoritativeAnswers.Add(
                     ParseAnswer(reader, packet, (int)reader.BaseStream.Position, nameCache));
             }
             for (var i = 0; i < additionalAnswersCount; i++)
             {
                 additionalAnswers.Add(ParseAnswer(reader, packet, (int)reader.BaseStream.Position, nameCache));
             }
             var result = new DnsPacket
             {
                 QueryId           = id,
                 Flags             = flags,
                 Queries           = questions,
                 Answers           = answers,
                 AuthorityAnswers  = authoritativeAnswers,
                 AdditionalAnswers = additionalAnswers
             };
             return(result);
         }
     }
 }
Exemplo n.º 3
0
        public static DnsPacket CreateSimpleErrorPacket(DnsQuery query, ushort queryId, byte replyCode)
        {
            var flags = new DnsFlags
            {
                RecursionDesired   = true,
                RecursionAvailable = true,
                ReplyCode          = replyCode
            };
            var packet = new DnsPacket
            {
                QueryId = queryId,
                Flags   = flags,
                Queries = new List <DnsQuery> {
                    query
                },
                Answers           = new List <DnsAnswer>(),
                AdditionalAnswers = new List <DnsAnswer>(),
                AuthorityAnswers  = new List <DnsAnswer>()
            };

            return(packet);
        }