Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
		}
Esempio n. 4
0
 internal override void ParseRecordData(byte[] resultData, int startPosition, int length)
 {
     Preference       = DnsMessageBase.ParseUShort(resultData, ref startPosition);
     IntermediateHost = DnsMessageBase.ParseDomainName(resultData, ref startPosition);
 }
Esempio n. 5
0
 internal override void ParseRecordData(byte[] resultData, int startPosition, int length)
 {
     RecordData = DnsMessageBase.ParseByteData(resultData, ref startPosition, length);
 }
Esempio n. 6
0
 internal override void ParseRecordData(byte[] resultData, int startPosition, int length)
 {
     Preference = DnsMessageBase.ParseUShort(resultData, ref startPosition);
     NodeID     = DnsMessageBase.ParseULong(resultData, ref startPosition);
 }
Esempio n. 7
0
 internal override void EncodeData(byte[] messageData, ref int currentPosition)
 {
     DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, Payload);
 }
Esempio n. 8
0
 internal override void ParseRecordData(byte[] resultData, int startPosition, int length)
 {
     Address = new IPAddress(DnsMessageBase.ParseByteData(resultData, ref startPosition, 16));
 }
Esempio n. 9
0
        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;
            }
        }
Esempio n. 10
0
 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);
 }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
 internal override void ParseRecordData(byte[] resultData, int startPosition, int length)
 {
     CanonicalName = DnsMessageBase.ParseDomainName(resultData, ref startPosition);
 }
Esempio n. 13
0
 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);
 }
Esempio n. 14
0
 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));
 }
Esempio n. 15
0
 internal override void ParseData(ReadOnlySpan <byte> resultData, int startPosition, int length)
 {
     Payload = DnsMessageBase.ParseByteData(resultData, ref startPosition, length);
 }
Esempio n. 16
0
 internal override void ParseRecordData(byte[] resultData, int startPosition, int length)
 {
     SubType  = (AfsSubType)DnsMessageBase.ParseUShort(resultData, ref startPosition);
     Hostname = DnsMessageBase.ParseDomainName(resultData, ref startPosition);
 }
Esempio n. 17
0
    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;
        }
    }
Esempio n. 18
0
 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);
 }
Esempio n. 19
0
 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);
 }
Esempio n. 20
0
 internal override void EncodeData(Span <byte> messageData, ref int currentPosition)
 {
     DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, Data);
 }
Esempio n. 21
0
        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;
        }
Esempio n. 22
0
 internal override void ParseData(ReadOnlySpan <byte> resultData, int startPosition, int length)
 {
     LeaseTime = TimeSpan.FromSeconds(DnsMessageBase.ParseInt(resultData, ref startPosition));
 }
Esempio n. 23
0
 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);
 }
Esempio n. 24
0
 internal override void EncodeData(Span <byte> messageData, ref int currentPosition)
 {
     DnsMessageBase.EncodeInt(messageData, ref currentPosition, (int)LeaseTime.TotalSeconds);
 }
Esempio n. 25
0
 protected internal override void EncodeRecordData(byte[] messageData, int offset, ref int currentPosition, Dictionary <string, ushort> domainNames)
 {
     DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, RecordData);
 }
Esempio n. 26
0
 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);
 }
Esempio n. 27
0
        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());
        }
Esempio n. 28
0
 internal override void EncodeData(Span <byte> messageData, ref int currentPosition)
 {
     DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, ClientCookie);
     DnsMessageBase.EncodeByteArray(messageData, ref currentPosition, ServerCookie);
 }
Esempio n. 29
0
        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);
        }
Esempio n. 30
0
 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);
 }