コード例 #1
0
        public static List <HostnamePortPair> LookupSRV(string name)
        {
            List <HostnamePortPair> addresses = new List <HostnamePortPair>();

            DnsQueryRequest request    = new DnsQueryRequest();
            IPAddress       currentDns = GetActiveDnsServer();

            if (currentDns == null)
            {
                return(addresses);
            }
            try
            {
                DnsQueryResponse response = request.Resolve(name, NsType.SRV, NsClass.INET, ProtocolType.Udp);
                foreach (IDnsRecord record in response.Answers)
                {
                    if (record is SrvRecord)
                    {
                        SrvRecord srvRecord = (SrvRecord)record;
                        addresses.Add(new HostnamePortPair(srvRecord.HostName, srvRecord.Port));
                    }
                }
            }
            catch (Exception)
            {
            }
            return(addresses);
        }
コード例 #2
0
        static void Main(string[] args)
        {
            DnsQueryRequest  request3  = new DnsQueryRequest();
            DnsQueryResponse response3 = request3.Resolve("gmail.com", NsType.MX, NsClass.INET, ProtocolType.Tcp);

            OutputResults(response3);
            Console.ReadLine();
        }
コード例 #3
0
        /// <summary>
        /// Apply a TSIG record to the request message.
        /// </summary>
        /// <param name="dnsQueryRequest">The <see cref="DnsQueryRequest"/> to add the security headers too.</param>
        /// <returns>A <see cref="DnsQueryRequest"/> instance with additional security attributes assigned.</returns>
        public DnsQueryRequest SecureMessage(DnsQueryRequest dnsQueryRequest)
        {
            DateTime signDateTime = DateTime.Now;
            int      timeHigh;
            long     timeLow;

            byte[] messageBytes = dnsQueryRequest.GetMessageBytes();
            Trace.WriteLine(String.Format("Message Header Bytes: {0}", DnsHelpers.DumpArrayToString(messageBytes)));

            MemoryStream memoryStream = new MemoryStream();

            memoryStream.Write(messageBytes, 0, messageBytes.Length);

            // the shared key name
            byte[] data = DnsHelpers.CanonicaliseDnsName(_name, false);
            memoryStream.Write(data, 0, data.Length);
            data = BitConverter.GetBytes((ushort)(IPAddress.HostToNetworkOrder((ushort)NsClass.ANY) >> 16));
            memoryStream.Write(data, 0, data.Length);
            // the TTL value
            data = BitConverter.GetBytes((uint)(IPAddress.HostToNetworkOrder((uint)0) >> 32));
            memoryStream.Write(data, 0, data.Length);
            // the algorithim name
            data = DnsHelpers.CanonicaliseDnsName(_algorithimName, true);
            memoryStream.Write(data, 0, data.Length);

            DnsHelpers.ConvertToDnsTime(signDateTime.ToUniversalTime(), out timeHigh, out timeLow);

            data = BitConverter.GetBytes((ushort)(IPAddress.HostToNetworkOrder((ushort)timeHigh) >> 16));
            memoryStream.Write(data, 0, data.Length);

            data = BitConverter.GetBytes((uint)(IPAddress.HostToNetworkOrder((uint)timeLow) >> 32));
            memoryStream.Write(data, 0, data.Length);

            data = BitConverter.GetBytes((ushort)(IPAddress.HostToNetworkOrder(_fudge) >> 16));
            memoryStream.Write(data, 0, data.Length);

            data = BitConverter.GetBytes((ushort)(IPAddress.HostToNetworkOrder((ushort)RCode.NoError) >> 16));
            memoryStream.Write(data, 0, data.Length);

            // no other data
            data = BitConverter.GetBytes((ushort)(IPAddress.HostToNetworkOrder((ushort)0) >> 16));
            memoryStream.Write(data, 0, data.Length);

            byte[] dataToHash = memoryStream.ToArray();
            Trace.WriteLine(String.Format("Data to hash: {0}", DnsHelpers.DumpArrayToString(dataToHash)));
            byte[] mac = _hmac.ComputeHash(dataToHash);
            Trace.WriteLine(String.Format("hash: {0}", DnsHelpers.DumpArrayToString(mac)));

            dnsQueryRequest.AdditionalRRecords.Add(new TSigRecord(_name, _algorithimName, RCode.NoError, _fudge, dnsQueryRequest.TransactionID, new byte[] { }, mac, signDateTime));

            return(dnsQueryRequest);
        }
コード例 #4
0
        static string getLdapServer()
        {
            Domain localDomain         = Domain.GetCurrentDomain();
            string localDomainAsString = localDomain.ToString();

            DnsQueryRequest  request  = new DnsQueryRequest();
            DnsQueryResponse Response = request.Resolve($"_ldap.{localDomainAsString}", NsType.A, NsClass.ANY, System.Net.Sockets.ProtocolType.Udp);

            string answer = Response.AuthoritiveNameServers[0].Answer;

            int    indexOfDomain      = answer.IndexOf($".{localDomainAsString}");
            int    lengthToSkip       = 20;
            int    lengthOfLdapServer = indexOfDomain - lengthToSkip;
            string nameOfLdapServer   = $"{answer.Substring(lengthToSkip, lengthOfLdapServer)}.{localDomainAsString}";

            return(nameOfLdapServer);
        }
コード例 #5
0
        public static IPEndPoint ParseEndPoint(string arg)
        {
            IPAddress address;
            int       port;
            // Resolve the SRV record, first.
            string tmp = arg;

            if (tmp.Contains(":"))
            {
                tmp = tmp.Split(':') [0];
            }
            DnsQueryResponse response = new DnsQueryRequest().Resolve("_minecraft._tcp." + tmp, NsType.SRV, NsClass.INET, ProtocolType.Udp);

            if (response.Answers.Length > 0 && (response.Answers [0] is SrvRecord))
            {
                // Take the first record.
                SrvRecord r = (response.Answers [0] as SrvRecord);
                arg = r.HostName.Substring(0, r.HostName.Length - 1) + ":" + r.Port;
            }
            if (arg.Contains(":"))
            {
                // Both IP and port are specified
                var parts = arg.Split(':');
                if (parts[1] == "")
                {
                    parts[1] = "25565";
                }
                if (!IPAddress.TryParse(parts [0], out address))
                {
                    address = Resolve(parts [0]);
                }
                return(new IPEndPoint(address, int.Parse(parts [1])));
            }
            if (IPAddress.TryParse(arg, out address))
            {
                return(new IPEndPoint(address, 25565));
            }
            if (int.TryParse(arg, out port))
            {
                return(new IPEndPoint(IPAddress.Loopback, port));
            }
            return(new IPEndPoint(Resolve(arg), 25565));
        }
コード例 #6
0
ファイル: Program.cs プロジェクト: Kim-SSi/DnDns
        static void Main(string[] args)
        {
            // Test TCP request
            DnsQueryRequest  request  = new DnsQueryRequest();
            DnsQueryResponse response = request.Resolve("www.google.com", NsType.A, NsClass.INET, ProtocolType.Tcp);

            OutputResults(response);

            // Test UDP request
            DnsQueryRequest  request2  = new DnsQueryRequest();
            DnsQueryResponse response2 = request.Resolve("www.google.com", NsType.A, NsClass.INET, ProtocolType.Udp);

            OutputResults(response2);

            // Example usage of security provider.
            // DnsQueryRequest request3 = new DnsQueryRequest();
            // DnsQueryResponse response3 = request3.Resolve("a.tsig.secured.server", "a.server.to.lookup", NsType.A, NsClass.INET, ProtocolType.Udp, new TsigMessageSecurityProvider("sharedkeyname", "shared key as base 64 string", 300));

            Console.ReadLine();
        }
コード例 #7
0
        protected void ResolveHostName()
        {
            try
            {
                var request  = new DnsQueryRequest();
                var response = request.Resolve
                               (
                    String.Format("{0}.{1}", XmppCodes.XmppSrvRecordPrefix, ConnectionString.HostName),
                    NsType.SRV,
                    NsClass.INET,
                    ProtocolType.Tcp
                               );

                foreach (var record in response.Answers.OfType <SrvRecord>())
                {
                    HostName = record.HostName;
                }
            }
            catch // TODO: logging of exceptions?
            {
            }
        }
コード例 #8
0
        private void btnLookup_Click(object sender, EventArgs e)
        {
            NsType lookupType = (NsType)((FieldInfo)lstBxQueryType.SelectedValue).GetValue(null);

            DnsQueryRequest request = new DnsQueryRequest();

            DnsQueryResponse response = request.Resolve(txtDnsServer.Text, txtNameToLookup.Text, lookupType, NsClass.INET, ProtocolType.Udp);
            StringBuilder    sb       = new StringBuilder(1024);

            sb.Append("Bytes received: " + response.BytesReceived);
            sb.Append("\r\n");

            // Enumerate the Authoritive Name Servers Records
            sb.Append("Authoritive Name Servers:");
            sb.Append("\r\n");

            foreach (IDnsRecord record in response.AuthoritiveNameServers)
            {
                sb.Append(record.Answer);
                sb.Append("\r\n");
                sb.Append("  |--- RDATA Field Length: ");
                sb.Append(record.DnsHeader.DataLength);
                sb.Append("\r\n");
                sb.Append("  |--- Name: ");
                sb.Append(record.DnsHeader.Name);
                sb.Append("\r\n");
                sb.Append("  |--- NS Class: ");
                sb.Append(record.DnsHeader.NsClass);
                sb.Append("\r\n");
                sb.Append("  |--- NS Type: ");
                sb.Append(record.DnsHeader.NsType);
                sb.Append("\r\n");
                sb.Append("  |--- TTL: ");
                sb.Append(record.DnsHeader.TimeToLive);
                sb.Append("\r\n");
            }

            // Enumerate the Answer Records
            sb.Append("Answers:");
            sb.Append("\r\n");
            foreach (IDnsRecord record in response.Answers)
            {
                sb.Append(record.Answer);
                sb.Append("\r\n");
                sb.Append("  |--- RDATA Field Length: ");
                sb.Append(record.DnsHeader.DataLength);
                sb.Append("\r\n");
                sb.Append("  |--- Name: ");
                sb.Append(record.DnsHeader.Name);
                sb.Append("\r\n");
                sb.Append("  |--- NS Class: ");
                sb.Append(record.DnsHeader.NsClass);
                sb.Append("\r\n");
                sb.Append("  |--- NS Type: ");
                sb.Append(record.DnsHeader.NsType);
                sb.Append("\r\n");
                sb.Append("  |--- TTL: ");
                sb.Append(record.DnsHeader.TimeToLive);
                sb.Append("\r\n");
            }

            sb.Append("Additional Records");
            sb.Append("\r\n");
            foreach (IDnsRecord record in response.AdditionalRecords)
            {
                sb.Append(record.Answer);
                sb.Append("\r\n");
                sb.Append("  |--- RDATA Field Length: ");
                sb.Append(record.DnsHeader.DataLength);
                sb.Append("\r\n");
                sb.Append("  |--- Name: ");
                sb.Append(record.DnsHeader.Name);
                sb.Append("\r\n");
                sb.Append("  |--- NS Class: ");
                sb.Append(record.DnsHeader.NsClass);
                sb.Append("\r\n");
                sb.Append("  |--- NS Type: ");
                sb.Append(record.DnsHeader.NsType);
                sb.Append("\r\n");
                sb.Append("  |--- TTL: ");
                sb.Append(record.DnsHeader.TimeToLive);
                sb.Append("\r\n");
            }

            txtOutput.Text = sb.ToString();
        }
コード例 #9
0
        void MCPingCommand(CommandDetails command)
        {
            if (command.Arguments.Count <= 0)
            {
                Chat(command.Channel.Name, command.Pinger + ColorGeneral + "That command is written as: " + ColorHighlightMajor + Prefixes[0] + command.Name + " <Minecraft server IP address>");
                return;
            }
            IRCUser user = new IRCUser(command.Arguments[0]);
            string  IP   = user.Settings.ReadString("general.minecraft_server_ip", null);

            if (IP == null)
            {
                IP = command.Arguments[0];
            }
            ushort port = 0;

            if (IP.Contains(':'))
            {
                string[] dat = IP.Split(new char[] { ':' }, 2);
                IP   = dat[0];
                port = Utilities.StringToUShort(dat[1]);
            }
            if (port == 0)
            {
                try
                {
                    DnsQueryRequest  dqr  = new DnsQueryRequest();
                    DnsQueryResponse resp = dqr.Resolve("_minecraft._tcp." + IP, NsType.SRV, NsClass.ANY, ProtocolType.Tcp);
                    if (resp != null)
                    {
                        for (int i = 0; i < resp.AdditionalRRecords.Count; i++)
                        {
                            if (resp.AdditionalRRecords[i] is SrvRecord)
                            {
                                port = (ushort)((SrvRecord)resp.AdditionalRRecords[i]).Port;
                            }
                        }
                        for (int i = 0; i < resp.Answers.Length; i++)
                        {
                            if (resp.Answers[i] is SrvRecord)
                            {
                                port = (ushort)((SrvRecord)resp.Answers[i]).Port;
                            }
                        }
                    }
                    else
                    {
                        Logger.Output(LogType.DEBUG, "Null SRV record.");
                    }
                    if (port == 0)
                    {
                        port = (ushort)25565;
                    }
                }
                catch (Exception ex)
                {
                    Logger.Output(LogType.ERROR, "Pinging a SRV record for a minecraft server: " + ex.ToString());
                    port = 25565;
                }
            }
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                Stopwatch Timer = new Stopwatch();
                Timer.Reset();
                Timer.Start();
                sock.SendBufferSize    = 8192;
                sock.ReceiveBufferSize = 8192 * 10;
                sock.ReceiveTimeout    = 3000;
                sock.SendTimeout       = 3000;
                IAsyncResult result  = sock.BeginConnect(IP, port, null, null);
                bool         timeout = !result.AsyncWaitHandle.WaitOne(5000, true);
                if (timeout)
                {
                    throw new Exception("Connection timed out");
                }
                if (!sock.Connected)
                {
                    throw new Exception("Failed to connect");
                }
                byte[] address   = UTF8.GetBytes(IP);
                int    packlen   = 1 + 1 + 1 + address.Length + 2 + 1;
                byte[] send      = new byte[1 + packlen + 1 + 1];
                byte[] portbytes = BitConverter.GetBytes(port).Reverse().ToArray();
                send[0] = (byte)packlen;                    // packet length
                send[1] = (byte)0x00;                       // Packet ID
                send[2] = (byte)0x04;                       // Protocol Version
                send[3] = (byte)address.Length;             // Address string length
                address.CopyTo(send, 4);                    // Address string
                portbytes.CopyTo(send, address.Length + 4); // Port
                send[address.Length + 6] = (byte)0x01;      // Next state
                send[address.Length + 7] = (byte)0x01;      // Next packet length
                send[address.Length + 8] = (byte)0x00;      // Empty state request packet ~ packet ID
                sock.Send(send);
                int length = 0;
                // Packet size -> packet ID -> JSON length
                for (int x = 0; x < 2; x++)
                {
                    length = 0;
                    int j = 0;
                    while (true)
                    {
                        byte[] recd = new byte[1];
                        sock.Receive(recd, 1, SocketFlags.None);
                        int k = recd[0];
                        length |= (k & 0x7F) << j++ *7;
                        if (j > 5)
                        {
                            throw new Exception("VarInt too big");
                        }
                        if ((k & 0x80) != 128)
                        {
                            break;
                        }
                        if (Timer.ElapsedMilliseconds > 7000)
                        {
                            throw new Exception("Timeout while reading response");
                        }
                    }
                    if (x == 0)
                    {
                        byte[] resp = new byte[1];
                        sock.Receive(resp, 1, SocketFlags.None);
                    }
                }
                int    gotten   = 0;
                byte[] response = new byte[length];
                while (gotten < length)
                {
                    byte[] gotbit = new byte[length - gotten];
                    int    newgot = sock.Receive(gotbit, length - gotten, SocketFlags.None);
                    gotbit.CopyTo(response, gotten);
                    gotten += newgot;
                    if (Timer.ElapsedMilliseconds > 7000)
                    {
                        throw new Exception("Timeout while reading response");
                    }
                }
                string fullresponse = UTF8.GetString(response);
                int    ind          = fullresponse.IndexOf('{');
                if (ind < 0)
                {
                    throw new Exception("Invalid response packet - is that an actual minecraft server?");
                }
                fullresponse = fullresponse.Substring(ind);
                Dictionary <string, dynamic> dict = new JavaScriptSerializer().Deserialize <Dictionary <string, dynamic> >(fullresponse.Trim());
                string version     = dict["version"]["name"].ToString();
                string versionnum  = dict["version"]["protocol"].ToString();
                string players_on  = dict["players"]["online"].ToString();
                string players_max = dict["players"]["max"].ToString();
                string description;
                if (dict["description"] is Dictionary <String, Object> )
                {
                    description = dict["description"]["text"].ToString();
                }
                else
                {
                    description = dict["description"].ToString();
                }
                Chat(command.Channel.Name, command.Pinger + ColorGeneral + "Server: " + IP + ":" + port.ToString() + ", MOTD: '"
                     + Utilities.mctoirc(description) + ColorGeneral + "', players: " + players_on + "/" + players_max + ", version: " + Utilities.mctoirc(version));
            }
            catch (Exception ex)
            {
                Logger.Output(LogType.DEBUG, "Pinging minecraft server: " + ex.ToString());
                Chat(command.Channel.Name, command.Pinger + ColorGeneral + "Couldn't ping server: internal exception: " + ex.Message);
            }
            finally
            {
                sock.Close();
            }
        }
コード例 #10
0
        private void RegisterTrunk(Trunk trunk)
        {
            trunk.State = Trunk.States.WaitingDns;

            var match = Regex.Match(trunk.OutgoingProxy, "(?<url>[^:]+)(:(?<port>[0-9]*))?");

            if (match.Success == false)
            {
                trunk.ErrorMessage = @"Invalid outgouing proxy URL";
            }
            else
            {
                var hostname = match.Groups["url"].Value;
                int?port     = null;
                if (match.Groups["port"].Success)
                {
                    port = int.Parse(match.Groups["port"].Value);
                }

                IPAddress address;
                if (IPAddress.TryParse(hostname, out address))
                {
                    trunk.SetServerEndPoint(address, port ?? 5060);
                    trunk.State = Trunk.States.Waiting200or401;
                    SendRegister(trunk, trunk.RegisterDuration);
                }
                else
                {
                    try
                    {
                        var prefixes = new string[] { @"_sip._tcp.", @"_sip._udp." };

                        Transports transport = Transports.None;
                        SrvRecord  record    = null;
                        foreach (var prefix in prefixes)
                        {
                            var request  = new DnsQueryRequest();
                            var response = request.Resolve(prefix + hostname, NsType.SRV, NsClass.INET, ProtocolType.Udp);

                            if (response.Answers.Length > 0)
                            {
                                record = response.Answers[0] as SrvRecord;
                            }

                            if (record != null)
                            {
                                if (prefix.Contains(@"tcp"))
                                {
                                    transport = Transports.Tcp;
                                }
                                if (prefix.Contains(@"udp"))
                                {
                                    transport = Transports.Udp;
                                }
                                break;
                            }
                        }

                        if (record == null)
                        {
                            trunk.ErrorMessage = @"Failed to get SRV record";
                        }
                        else
                        {
                            var addresses = Dns.GetHostAddresses(record.HostName);
                            if (addresses.Length < 0)
                            {
                                trunk.ErrorMessage = @"Failed to get DNS A record for " + record.HostName;
                            }
                            else
                            {
                                trunk.SetServerEndPoint(transport, addresses[0], port ?? record.Port);
                                trunk.State = Trunk.States.Waiting200or401;
                                SendRegister(trunk, trunk.RegisterDuration);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        trunk.ErrorMessage = ex.Message;
                    }
                }
            }
        }