diff --git a/EonaCat.DnsTester/MainForm.Designer.cs b/EonaCat.DnsTester/MainForm.Designer.cs index fa81d16..6128254 100644 --- a/EonaCat.DnsTester/MainForm.Designer.cs +++ b/EonaCat.DnsTester/MainForm.Designer.cs @@ -55,6 +55,9 @@ this.txtResolveHost = new System.Windows.Forms.TextBox(); this.btnResolveIP = new System.Windows.Forms.Button(); this.btnResolveHost = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); this.SuspendLayout(); // // ResultView @@ -308,6 +311,27 @@ this.btnResolveHost.UseVisualStyleBackColor = true; this.btnResolveHost.Click += new System.EventHandler(this.btnResolveHost_Click); // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(675, 223); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(201, 32); + this.label3.TabIndex = 32; + this.label3.Text = "Total domains:"; + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(913, 223); + this.numericUpDown1.Maximum = new decimal(new int[] { + 10000000, + 0, + 0, + 0}); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(120, 38); + this.numericUpDown1.TabIndex = 33; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(240F, 240F); @@ -315,6 +339,8 @@ this.AutoSize = true; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.ClientSize = new System.Drawing.Size(2517, 1693); + this.Controls.Add(this.numericUpDown1); + this.Controls.Add(this.label3); this.Controls.Add(this.btnResolveHost); this.Controls.Add(this.btnResolveIP); this.Controls.Add(this.txtResolveHost); @@ -343,6 +369,7 @@ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "EonaCat.DnsTester"; this.Load += new System.EventHandler(this.TesterUI_Load); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -376,6 +403,8 @@ private System.Windows.Forms.TextBox txtResolveHost; private System.Windows.Forms.Button btnResolveIP; private System.Windows.Forms.Button btnResolveHost; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.NumericUpDown numericUpDown1; } } diff --git a/EonaCat.DnsTester/MainForm.cs b/EonaCat.DnsTester/MainForm.cs index 0f65290..71a1d04 100644 --- a/EonaCat.DnsTester/MainForm.cs +++ b/EonaCat.DnsTester/MainForm.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; @@ -28,8 +29,7 @@ namespace EonaCat.DnsTester private void RunTest_Click(object sender, EventArgs e) { int i; - string[] CleanNames = new string[500]; - int CleanNamesCount = 0; + List CleanNames = new List(); if (this.UseCustomDnsServers) { @@ -61,9 +61,9 @@ namespace EonaCat.DnsTester ResultView.Update(); Application.DoEvents(); - GetWebAddresses(ref CleanNames, ref CleanNamesCount); + GetWebAddresses(ref CleanNames, (int)numericUpDown1.Value); - for (i = 0; i < CleanNamesCount; i++) + for (i = 0; i < CleanNames.Count; i++) { ListViewItem listURL = new ListViewItem(CleanNames[i]); listURL.SubItems.Add(" "); @@ -87,7 +87,7 @@ namespace EonaCat.DnsTester } IsRunning = true; - CheckDNS(CleanNames, CleanNamesCount, DNS1, DNS2); + CheckDNS(CleanNames.ToArray(), CleanNames.Count, DNS1, DNS2); IsRunning = false; } @@ -156,7 +156,7 @@ namespace EonaCat.DnsTester - private void GetWebAddresses(ref string[] CleanNames, ref int CleanNamesCount) + private void GetWebAddresses(ref List CleanNames, int totalUrls) { int i, j; byte[] random = new Byte[256]; @@ -173,74 +173,116 @@ namespace EonaCat.DnsTester if (Letters.Length == 3) break; } - // Use Google to get random addresses for DNS testing + KeyValuePair searchEngine = new KeyValuePair(); + Random rand = new Random(); - // Initialize the WebRequest. - - StatusBoxPrint("Getting Google request"); - try + // Create a list of search engine URLs to query + Dictionary searchEngineUrls = new Dictionary + { + { "DuckDuckGo", "https://duckduckgo.com/html/?q=" }, + { "Yahoo", "https://search.yahoo.com/search?p=" }, + { "Bing", "https://www.bing.com/search?q=" }, + { "Google", "https://www.google.com/search?q=" }, + { "Ask", "https://www.ask.com/web?q=" }, + { "AOL", "https://www.aol.com/search?q=" }, + { "WolframAlpha", "https://www.wolframalpha.com/input/?i=" }, + { "StartPage", "https://www.startpage.com/do/dsearch?query=" }, + { "Yandex", "https://www.yandex.com/search/?text=" }, + { "Qwant", "https://www.qwant.com/?q=" } + }; + + try + { + while (CleanNames.Count < totalUrls) + { + int index = rand.Next(searchEngineUrls.Count); + searchEngine = searchEngineUrls.ElementAt(index); + + WebRequest Request = WebRequest.Create(searchEngine.Value + Letters); //Letters); + WebResponse Response = Request.GetResponse(); + Application.DoEvents(); + + // Get the response stream. + Stream Stream = Response.GetResponseStream(); + StatusBoxPrint(searchEngine.Key + " response received"); + + StreamReader StreamReader = new StreamReader(Stream, Encoding.ASCII); + string ResponseString = StreamReader.ReadToEnd(); + + // Close the response stream and response to free resources. + Stream.Close(); + Response.Close(); + Application.DoEvents(); + + // find all .xxx.com addresses + MatchCollection HostNames; + string[] Names = new string[totalUrls + 1000]; + + // Create a new Regex object and define the regular expression. + Regex Dotcom = new Regex("[.]([A-Za-z]*)[.]com"); + + + // Use the Matches method to find all matches in the input string. + HostNames = Dotcom.Matches(ResponseString); + + Application.DoEvents(); + + // Loop through the match collection to retrieve all + // matches and delete the leading "." + for (i = 0; i < HostNames.Count; i++) + { + Names[i] = HostNames[i].Value.Remove(0, 1); + } + + // eliminate its own search engine names and repeated entries + for (i = 0; i < HostNames.Count - 1; i++) + { + if (Names[i] == searchEngine.Key.ToLower() + ".com") Names[i] = ""; + for (j = i + 1; j < HostNames.Count; j++) + { + if (Names[i] == Names[j]) Names[j] = ""; + } + } + + Shuffle(Names); + + // Add the names to the list + for (i = 0; i < HostNames.Count; i++) + { + if (CleanNames.Count >= totalUrls) + { + break; + } + + if (!string.IsNullOrEmpty(Names[i]) && !CleanNames.Contains(Names[i])) + { + CleanNames.Add(Names[i]); + } + } + } + StatusBoxPrint(CleanNames.Count + " Random URL's found"); + } + catch(Exception exception) { - WebRequest GoogleRequest = WebRequest.Create("http://www.google.com/search?num=100&q=" + Letters); //Letters); - WebResponse GoogleResponse = GoogleRequest.GetResponse(); - Application.DoEvents(); - // Get the response stream. - Stream GoogleStream = GoogleResponse.GetResponseStream(); - StatusBoxPrint("Google response received"); - // Use a StreamReader to read the entire response. - - StreamReader GoogleReader = new StreamReader(GoogleStream, Encoding.ASCII); - string GoogleString = GoogleReader.ReadToEnd(); - // Close the response stream and response to free resources. - GoogleStream.Close(); - GoogleResponse.Close(); - Application.DoEvents(); - - // find all .xxx.com addresses - MatchCollection HostNames; - string[] Names = new string[1000]; - // Create a new Regex object and define the regular expression. - Regex Dotcom = new Regex("[.]([A-Za-z]*)[.]com"); - // Use the Matches method to find all matches in the input string. - HostNames = Dotcom.Matches(GoogleString); - - Application.DoEvents(); - // Loop through the match collection to retrieve all - // matches and delete the leading "." - for (i = 0; i < HostNames.Count; i++) - { - Names[i] = HostNames[i].Value.Remove(0, 1); - } - // eliminate google.com and repeated entries - for (i = 0; i < HostNames.Count - 1; i++) - { - if (Names[i] == "google.com") Names[i] = ""; - for (j = i + 1; j < HostNames.Count; j++) - { - if (Names[i] == Names[j]) Names[j] = ""; - } - } - // count list and compact - j = 0; - for (i = 0; i < HostNames.Count; i++) - { - if (Names[i] != "") - { - CleanNames[j] = Names[i]; - j++; - } - } - CleanNamesCount = j; - StatusBoxPrint(CleanNamesCount + " Random URL's found"); - - } - catch - { - StatusBoxPrint("Host Google.com not found - are you connected ?"); + StatusBoxPrint(searchEngine.Key + ": " ?? string.Empty + exception.Message); } + } - } + public static void Shuffle(T[] array) + { + Random rng = new Random(); + int n = array.Length; + while (n > 1) + { + n--; + int k = rng.Next(n + 1); + T value = array[k]; + array[k] = array[n]; + array[n] = value; + } + } - private void CheckDNS(string[] URLNames, int URLNamescount, string DNSAddress1, string DNSAddress2) + private void CheckDNS(string[] URLNames, int URLNamescount, string DNSAddress1, string DNSAddress2) { int i; const int IPPort = 53; @@ -299,11 +341,13 @@ namespace EonaCat.DnsTester } byte[] Receivebytes = new byte[512]; + int totalReceived = 0; - try + try { // wait for a response up to timeout - more: DNSsocket.Receive(Receivebytes); + more: + DNSsocket.Receive(Receivebytes); // make sure the message returned is ours if (Receivebytes[0] == Sendbytes[0] && (Receivebytes[1] == 0x31) || (Receivebytes[1] == 0x32)) { @@ -378,11 +422,17 @@ namespace EonaCat.DnsTester ResultView.Items[i].ForeColor = System.Drawing.Color.Black; break; } - } + + totalReceived++; + } } } - goto more; - } + + if (totalReceived < URLNamescount) + { + goto more; + } + } } catch (SocketException e) {