예제 #1
0
 public DnsQueryQuestion(IDnsNameParser parser, byte[] packetContent, int startingOffset, int questionLength)
     : this()
 {
     Name = parser.GetNameAtOffset(startingOffset);
     Bytes = null;
     RecordType = (DnsRecordType)BitConverter.ToInt16(new byte[] { packetContent[startingOffset + questionLength - 3], packetContent[startingOffset + questionLength - 4] }, 0);
     RecordClass = (DnsRecordClass)BitConverter.ToInt16(new byte[] { packetContent[startingOffset + questionLength - 1], packetContent[startingOffset + questionLength - 2] }, 0);
 }
예제 #2
0
        private IDnsQueryAnswer GetDnsQueryAnswer(IDnsNameParser parser, DnsName name, DnsRecordType recordType, DnsRecordClass recordClass, UInt32 ttl, short recordDataLength, int recordDataOffset, byte[] packetContent)
        {
            var answer = GetDnsQueryAnswer(parser, recordType, recordDataLength, null, packetContent, recordDataOffset);
            answer.Name = name;
            answer.RecordType = recordType;
            answer.RecordClass = recordClass;
            answer.Ttl = ttl;
            answer.RecordDataLength = recordDataLength;
            //answer.RecordData = recordData;

            return answer;
        }
예제 #3
0
파일: DnsName.cs 프로젝트: robertwray/Dns
        /// <summary>
        /// 
        /// </summary>
        /// <param name="packetContent"></param>
        /// <param name="startingOffset">The starting offset of the name, the value of the length of the first name part</param>
        public DnsName(IDnsNameParser parser, byte[] packetContent, int startingOffset)
            : this()
        {
            var host = new StringBuilder();
            var numberOfCharactersInCurrentNameSection = Convert.ToInt32(packetContent[startingOffset]);
            var i = startingOffset + 1;
            while (packetContent[i] != 0 && i < packetContent.Length - 1)
            {
                var twoBytes = packetContent.Skip(i).Take(2);

                var twoBytesAsBits = new BitArray(twoBytes.Reverse().ToArray());

                if (twoBytesAsBits[14] && twoBytesAsBits[15])
                {
                    // We have a "pointer"
                    var name = parser.GetNameAtOffset(twoBytes.Last());
                    if (host.Length != 0)
                    {
                        host.Append(".");
                    }
                    host.Append(name);
                    break;
                }

                if (numberOfCharactersInCurrentNameSection > 0)
                {
                    host.Append(Convert.ToChar(packetContent[i]));
                    numberOfCharactersInCurrentNameSection--;
                }
                else
                {
                    if (packetContent[i] == 0)
                    {
                        break;
                    }
                    else
                    {
                        host.Append(".");
                        numberOfCharactersInCurrentNameSection = Convert.ToInt32(packetContent[i]);
                    }
                }
                i++;
            }
            Host = host.ToString();
            Bytes = packetContent;
        }
예제 #4
0
 private IDnsQueryAnswer GetDnsQueryAnswer(IDnsNameParser parser, DnsRecordType recordType, short recordDataLength, byte[] recordData, byte[] packetContent, int recordDataOffset)
 {
     switch (recordType)
     {
         case DnsRecordType.A:
             return new DnsQueryAnswerA(parser, recordDataLength, recordDataOffset, packetContent);
         case DnsRecordType.CNAME:
             return new DnsQueryAnswerCName(parser, recordDataLength, recordDataOffset, packetContent);
         case DnsRecordType.MX:
             return new DnsQueryAnswerMx(parser, recordDataLength, recordDataOffset, packetContent);
         case DnsRecordType.NS:
             return new DnsQueryAnswerNS(parser, recordDataLength, recordDataOffset, packetContent);
         case DnsRecordType.AAAA:
         case DnsRecordType.SRV:
         default:
             return new DnsQueryAnswerGeneric();
     }
 }
예제 #5
0
        public IDnsQueryAnswer GetDnsQueryAnswer(IDnsNameParser parser, byte[] packetContent, ref int startOfAnswer)
        {
            IDnsQueryAnswer answer = null;
            var twoBytes = packetContent.Skip(startOfAnswer).Take(2);
            var twoBytesAsBits = new BitArray(twoBytes.Reverse().ToArray());
            if (twoBytesAsBits[14] && twoBytesAsBits[15])
            {
                // We have a "pointer"
                var name = parser.GetNameAtOffset(twoBytes.Last());
                var recordType = (DnsRecordType)BitConverter.ToInt16(packetContent.Skip(startOfAnswer + 2).Take(2).Reverse().ToArray(), 0);
                var recordClass = (DnsRecordClass)BitConverter.ToInt16(packetContent.Skip(startOfAnswer + 4).Take(2).Reverse().ToArray(), 0);
                var ttl = BitConverter.ToUInt32(packetContent.Skip(startOfAnswer + 6).Take(4).Reverse().ToArray(), 0);
                var rDataLength = BitConverter.ToInt16(packetContent.Skip(startOfAnswer + 10).Take(2).Reverse().ToArray(), 0);

                var recordDataOffset = startOfAnswer + 12;

                answer = GetDnsQueryAnswer(parser, name, recordType, recordClass, ttl, rDataLength, recordDataOffset, packetContent);

                startOfAnswer = startOfAnswer + 12 + rDataLength;
            }
            return answer;
        }
예제 #6
0
 public DnsQueryAnswerMx(IDnsNameParser parser, short recordDataLength, int recordDataOffset, byte[] packetContent)
 {
     Preference = BitConverter.ToInt16(packetContent.Skip(recordDataOffset).Take(2).ToArray(), 0);
     MxName = parser.GetNameAtOffset(recordDataOffset + 2);
 }
예제 #7
0
파일: DnsQuery.cs 프로젝트: robertwray/Dns
 private DnsQueryQuestion ExtractQuestion(IDnsNameParser parser, byte[] packetContent, ref int startOfQuestion)
 {
     DnsQueryQuestion? question = null;
     for (int i = startOfQuestion; i < packetContent.Length; i++)
     {
         // We've found the null that terminates
         if (packetContent[i] == 0)
         {
             var endOfQuestion = i + 5;
             question = new DnsQueryQuestion(parser, packetContent, startOfQuestion, (i + 5) - startOfQuestion);
             startOfQuestion = endOfQuestion + 1;
             break;
         }
     }
     return question.Value;
 }
예제 #8
0
 public DnsQueryAnswerCName(IDnsNameParser parser, short recordDataLength, int recordDataOffset, byte[] packetContent)
 {
     CName = parser.GetNameAtOffset(recordDataOffset);
 }
예제 #9
0
 public DnsQueryAnswerA(IDnsNameParser parser, short recordDataLength, int recordDataOffset, byte[] packetContent)
 {
     IPAddress = new IPAddress(packetContent.Skip(recordDataOffset).Take(recordDataLength).ToArray());
 }