DnsMessageBase ProcessQuery(DnsMessageBase message, IPAddress clientAddress, ProtocolType protocol) { message.IsQuery = false; DnsMessage query = (DnsMessage)message; if (query != null) { bool replicate = ReplicateAnswer; bool has_answer = false; foreach (DnsQuestion question in query.Questions) { if (StringHelper.Like(LogPattern, question.Name)) { string path = DumpFolder.FullName + System.IO.Path.DirectorySeparatorChar + DateTime.Now.ToString("yyyy-MM-dd") + ".log"; string[] lines = new string[] { DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\t" + question.Name + "\t" + clientAddress.ToString() }; lock (this) { File.AppendAllLines(path, lines); } if (!LogReplicate) { replicate = false; } else { replicate = true; } } if (replicate) { DnsMessage answer = DnsClient.Default.Resolve(question.Name, question.RecordType, question.RecordClass); // if got an answer, copy it to the message sent to the client if (answer != null) { has_answer = true; foreach (DnsRecordBase record in (answer.AnswerRecords)) { query.AnswerRecords.Add(record); } foreach (DnsRecordBase record in (answer.AdditionalRecords)) { query.AnswerRecords.Add(record); } } } else { switch (question.RecordType) { case RecordType.A: { if (clientAddress.AddressFamily == AddressFamily.InterNetwork) { query.ReturnCode = ReturnCode.NoError; query.AnswerRecords.Add(new ARecord(question.Name, 1000, clientAddress)); return(query); } break; } case RecordType.Aaaa: { if (clientAddress.AddressFamily == AddressFamily.InterNetworkV6) { query.ReturnCode = ReturnCode.NoError; query.AnswerRecords.Add(new AaaaRecord(question.Name, 1000, clientAddress)); return(query); } break; } } } } if (has_answer) { query.ReturnCode = ReturnCode.NoError; return(query); } } // Not a valid query or upstream server did not answer correct message.ReturnCode = ReturnCode.ServerFailure; return(message); }
internal static void EncodeDateTime(byte[] buffer, ref int currentPosition, DateTime value) { int timeStamp = (int)(value.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds; DnsMessageBase.EncodeInt(buffer, ref currentPosition, timeStamp); }
internal InvalidSignedMessageEventArgs(DnsMessageBase message) { Message = message; }
internal override void ParseRecordData(byte[] resultData, int startPosition, int length) { Preference = DnsMessageBase.ParseUShort(resultData, ref startPosition); IntermediateHost = DnsMessageBase.ParseDomainName(resultData, ref startPosition); }
internal override void ParseRecordData(byte[] resultData, int startPosition, int length) { RecordData = DnsMessageBase.ParseByteData(resultData, ref startPosition, length); }
internal override void ParseRecordData(byte[] resultData, int startPosition, int length) { Preference = DnsMessageBase.ParseUShort(resultData, ref startPosition); NodeID = DnsMessageBase.ParseULong(resultData, ref startPosition); }
internal override void EncodeData(byte[] messageData, ref int currentPosition) { DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, Payload); }
internal override void ParseRecordData(byte[] resultData, int startPosition, int length) { Address = new IPAddress(DnsMessageBase.ParseByteData(resultData, ref startPosition, 16)); }
DnsMessageBase ProcessQuery(DnsMessageBase message, IPAddress clientAddress, ProtocolType protocol) { message.IsQuery = false; DnsMessage query = message as DnsMessage; ret1 : repcnt++; if ((query != null) && (query.Questions.Count == 1)) { // send query to upstream server DnsQuestion question = query.Questions[0]; Random rnd = new Random(); ret2 : if (enb == null) { InitDNS(); goto ret2; } else { //if (question.Name.Contains("xaapi")) //{ // message.ReturnCode = ReturnCode.ServerFailure; // return message; //} var tt = from q in hash where q.key == question.Name select q; if (tt.Any()) { tts = DateTime.Now - tt.ToList()[0].lastupdtime; if (tts.TotalHours > 12) { tt.ToList()[0].answer = null; } //WriteToConsole(question.Name + " returned from hash"); if (tt.ToList()[0].answer != null) { tt.ToList()[0].selected++; return(tt.ToList()[0].answer); } } WriteToConsole(question.Name); templ.Clear(); for (int i = 0; i < retcnt; i++) { ret3 : var q = WeightedRandomization.Choose(enb); if (!templ.Contains(q)) { templ.Add(q); } else { goto ret3; } } System.Threading.Tasks.Parallel.ForEach(templ, (site, state) => { WriteToConsole("Get Info for " + question.Name + " from: " + site.IP); DnsClient cd = new DnsClient(IPAddress.Parse(site.IP), 1000); DnsMessage answer = cd.Resolve(question.Name, question.RecordType, question.RecordClass); if (answer != null) { foreach (DnsRecordBase record in (answer.AnswerRecords)) { lock (query) { query.AnswerRecords.Add(record); } site.Selects++; } foreach (DnsRecordBase record in (answer.AdditionalRecords)) { lock (query) { query.AnswerRecords.Add(record); } site.Selects++; } lock (query) { //site.Weight--; query.ReturnCode = ReturnCode.NoError; } if (tt.Any()) { tt.ToList()[0].answer = query; tt.ToList()[0].lastupdtime = DateTime.Now; tt.ToList()[0].selected++; } else { var t = new hashitem(question.Name, query); lock (hash) { hash.Add(t); if (frst) { qsample = question; frst = false; } } } state.Break(); } }); System.Threading.Tasks.Parallel.ForEach(templ, (site, state) => { WriteToConsole("Get Info from: " + site.IP); DnsClient cd = new DnsClient(IPAddress.Parse(site.IP), 1000); DnsMessage answer = cd.Resolve(question.Name, question.RecordType, question.RecordClass); if (answer != null) { foreach (DnsRecordBase record in (answer.AnswerRecords)) { lock (query) { query.AnswerRecords.Add(record); } site.Selects++; WriteToConsole(record.Name); } foreach (DnsRecordBase record in (answer.AdditionalRecords)) { lock (query) { query.AnswerRecords.Add(record); } site.Selects++; WriteToConsole(record.Name); } lock (query) { site.Weight--; query.ReturnCode = ReturnCode.NoError; state.Break(); } } }); } // if got an answer, copy it to the message sent to the client } if (query.ReturnCode == ReturnCode.NoError) { return(query); } if (repcnt > 5) { message.ReturnCode = ReturnCode.ServerFailure; return(message); } else { goto ret1; } }
protected internal override void EncodeRecordData(byte[] messageData, int offset, ref int currentPosition, Dictionary <string, ushort> domainNames) { DnsMessageBase.EncodeDomainName(messageData, offset, ref currentPosition, CanonicalName, true, domainNames); }
static DnsMessageBase onDnsQuery(DnsMessageBase message, System.Net.IPAddress clientAddress, ProtocolType protocol) { message.IsQuery = false; DnsMessage query = message as DnsMessage; DnsMessage answer = null; if ((query != null) && (query.Questions.Count == 1)) { //HOOK: //resolve whatsapp.net subdomains if (query.Questions[0].RecordType == RecordType.A && ( query.Questions[0].Name == WA_CERT_HOST || query.Questions[0].Name == WA_REG_HOST || ( //media files query.Questions[0].Name.StartsWith("mms") && query.Questions[0].Name.EndsWith("whatsapp.net") ) ) ) { query.ReturnCode = ReturnCode.NoError; System.Net.IPAddress localIP = GetIP(); if (localIP != null) { query.AnswerRecords.Add(new ARecord(query.Questions[0].Name, 30, localIP)); return(query); } } // send query to upstream server try { DnsQuestion question = query.Questions[0]; answer = DnsClient.Default.Resolve(question.Name, question.RecordType, question.RecordClass); // if got an answer, copy it to the message sent to the client if (answer != null) { foreach (DnsRecordBase record in (answer.AnswerRecords)) { query.AnswerRecords.Add(record); } foreach (DnsRecordBase record in (answer.AdditionalRecords)) { query.AnswerRecords.Add(record); } query.ReturnCode = ReturnCode.NoError; return(query); } } catch (Exception e) { } } // Not a valid query or upstream server did not answer correct message.ReturnCode = ReturnCode.ServerFailure; return(message); }
internal override void ParseRecordData(byte[] resultData, int startPosition, int length) { CanonicalName = DnsMessageBase.ParseDomainName(resultData, ref startPosition); }
protected internal override void EncodeRecordData(byte[] messageData, int offset, ref int currentPosition, Dictionary <string, ushort> domainNames) { messageData[currentPosition++] = Flags; DnsMessageBase.EncodeTextBlock(messageData, ref currentPosition, Tag); DnsMessageBase.EncodeTextWithoutLength(messageData, ref currentPosition, Value); }
internal override void ParseRecordData(byte[] resultData, int startPosition, int length) { Flags = resultData[startPosition++]; Tag = DnsMessageBase.ParseText(resultData, ref startPosition); Value = DnsMessageBase.ParseText(resultData, ref startPosition, length - (2 + Tag.Length)); }
internal override void ParseData(ReadOnlySpan <byte> resultData, int startPosition, int length) { Payload = DnsMessageBase.ParseByteData(resultData, ref startPosition, length); }
internal override void ParseRecordData(byte[] resultData, int startPosition, int length) { SubType = (AfsSubType)DnsMessageBase.ParseUShort(resultData, ref startPosition); Hostname = DnsMessageBase.ParseDomainName(resultData, ref startPosition); }
internal override void ParseRecordData(ReadOnlySpan <byte> resultData, int startPosition, int length) { int endPosition = startPosition + length; Options = new List <EDnsOptionBase>(); while (startPosition < endPosition) { EDnsOptionType type = (EDnsOptionType)DnsMessageBase.ParseUShort(resultData, ref startPosition); ushort dataLength = DnsMessageBase.ParseUShort(resultData, ref startPosition); EDnsOptionBase option; switch (type) { case EDnsOptionType.LongLivedQuery: option = new LongLivedQueryOption(); break; case EDnsOptionType.UpdateLease: option = new UpdateLeaseOption(); break; case EDnsOptionType.NsId: option = new NsIdOption(); break; case EDnsOptionType.Owner: option = new OwnerOption(); break; case EDnsOptionType.DnssecAlgorithmUnderstood: option = new DnssecAlgorithmUnderstoodOption(); break; case EDnsOptionType.DsHashUnderstood: option = new DsHashUnderstoodOption(); break; case EDnsOptionType.Nsec3HashUnderstood: option = new Nsec3HashUnderstoodOption(); break; case EDnsOptionType.ClientSubnet: option = new ClientSubnetOption(); break; case EDnsOptionType.Expire: option = new ExpireOption(); break; case EDnsOptionType.Cookie: option = new CookieOption(); break; default: option = new UnknownOption(type); break; } option.ParseData(resultData, startPosition, dataLength); Options.Add(option); startPosition += dataLength; } }
protected internal override void EncodeRecordData(byte[] messageData, int offset, ref int currentPosition, Dictionary <string, ushort> domainNames) { DnsMessageBase.EncodeDomainName(messageData, offset, ref currentPosition, NextDomainName, false, domainNames); EncodeTypeBitmap(messageData, ref currentPosition, Types); }
protected internal override void EncodeRecordData(byte[] messageData, int offset, ref int currentPosition, Dictionary <string, ushort> domainNames) { DnsMessageBase.EncodeUShort(messageData, ref currentPosition, Preference); DnsMessageBase.EncodeULong(messageData, ref currentPosition, NodeID); }
internal override void EncodeData(Span <byte> messageData, ref int currentPosition) { DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, Data); }
DnsMessageBase ProcessQuery(DnsMessageBase message, IPAddress clientAddress, ProtocolType protocol) { message.IsQuery = false; DnsMessage query = (DnsMessage)message; if (query != null) { bool replicate = ReplicateAnswer; bool has_answer = false; foreach (DnsQuestion question in query.Questions) { if (StringHelper.Like(LogPattern, question.Name)) { string path = DumpFolder.FullName + System.IO.Path.DirectorySeparatorChar + DateTime.Now.ToString("yyyy-MM-dd") + ".log"; string[] lines = new string[] { DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")+"\t"+question.Name+"\t"+clientAddress.ToString() }; lock (this) { File.AppendAllLines(path, lines); } if (!LogReplicate) replicate = false; else replicate = true; } if (replicate) { DnsMessage answer = DnsClient.Default.Resolve(question.Name, question.RecordType, question.RecordClass); // if got an answer, copy it to the message sent to the client if (answer != null) { has_answer = true; foreach (DnsRecordBase record in (answer.AnswerRecords)) query.AnswerRecords.Add(record); foreach (DnsRecordBase record in (answer.AdditionalRecords)) query.AnswerRecords.Add(record); } } else { switch (question.RecordType) { case RecordType.A: { if (clientAddress.AddressFamily == AddressFamily.InterNetwork) { query.ReturnCode = ReturnCode.NoError; query.AnswerRecords.Add(new ARecord(question.Name, 1000, clientAddress)); return query; } break; } case RecordType.Aaaa: { if (clientAddress.AddressFamily == AddressFamily.InterNetworkV6) { query.ReturnCode = ReturnCode.NoError; query.AnswerRecords.Add(new AaaaRecord(question.Name, 1000, clientAddress)); return query; } break; } } } } if (has_answer) { query.ReturnCode = ReturnCode.NoError; return query; } } // Not a valid query or upstream server did not answer correct message.ReturnCode = ReturnCode.ServerFailure; return message; }
internal override void ParseData(ReadOnlySpan <byte> resultData, int startPosition, int length) { LeaseTime = TimeSpan.FromSeconds(DnsMessageBase.ParseInt(resultData, ref startPosition)); }
protected internal override void EncodeRecordData(byte[] messageData, int offset, ref int currentPosition, Dictionary <string, ushort> domainNames) { DnsMessageBase.EncodeUShort(messageData, ref currentPosition, Preference); DnsMessageBase.EncodeDomainName(messageData, offset, ref currentPosition, IntermediateHost, false, domainNames); }
internal override void EncodeData(Span <byte> messageData, ref int currentPosition) { DnsMessageBase.EncodeInt(messageData, ref currentPosition, (int)LeaseTime.TotalSeconds); }
protected internal override void EncodeRecordData(byte[] messageData, int offset, ref int currentPosition, Dictionary <string, ushort> domainNames) { DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, RecordData); }
internal override void ParseData(ReadOnlySpan <byte> resultData, int startPosition, int length) { ClientCookie = DnsMessageBase.ParseByteData(resultData, ref startPosition, 8); ServerCookie = DnsMessageBase.ParseByteData(resultData, ref startPosition, length - 8); }
private static DateTime ParseDateTime(byte[] buffer, ref int currentPosition) { int timeStamp = DnsMessageBase.ParseInt(buffer, ref currentPosition); return(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(timeStamp).ToLocalTime()); }
internal override void EncodeData(Span <byte> messageData, ref int currentPosition) { DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, ClientCookie); DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, ServerCookie); }
private DnsMessageBase ProcessMessage(DnsMessageBase query, IPAddress ipAddress, ProtocolType protocolType) { if (query.TSigOptions != null) { switch (query.TSigOptions.ValidationResult) { case ReturnCode.BadKey: case ReturnCode.BadSig: query.IsQuery = false; query.ReturnCode = ReturnCode.NotAuthoritive; query.TSigOptions.Error = query.TSigOptions.ValidationResult; query.TSigOptions.KeyData = null; if (InvalidSignedMessageReceived != null) InvalidSignedMessageReceived(this, new InvalidSignedMessageEventArgs(query)); return query; case ReturnCode.BadTime: query.IsQuery = false; query.ReturnCode = ReturnCode.NotAuthoritive; query.TSigOptions.Error = query.TSigOptions.ValidationResult; query.TSigOptions.OtherData = new byte[6]; int tmp = 0; TSigRecord.EncodeDateTime(query.TSigOptions.OtherData, ref tmp, DateTime.Now); if (InvalidSignedMessageReceived != null) InvalidSignedMessageReceived(this, new InvalidSignedMessageEventArgs(query)); return query; } } return _processQueryDelegate(query, ipAddress, protocolType); }
protected internal override void EncodeRecordData(byte[] messageData, int offset, ref int currentPosition, Dictionary <string, ushort> domainNames) { DnsMessageBase.EncodeTextBlock(messageData, ref currentPosition, IsdnAddress); DnsMessageBase.EncodeTextBlock(messageData, ref currentPosition, SubAddress); }