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); }
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; }
/// <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; }
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(); } }
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; }
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); }
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; }
public DnsQueryAnswerCName(IDnsNameParser parser, short recordDataLength, int recordDataOffset, byte[] packetContent) { CName = parser.GetNameAtOffset(recordDataOffset); }
public DnsQueryAnswerA(IDnsNameParser parser, short recordDataLength, int recordDataOffset, byte[] packetContent) { IPAddress = new IPAddress(packetContent.Skip(recordDataOffset).Take(recordDataLength).ToArray()); }