Example #1
0
        public static byte[] CreateAnswer(DnsAnswer answer, int position, Dictionary <string, int> cache)
        {
            var result        = new List <byte>();
            var encodedDomain = EncodeDomain(answer.Name, position, cache, false);

            result.AddRange(encodedDomain);

            var type      = (short)answer.AnswerType;
            var typeBytes = BitConverter.GetBytes(type);

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

            var classValue = (short)answer.Class;
            var classBytes = BitConverter.GetBytes(classValue);

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

            var ttlBytes = BitConverter.GetBytes(answer.TTL);

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

            byte[] dataBytes;
            if (answer.AnswerType == AnswerType.A)
            {
                dataBytes = IPAddress.Parse(answer.Data).GetAddressBytes();
            }
            else if (answer.AnswerType == AnswerType.NS)
            {
                dataBytes = EncodeDomain(answer.Data, position + result.Count, cache, true);
            }
            else
            {
                dataBytes = new byte[0];
            }
            var length      = (ushort)dataBytes.Length;
            var lengthBytes = BitConverter.GetBytes(length);

            Array.Reverse(lengthBytes);
            result.AddRange(lengthBytes);
            result.AddRange(dataBytes);
            return(result.ToArray());
        }
Example #2
0
        private static DnsAnswer ParseAnswer(BinaryReader reader, byte[] packet, int position,
                                             Dictionary <int, byte[]> nameCache)
        {
            var(domain, shift) = ParseDomain(packet, position, nameCache);
            var _          = reader.BaseStream.Seek(shift, SeekOrigin.Begin);
            var type       = (AnswerType)reader.ReadUInt16();
            var queryClass = (Class)reader.ReadUInt16();
            var ttl        = reader.ReadUInt32();
            var dataLength = reader.ReadUInt16();
            var data       = "";

            if (type == AnswerType.A)
            {
                var dataArray = new List <byte>();
                for (var i = 0; i < dataLength; i++)
                {
                    dataArray.Add(reader.ReadByte());
                }
                data = string.Join(".", dataArray.Select(item => item.ToString()));
            }
            else if (type == AnswerType.NS)
            {
                var(name, nsShift) = ParseDomain(packet, (int)reader.BaseStream.Position, nameCache);
                var __ = reader.BaseStream.Seek(nsShift, SeekOrigin.Begin);
                data = name;
            }
            else if (type == AnswerType.SOA)
            {
                data = "";
            }
            var answer = new DnsAnswer
            {
                Class      = queryClass,
                AnswerType = type,
                Name       = domain,
                TTL        = ttl,
                Data       = data
            };

            return(answer);
        }