private void BT_DNS_Click(object sender, EventArgs e) { BT_DNS.Enabled = false; if (!IsValidIPAddress(TB_DNS_IP.Text)) { MessageBox.Show("The IP adress you entered seems to be invalid. Please check it.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!BGW_DNS.IsBusy) { TB_DNS_IP.Enabled = false; BT_DNS.Text = "STOP DNS"; LB_DNS_Log.Items.Add(DateTime.Now.ToLongTimeString() + ": Sending command: Start DNS"); LB_DNS_Log.SelectedIndex = LB_DNS_Log.Items.Count - 1; BGW_DNS.RunWorkerAsync(TB_DNS_IP.Text); LA_DNS_Status.Text = "DNS running"; LA_DNS_Status.BackColor = Color.Green; BT_DNS.Enabled = true; } else { BGW_DNS.ReportProgress(1, "Sending command: Stop DNS"); BGW_DNS.CancelAsync(); //if (dnsserv != null) // dnsserv.Shutdown(SocketShutdown.Both); //while (BGW_DNS.IsBusy) //{ // Thread.Sleep(1000); //} //BT_DNS.Enabled = true; } }
private void BGW_DNS_DoWork(object sender, DoWorkEventArgs e) { string fake_ip = e.Argument.ToString(); if (!IsValidIPAddress(fake_ip)) { return; } BGW_DNS.ReportProgress(1, "DNS started..."); Socket s; Socket dnsserv = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); dnsserv.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); dnsserv.Bind(new IPEndPoint(IPAddress.Any, 53)); byte[] fake_ip_byte = new byte[4]; for (int i = 0; i <= 3; i++) { fake_ip_byte[i] = byte.Parse(fake_ip.Split('.')[i]); } byte[] r; byte[] rr = new byte[512]; int lngSnd = 0; int lngRcv = 0; string str_r = null; string str_rr = null; string host = null; EndPoint rem_ep = new IPEndPoint(IPAddress.Any, 0); while (!BGW_DNS.CancellationPending) { try { r = new byte[511]; dnsserv.ReceiveTimeout = 5000; lngRcv = dnsserv.ReceiveFrom(r, SocketFlags.None, ref rem_ep); //BGW_DNS.ReportProgress(1, "Connected to: " + rem_ep.ToString()); //r = new byte[lngRcv]; Array.Resize(ref r, lngRcv + 1); str_r = Encoding.ASCII.GetString(r, 0, lngRcv); host = str_r.Substring(12, str_r.IndexOf('\0', 12) - 12); string requestedHost = ""; int n = 0; while (n < host.Length) { requestedHost += host.Substring(n + 1, r[n + 12]) + "."; n += r[n + 12] + 1; } requestedHost = requestedHost.Substring(0, requestedHost.Length - 1); rr = new byte[511]; s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); s.Connect("208.67.222.222", 53); s.Send(r, lngRcv, SocketFlags.None); lngSnd = s.Receive(rr, SocketFlags.None); //rr = new byte[lngSnd]; Array.Resize(ref rr, lngSnd + 1); if (requestedHost == "gamestats2.gs.nintendowifi.net") { Array.Copy(fake_ip_byte, 0, rr, 0x3c, 4); BGW_DNS.ReportProgress(1, "Request (fake): " + requestedHost); } else { BGW_DNS.ReportProgress(1, "Request: " + requestedHost); } str_rr = Encoding.ASCII.GetString(rr, 0, lngSnd); dnsserv.SendTo(rr, rr.Length, SocketFlags.None, rem_ep); } catch (SocketException ex) {//ErrorCode 10060 if (ex.ErrorCode != 10060) { BGW_DNS.ReportProgress(1, "Error (" + ex.Message + ")"); } } catch (Exception ex) { BGW_DNS.ReportProgress(1, "Error (" + ex.Message + ")"); } } }