protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request = null; if (_proxy == null) { switch (_networkType) { case WebClientExNetworkType.IPv4Only: if (IPAddress.TryParse(address.Host, out IPAddress ipv4)) { if (ipv4.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork) { throw new WebException("WebClientEx current network type does not allow url address family: " + ipv4.AddressFamily.ToString()); } request = base.GetWebRequest(address) as HttpWebRequest; } else { try { DnsClient dns = new DnsClient(); IPAddress[] ipAddresses = dns.ResolveIP(address.Host); if (ipAddresses.Length == 0) { throw new WebException("WebClientEx could not resolve IPv4 address for host: " + address.Host); } foreach (IPAddress ipAddress in ipAddresses) { if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { Uri newAddress = new Uri(address.Scheme + "://" + ipAddress.ToString() + ":" + address.Port + address.PathAndQuery); request = base.GetWebRequest(newAddress) as HttpWebRequest; request.Host = address.Host; break; } } } catch (DnsClientException ex) { throw new WebException("WebClientEx could not resolve IPv4 address for host: " + address.Host, ex); } if (request == null) { throw new WebException("WebClientEx could not resolve IPv4 address for host: " + address.Host); } } break; case WebClientExNetworkType.IPv6Only: if (IPAddress.TryParse(address.Host, out IPAddress ipv6)) { if (ipv6.AddressFamily != System.Net.Sockets.AddressFamily.InterNetworkV6) { throw new WebException("WebClientEx current network type does not allow url address family: " + ipv6.AddressFamily.ToString()); } request = base.GetWebRequest(address) as HttpWebRequest; } else { try { DnsClient dns = new DnsClient(true); IPAddress[] ipAddresses = dns.ResolveIP(address.Host, true); if (ipAddresses.Length == 0) { throw new WebException("WebClientEx could not resolve IPv6 address for host: " + address.Host); } foreach (IPAddress ipAddress in ipAddresses) { if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) { Uri newAddress = new Uri(address.Scheme + "://[" + ipAddress.ToString() + "]:" + address.Port + address.PathAndQuery); request = base.GetWebRequest(newAddress) as HttpWebRequest; request.Host = address.Host; break; } } } catch (DnsClientException ex) { throw new WebException("WebClientEx could not resolve IPv6 address for host: " + address.Host, ex); } if (request == null) { throw new WebException("WebClientEx could not resolve IPv6 address for host: " + address.Host); } } break; default: request = base.GetWebRequest(address) as HttpWebRequest; break; } } else { if ((_proxy.ViaProxy == null) && (_proxy.Type == NetProxyType.Http)) { request = base.GetWebRequest(address) as HttpWebRequest; request.Proxy = _proxy.HttpProxy; } else { EndPoint remoteEP; if (IPAddress.TryParse(address.Host, out IPAddress ipAddr)) { remoteEP = new IPEndPoint(ipAddr, address.Port); } else { remoteEP = new DomainEndPoint(address.Host, address.Port); } if ((_tunnelProxy != null) && !_tunnelProxy.RemoteEndPoint.Equals(remoteEP)) { _tunnelProxy.Dispose(); } if ((_tunnelProxy == null) || _tunnelProxy.Disposed) { _tunnelProxy = _proxy.CreateLocalTunnelProxy(remoteEP, _timeout); } if (address.Scheme == "https") { request = base.GetWebRequest(address) as HttpWebRequest; request.Proxy = _tunnelProxy.EmulateHttpProxy(); } else { request = base.GetWebRequest(new Uri("http://" + _tunnelProxy.TunnelEndPoint.Address.ToString() + ":" + _tunnelProxy.TunnelEndPoint.Port + address.PathAndQuery)) as HttpWebRequest; request.Host = address.Host; } } } if (_timeout > 0) { request.Timeout = _timeout; } request.CookieContainer = _cookie; if (_ifModifiedSince > (new DateTime())) { request.IfModifiedSince = _ifModifiedSince; } if (_userAgent != null) { request.UserAgent = _userAgent; } request.KeepAlive = _keepAlive; request.AllowAutoRedirect = false; if (_enableAutomaticDecompression) { request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; } foreach (KeyValuePair <string, string> header in _headers) { switch (header.Key.ToLower()) { case "accept": request.Accept = header.Value; break; case "connection": request.KeepAlive = (header.Value.ToLower() == "keep-alive"); break; case "content-type": request.ContentType = header.Value; break; case "user-agent": request.UserAgent = header.Value; break; case "host": request.Host = header.Value; break; default: request.Headers.Add(header.Key, header.Value); break; } } return(request); }
public new void Send(MailMessage message) { if (DeliveryMethod == SmtpDeliveryMethod.Network) { if (string.IsNullOrEmpty(this.Host)) { if (_dnsClient == null) { _dnsClient = new DnsClient(); } string[] mxServers = _dnsClient.ResolveMX(message.To[0]); if (mxServers.Length > 0) { this.Host = mxServers[0]; } else { this.Host = message.To[0].Host; } this.Port = 25; this.Credentials = null; } if (_proxy == null) { base.Send(message); } else { EndPoint remoteEP; if (IPAddress.TryParse(_host, out IPAddress address)) { remoteEP = new IPEndPoint(address, _port); } else { remoteEP = new DomainEndPoint(_host, _port); } if ((_tunnelProxy != null) && !_tunnelProxy.RemoteEndPoint.Equals(remoteEP)) { _tunnelProxy.Dispose(); } if ((_tunnelProxy == null) || _tunnelProxy.Disposed) { _tunnelProxy = _proxy.CreateLocalTunnelProxy(remoteEP, base.Timeout); } base.Host = _tunnelProxy.TunnelEndPoint.Address.ToString(); base.Port = _tunnelProxy.TunnelEndPoint.Port; base.Send(message); } } else { base.Send(message); } }
static void Main(string[] args) { AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException; TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; //RuntimeInformation.IsOSPlatform string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets"); byte[] vidoBuffer = File.ReadAllBytes(Path.Combine(basePath, "ad.mp4")); var ca = GetCA(basePath, "myCA.pfx"); Info info = JsonSerializer.Deserialize <Info>(File.ReadAllText(Path.Combine(basePath, "info.json"), Encoding.UTF8), new JsonSerializerOptions { ReadCommentHandling = JsonCommentHandling.Skip }); const string PORNHUB_DNS_HOST = "www.livehub.com"; const string PORNHUB_HOST = "pornhub.com"; const string IWARA_HOST = "iwara.tv"; const string HENTAI_HOST = "e-hentai.org"; const string AD_HOST = "adtng.com"; const string APKMIRROR_HOST = "apkmirror.com"; const string APKPURE_HOST = "apkpure.com"; var pacListensEndPoint = IPEndPoint.Parse(info.PacServerListen); var listenEndPoint = IPEndPoint.Parse(info.ProxyServerListen); var invalidEndpoint = IPEndPoint.Parse(info.InvalidIPEndPoint); var pacWriteEndPoint = IPEndPoint.Parse(info.PacProxyIPEndPoint); var adVido = vidoBuffer; var mainCert = TLSCertificate.CreateTlsCertificate(ca, PORNHUB_HOST, 2048, 2, PORNHUB_HOST, "*." + PORNHUB_HOST); var adCert = TLSCertificate.CreateTlsCertificate(ca, AD_HOST, 2048, 2, AD_HOST, "*." + AD_HOST); var hentaiCert = TLSCertificate.CreateTlsCertificate(ca, HENTAI_HOST, 2048, 2, HENTAI_HOST, "*." + HENTAI_HOST); var apkmirrorCert = TLSCertificate.CreateTlsCertificate(ca, APKMIRROR_HOST, 2048, 2, APKMIRROR_HOST, "*." + APKMIRROR_HOST); var apkpureCert = TLSCertificate.CreateTlsCertificate(ca, APKPURE_HOST, 2048, 2, APKPURE_HOST, "*." + APKPURE_HOST); PacServer.Builder.Create(pacListensEndPoint) .Add((host) => host == "www.pornhub.com", ProxyMode.CreateHTTP(invalidEndpoint)) .Add((host) => host == "hubt.pornhub.com", ProxyMode.CreateHTTP(invalidEndpoint)) .Add((host) => host == "ajax.googleapis.com", ProxyMode.CreateHTTP(invalidEndpoint)) .Add((host) => PacMethod.dnsDomainIs(host, PORNHUB_HOST), ProxyMode.CreateHTTP(pacWriteEndPoint)) .Add((host) => PacMethod.dnsDomainIs(host, AD_HOST), ProxyMode.CreateHTTP(pacWriteEndPoint)) .Add((host) => host == "i.iwara.tv", ProxyMode.CreateDIRECT()) .Add((host) => PacMethod.dnsDomainIs(host, IWARA_HOST), ProxyMode.CreateHTTP(pacWriteEndPoint)) .Add((host) => PacMethod.dnsDomainIs(host, HENTAI_HOST), ProxyMode.CreateHTTP(pacWriteEndPoint)) .Add((host) => PacMethod.dnsDomainIs(host, APKMIRROR_HOST), ProxyMode.CreateHTTP(pacWriteEndPoint)) .Add((host) => PacMethod.dnsDomainIs(host, APKPURE_HOST), ProxyMode.CreateHTTP(pacWriteEndPoint)) .StartPACServer(); SetAutoPac(pacListensEndPoint); PornhubProxyInfo pornhubInfo = new PornhubProxyInfo { MainPageStreamCreate = ConnectHelper.CreateLocalStream(new X509Certificate2(mainCert), SslProtocols.Tls12), ADPageStreamCreate = ConnectHelper.CreateLocalStream(new X509Certificate2(adCert), SslProtocols.Tls12), RemoteStreamCreate = ConnectHelper.CreateRemoteStream(PORNHUB_DNS_HOST, 443, PORNHUB_DNS_HOST, (a, b) => new MHttpStream(a, b), SslProtocols.Tls12), MaxContentSize = 1024 * 1024 * 5, ADVideoBytes = adVido, CheckingVideoHtml = PornhubHelper.CheckingVideoHtml, MaxRefreshRequestCount = 30, ReplaceResponseHtml = PornhubHelper.ReplaceResponseHtml }; var pornhubAction = PornhubProxyServer.Start(pornhubInfo); TunnelProxyInfo iwaraSniInfo = new TunnelProxyInfo() { CreateLocalStream = ConnectHelper.CreateDnsLocalStream(), CreateRemoteStream = ConnectHelper.CreateDnsRemoteStream( 443, "104.26.12.12", "104.20.201.232", "104.24.48.227", "104.22.27.126", "104.24.53.193") }; var iwaraAction = TunnelProxy.Create(iwaraSniInfo); TunnelProxyInfo hentaiInfo = new TunnelProxyInfo() { CreateLocalStream = ConnectHelper.CreateLocalStream(hentaiCert, SslProtocols.Tls12), CreateRemoteStream = ConnectHelper.CreateRemoteStream("46.101.100.115", 443, "104.20.135.21", (s, ssl) => (Stream)ssl, SslProtocols.Tls12) }; var ehentaiAction = TunnelProxy.Create(hentaiInfo); TunnelProxyInfo apkmirrorInfo = new TunnelProxyInfo() { CreateLocalStream = ConnectHelper.CreateLocalStream(apkmirrorCert, SslProtocols.Tls12), CreateRemoteStream = ConnectHelper.CreateRemoteStream("104.19.133.58", 443, "104.19.133.58", (s, ssl) => (Stream)ssl, SslProtocols.None) }; var apkmirrorAction = TunnelProxy.Create(apkmirrorInfo); TunnelProxyInfo apkpureInfo = new TunnelProxyInfo() { //https://apkpure.com/ //172.67.1.139 CreateLocalStream = ConnectHelper.CreateLocalStream(apkpureCert, SslProtocols.Tls12), CreateRemoteStream = ConnectHelper.CreateRemoteStream("172.67.1.139", 443, "172.67.1.139", (s, ssl) => (Stream)ssl, SslProtocols.None) }; var apkpureAction = TunnelProxy.Create(apkpureInfo); var forw = ForwardTunnelRequest.Builder.Create() .Add(IWARA_HOST, iwaraAction) .Add(PORNHUB_HOST, pornhubAction) .Add(AD_HOST, pornhubAction) .Add(HENTAI_HOST, ehentaiAction) .Add(APKMIRROR_HOST, apkmirrorAction) .Add(APKPURE_HOST, apkpureAction) .Get(listenEndPoint); forw.ListenTask.Wait(); }
public new async Task SendMailAsync(MailMessage message) { if (_disposed) { throw new ObjectDisposedException("SmtpClientEx"); } if (message.To.Count == 0) { throw new ArgumentException("Message does not contain receipent email address."); } if (DeliveryMethod == SmtpDeliveryMethod.Network) { string host = _host; if (string.IsNullOrEmpty(host)) { //resolve MX for the receipent domain using IDnsClient if (_dnsClient == null) { _dnsClient = new DnsClient() { Proxy = _proxy } } ; IReadOnlyList <string> mxDomains = await Dns.DnsClient.ResolveMXAsync(_dnsClient, message.To[0].Host); if (mxDomains.Count > 0) { host = mxDomains[0]; } else { host = message.To[0].Host; } _port = 25; Credentials = null; } if (_proxy == null) { if (_smtpOverTls) { EndPoint remoteEP = EndPointExtension.GetEndPoint(host, _port); if ((_tunnelProxy != null) && !_tunnelProxy.RemoteEndPoint.Equals(remoteEP)) { _tunnelProxy.Dispose(); _tunnelProxy = null; } if ((_tunnelProxy == null) || _tunnelProxy.IsBroken) { _tunnelProxy = await TunnelProxy.CreateTunnelProxyAsync(remoteEP, true, _ignoreCertificateErrors); } base.Host = _tunnelProxy.TunnelEndPoint.Address.ToString(); base.Port = _tunnelProxy.TunnelEndPoint.Port; } else { base.Host = host; base.Port = _port; } await base.SendMailAsync(message); } else { EndPoint remoteEP = EndPointExtension.GetEndPoint(host, _port); if ((_tunnelProxy != null) && !_tunnelProxy.RemoteEndPoint.Equals(remoteEP)) { _tunnelProxy.Dispose(); _tunnelProxy = null; } if ((_tunnelProxy == null) || _tunnelProxy.IsBroken) { _tunnelProxy = await _proxy.CreateTunnelProxyAsync(remoteEP, _smtpOverTls, _ignoreCertificateErrors); } base.Host = _tunnelProxy.TunnelEndPoint.Address.ToString(); base.Port = _tunnelProxy.TunnelEndPoint.Port; await base.SendMailAsync(message); } } else { await base.SendMailAsync(message); } }
void StartProxy() { const string PORNHUB_HOST = "www.livehub.com"; const string IWARA_HOST = "iwara.tv"; var pornhubListensEndPoint = ServerInfo.PornhubProxyEndPoint; var pacListensEndPoint = ServerInfo.PacServerEndPoint; var adErrorEndpoint = ServerInfo.ADErrorEndPoint; var iwaraLsitensPoint = ServerInfo.IwaraProxyEndPoint; var adVido = ServerInfo.AdVideo; var caFile = ServerInfo.CaCert; var mainCert = new X509Certificate2(ServerInfo.PornCert); var adCert = new X509Certificate2(ServerInfo.AdCert); PacServer.Builder.Create(pacListensEndPoint) .Add((host) => host == "www.pornhub.com", ProxyMode.CreateHTTP(adErrorEndpoint)) .Add((host) => host == "hubt.pornhub.com", ProxyMode.CreateHTTP(adErrorEndpoint)) .Add((host) => host == "ajax.googleapis.com", ProxyMode.CreateHTTP(adErrorEndpoint)) .Add((host) => PacMethod.dnsDomainIs(host, "pornhub.com"), ProxyMode.CreateHTTP(pornhubListensEndPoint)) .Add((host) => PacMethod.dnsDomainIs(host, "adtng.com"), ProxyMode.CreateHTTP(pornhubListensEndPoint)) .Add((host) => host == "i.iwara.tv", ProxyMode.CreateDIRECT()) .Add((host) => PacMethod.dnsDomainIs(host, IWARA_HOST), ProxyMode.CreateHTTP(iwaraLsitensPoint)) .StartPACServer(); PornhubProxyInfo info = new PornhubProxyInfo { MainPageStreamCreate = ConnectHelper.CreateLocalStream(new X509Certificate2(mainCert), SslProtocols.Tls12), ADPageStreamCreate = ConnectHelper.CreateLocalStream(new X509Certificate2(adCert), SslProtocols.Tls12), RemoteStreamCreate = ConnectHelper.CreateRemoteStream(PORNHUB_HOST, 443, PORNHUB_HOST, (a, b) => new MHttpStream(a, b), SslProtocols.Tls12), MaxContentSize = 1024 * 1024 * 5, ADVideoBytes = adVido, CheckingVideoHtml = PornhubHelper.CheckingVideoHtml, MaxRefreshRequestCount = 30, ReplaceResponseHtml = PornhubHelper.ReplaceResponseHtml, ListenIPEndPoint = pornhubListensEndPoint }; Task t1 = PornhubProxyServer.Start(info).Task; TunnelProxyInfo iwaraSniInfo = new TunnelProxyInfo() { ListenIPEndPoint = iwaraLsitensPoint, CreateLocalStream = ConnectHelper.CreateDnsLocalStream(), CreateRemoteStream = ConnectHelper.CreateDnsRemoteStream( 443, "104.26.12.12", "104.20.201.232", "104.24.48.227", "104.22.27.126", "104.24.53.193") }; Task t2 = TunnelProxy.Start(iwaraSniInfo).Task; }
public new async Task SendMailAsync(MailMessage message) { if (_disposed) { throw new ObjectDisposedException("SmtpClientEx"); } if (DeliveryMethod == SmtpDeliveryMethod.Network) { if (string.IsNullOrEmpty(_host)) { if (_dnsClient == null) { _dnsClient = new DnsClient(); } IReadOnlyList <string> mxServers = await _dnsClient.ResolveMXAsync(message.To[0].Host); if (mxServers.Count > 0) { _host = mxServers[0]; } else { _host = message.To[0].Host; } _port = 25; Credentials = null; } if (_proxy == null) { if (_enableSslWrapper) { EndPoint remoteEP = EndPointExtension.GetEndPoint(_host, _port); if ((_tunnelProxy != null) && !_tunnelProxy.RemoteEndPoint.Equals(remoteEP)) { _tunnelProxy.Dispose(); _tunnelProxy = null; } if ((_tunnelProxy == null) || _tunnelProxy.IsBroken) { IPEndPoint ep = await remoteEP.GetIPEndPointAsync(); Socket socket = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); await socket.ConnectAsync(ep); _tunnelProxy = new TunnelProxy(socket, remoteEP, _enableSslWrapper, _ignoreCertificateErrors); } base.Host = _tunnelProxy.TunnelEndPoint.Address.ToString(); base.Port = _tunnelProxy.TunnelEndPoint.Port; } else { base.Host = _host; base.Port = _port; } await base.SendMailAsync(message); } else { EndPoint remoteEP = EndPointExtension.GetEndPoint(_host, _port); if ((_tunnelProxy != null) && !_tunnelProxy.RemoteEndPoint.Equals(remoteEP)) { _tunnelProxy.Dispose(); _tunnelProxy = null; } if ((_tunnelProxy == null) || _tunnelProxy.IsBroken) { _tunnelProxy = await _proxy.CreateTunnelProxyAsync(remoteEP, _enableSslWrapper, _ignoreCertificateErrors); } base.Host = _tunnelProxy.TunnelEndPoint.Address.ToString(); base.Port = _tunnelProxy.TunnelEndPoint.Port; await base.SendMailAsync(message); } } else { await base.SendMailAsync(message); } }