private int IsHandle(byte[] firstPacket, int length) { if (length >= 7 && _config.ProxyRuleMode != ProxyRuleMode.Disable) { IPAddress ipAddress = null; if (firstPacket[0] == 1) { var addr = new byte[4]; Array.Copy(firstPacket, 1, addr, 0, addr.Length); ipAddress = new IPAddress(addr); } else if (firstPacket[0] == 3) { int len = firstPacket[1]; var addr = new byte[len]; if (length >= len + 2) { Array.Copy(firstPacket, 2, addr, 0, addr.Length); var host = Encoding.UTF8.GetString(firstPacket, 2, len); if (IPAddress.TryParse(host, out ipAddress)) { //pass } else { if ((_config.ProxyRuleMode == ProxyRuleMode.BypassLanAndChina || _config.ProxyRuleMode == ProxyRuleMode.BypassLanAndNotChina) && _IPRange != null || _config.ProxyRuleMode == ProxyRuleMode.UserCustom) { if (!IPAddress.TryParse(host, out ipAddress)) { if (_config.ProxyRuleMode == ProxyRuleMode.UserCustom) { if (HostMap.GetHost(host, out var host_addr)) { if (!string.IsNullOrEmpty(host_addr)) { var lower_host_addr = host_addr.ToLower(); if (lower_host_addr.StartsWith("reject") || lower_host_addr.StartsWith("direct") ) { return(CONNECT_DIRECT); } if (lower_host_addr.StartsWith("localproxy")) { return(CONNECT_LOCALPROXY); } if (lower_host_addr.StartsWith("remoteproxy")) { return(CONNECT_REMOTEPROXY); } if (lower_host_addr.IndexOf('.') >= 0 || lower_host_addr.IndexOf(':') >= 0) { if (!IPAddress.TryParse(lower_host_addr, out ipAddress)) { // } } } } } if (ipAddress == null) { ipAddress = DnsUtil.DnsBuffer.Get(host); } } if (ipAddress == null) { ipAddress = DnsUtil.QueryDns(host); if (ipAddress != null) { DnsUtil.DnsBuffer.Set(host, new IPAddress(ipAddress.GetAddressBytes())); if (host.IndexOf('.') >= 0 && IPSubnet.IsLan(ipAddress)) { // assume that it is pollution if return LAN address return(CONNECT_REMOTEPROXY); } } else { Logging.Log(LogLevel.Debug, "DNS query fail: " + host); } } } } } } else if (firstPacket[0] == 4) { var addr = new byte[16]; Array.Copy(firstPacket, 1, addr, 0, addr.Length); ipAddress = new IPAddress(addr); } if (ipAddress != null) { if (_config.ProxyRuleMode == ProxyRuleMode.UserCustom) { if (HostMap.GetIP(ipAddress, out var host_addr)) { var lower_host_addr = host_addr.ToLower(); if (lower_host_addr.StartsWith("reject") || lower_host_addr.StartsWith("direct") ) { return(CONNECT_DIRECT); } if (lower_host_addr.StartsWith("localproxy")) { return(CONNECT_LOCALPROXY); } if (lower_host_addr.StartsWith("remoteproxy")) { return(CONNECT_REMOTEPROXY); } } } else { if (IPSubnet.IsLan(ipAddress)) { return(CONNECT_DIRECT); } if (_config.ProxyRuleMode is ProxyRuleMode.BypassLanAndChina or ProxyRuleMode.BypassLanAndNotChina && _IPRange is not null) { if (_IPRange.IsInIPRange(ipAddress)) { return(CONNECT_LOCALPROXY); } DnsUtil.DnsBuffer.Sweep(); } } } } return(CONNECT_REMOTEPROXY); }