/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { try { if (server.Type == "Socks5") { if (!String.IsNullOrWhiteSpace(server.Username) && !String.IsNullOrWhiteSpace(server.Password)) { Instance = new MihaZupan.HttpToSocks5Proxy(server.Address, server.Port, server.Username, server.Password, 2802); } else { Instance = new MihaZupan.HttpToSocks5Proxy(server.Address, server.Port, 2802); } } else { Instance = new MihaZupan.HttpToSocks5Proxy("127.0.0.1", 2801, 2802); } using (var registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true)) { registry.SetValue("ProxyEnable", 1); registry.SetValue("ProxyServer", "127.0.0.1:2802"); Win32Native.InternetSetOption(IntPtr.Zero, 39, IntPtr.Zero, 0); Win32Native.InternetSetOption(IntPtr.Zero, 37, IntPtr.Zero, 0); } } catch (Exception e) { Utils.Logging.Info(e.ToString()); return(false); } return(true); }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { foreach (var proc in Process.GetProcessesByName("Privoxy")) { try { proc.Kill(); } catch (Exception) { // 跳过 } } if (!File.Exists("bin\\Privoxy.exe") || !File.Exists("bin\\default.conf")) { return(false); } File.WriteAllText("data\\privoxy.conf", File.ReadAllText("bin\\default.conf").Replace("_BIND_PORT_", Global.Settings["HTTPPort"].ToString()).Replace("_DEST_PORT_", Global.Settings["Socks5Port"].ToString())); Instance = new Process() { StartInfo = { FileName = String.Format("{0}\\bin\\Privoxy.exe", Directory.GetCurrentDirectory()), Arguments = "..\\data\\privoxy.conf", WorkingDirectory = String.Format("{0}\\bin", Directory.GetCurrentDirectory()), WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = true, CreateNoWindow = true } }; Instance.Start(); return(true); }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { var result = false; switch (server.Type) { case "Socks5": result = true; break; case "Shadowsocks": result = pSSController.Start(server); break; case "ShadowsocksR": result = pSSRController.Start(server); break; case "VMess": break; default: break; } if (result) { result = pNFController.Start(server, mode); } if (!result) { Stop(); } return(result); }
/// <summary> /// 启动 /// </summary> /// <param name="server">配置</param> /// <returns>是否成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { foreach (var proc in Process.GetProcessesByName("tun2socks")) { try { proc.Kill(); } catch (Exception) { // 跳过 } } if (!File.Exists("bin\\tun2socks.exe")) { return(false); } if (File.Exists("logging\\tun2socks.log")) { File.Delete("logging\\tun2socks.log"); } SavedMode = mode; SavedServer = server; Configure(); SetupBypass(); Instance = new Process(); Instance.StartInfo.WorkingDirectory = String.Format("{0}\\bin", Directory.GetCurrentDirectory()); Instance.StartInfo.FileName = String.Format("{0}\\bin\\tun2socks.exe", Directory.GetCurrentDirectory()); string dns; if (Global.TUNTAP.UseCustomDNS) { dns = ""; foreach (var value in Global.TUNTAP.DNS) { dns += value; dns += ','; } dns = dns.Trim(); dns = dns.Substring(0, dns.Length - 1); } else { pDNSController.Start(); dns = "127.0.0.1"; } if (Global.TUNTAP.UseFakeDNS) { dns += " -fakeDns"; } if (server.Type == "Socks5") { Instance.StartInfo.Arguments = String.Format("-proxyServer {0}:{1} -tunAddr {2} -tunMask {3} -tunGw {4} -tunDns {5}", server.Address, server.Port, Global.TUNTAP.Address, Global.TUNTAP.Netmask, Global.TUNTAP.Gateway, dns); } else { Instance.StartInfo.Arguments = String.Format("-proxyServer 127.0.0.1:{0} -tunAddr {1} -tunMask {2} -tunGw {3} -tunDns {4}", Global.Settings["Socks5Port"], Global.TUNTAP.Address, Global.TUNTAP.Netmask, Global.TUNTAP.Gateway, dns); } Instance.StartInfo.CreateNoWindow = true; Instance.StartInfo.RedirectStandardError = true; Instance.StartInfo.RedirectStandardInput = true; Instance.StartInfo.RedirectStandardOutput = true; Instance.StartInfo.UseShellExecute = false; Instance.EnableRaisingEvents = true; Instance.ErrorDataReceived += OnOutputDataReceived; Instance.OutputDataReceived += OnOutputDataReceived; State = Objects.State.Starting; Instance.Start(); Instance.BeginErrorReadLine(); Instance.BeginOutputReadLine(); Instance.PriorityClass = ProcessPriorityClass.RealTime; for (int i = 0; i < 1000; i++) { Thread.Sleep(10); if (State == Objects.State.Started) { return(true); } if (State == Objects.State.Stopped) { Stop(); return(false); } } return(false); }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { if (!File.Exists("bin\\Redirector.exe")) { return(false); } if (File.Exists("logging\\redirector.log")) { File.Delete("logging\\redirector.log"); } // 生成驱动文件路径 var driver = String.Format("{0}\\drivers\\netfilter2.sys", Environment.SystemDirectory); // 检查驱动是否存在 if (!File.Exists(driver)) { // 生成系统版本 var version = $"{Environment.OSVersion.Version.Major.ToString()}.{Environment.OSVersion.Version.Minor.ToString()}"; // 检查系统版本并复制对应驱动 try { switch (version) { case "10.0": File.Copy("bin\\Win-10.sys", driver); Utils.Logging.Info("已复制 Win10 驱动"); break; case "6.3": case "6.2": File.Copy("bin\\Win-8.sys", driver); Utils.Logging.Info("已复制 Win8 驱动"); break; case "6.1": case "6.0": File.Copy("bin\\Win-7.sys", driver); Utils.Logging.Info("已复制 Win7 驱动"); break; default: Utils.Logging.Info($"不支持的系统版本:{version}"); return(false); } } catch (Exception e) { Utils.Logging.Info("复制驱动文件失败"); Utils.Logging.Info(e.ToString()); return(false); } // 注册驱动文件 var result = nfapinet.NFAPI.nf_registerDriver("netfilter2"); if (result != nfapinet.NF_STATUS.NF_STATUS_SUCCESS) { Utils.Logging.Info($"注册驱动失败,返回值:{result}"); return(false); } } try { var service = new ServiceController("netfilter2"); if (service.Status == ServiceControllerStatus.Stopped) { service.Start(); } } catch (Exception e) { Utils.Logging.Info(e.ToString()); var result = nfapinet.NFAPI.nf_registerDriver("netfilter2"); if (result != nfapinet.NF_STATUS.NF_STATUS_SUCCESS) { Utils.Logging.Info($"注册驱动失败,返回值:{result}"); return(false); } } var processes = ""; foreach (var proc in mode.Rule) { processes += proc; processes += ","; } processes = processes.Substring(0, processes.Length - 1); Instance = MainController.GetProcess(); Instance.StartInfo.FileName = "bin\\Redirector.exe"; Instance.StartInfo.Arguments = String.Format("-r 127.0.0.1:{0} -p \"{1}\"", Global.Settings["Socks5Port"], processes); if (server.Type == "Socks5") { var result = Utils.DNS.Lookup(server.Address); if (result == null) { Utils.Logging.Info("无法解析服务器 IP 地址"); return(false); } Instance.StartInfo.Arguments = String.Format("-r {0}:{1} -p \"{2}\"", result.ToString(), server.Port, processes); if (!String.IsNullOrWhiteSpace(server.Username) && !String.IsNullOrWhiteSpace(server.Password)) { Instance.StartInfo.Arguments += String.Format(" -username \"{0}\" -password \"{1}\"", server.Username, server.Password); } } Instance.OutputDataReceived += OnOutputDataReceived; Instance.ErrorDataReceived += OnOutputDataReceived; State = Objects.State.Starting; Instance.Start(); Instance.BeginOutputReadLine(); Instance.BeginErrorReadLine(); for (int i = 0; i < 1000; i++) { Thread.Sleep(10); if (State == Objects.State.Started) { return(true); } if (State == Objects.State.Stopped) { Utils.Logging.Info("NF 进程启动失败"); Stop(); return(false); } } Utils.Logging.Info("NF 进程启动超时"); Stop(); return(false); }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { foreach (var proc in Process.GetProcessesByName("ShadowsocksR")) { try { proc.Kill(); } catch (Exception) { // 跳过 } } if (!File.Exists("bin\\ShadowsocksR.exe")) { return(false); } if (!Directory.Exists("data")) { Directory.CreateDirectory("data"); } File.WriteAllText("data\\last.json", Newtonsoft.Json.JsonConvert.SerializeObject(new Objects.Information.SSR() { server = server.Address, server_port = server.Port, password = server.Password, method = server.EncryptMethod, protocol = server.Protocol, protocol_param = server.ProtocolParam, obfs = server.OBFS, obfs_param = server.OBFSParam })); // 清理上一次的日志文件,防止淤积占用磁盘空间 if (Directory.Exists("logging")) { if (File.Exists("logging\\shadowsocksr.log")) { File.Delete("logging\\shadowsocksr.log"); } } Instance = MainController.GetProcess(); Instance.StartInfo.FileName = "bin\\ShadowsocksR.exe"; Instance.StartInfo.Arguments = "-c ..\\data\\last.json -u"; if (mode.BypassChina) { Instance.StartInfo.Arguments += " --acl default.acl"; } Instance.OutputDataReceived += OnOutputDataReceived; Instance.ErrorDataReceived += OnOutputDataReceived; State = Objects.State.Starting; Instance.Start(); Instance.BeginOutputReadLine(); Instance.BeginErrorReadLine(); for (int i = 0; i < 1000; i++) { Thread.Sleep(10); if (State == Objects.State.Started) { if (File.Exists("data\\last.json")) { File.Delete("data\\last.json"); } return(true); } if (State == Objects.State.Stopped) { Utils.Logging.Info("SSR 进程启动失败"); Stop(); return(false); } } Utils.Logging.Info("SSR 进程启动超时"); Stop(); return(false); }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { if (!File.Exists("bin\\v2ray.exe") || !File.Exists("bin\\v2ctl.exe")) { return(false); } if (!Directory.Exists("data")) { Directory.CreateDirectory("data"); } File.WriteAllText("data\\last.json", Newtonsoft.Json.JsonConvert.SerializeObject(new Objects.Information.VMess.Config() { inbounds = new List <Objects.Information.VMess.Inbounds>() { new Objects.Information.VMess.Inbounds() { settings = new Objects.Information.VMess.InboundSettings() } }, outbounds = new List <Objects.Information.VMess.Outbounds>() { new Objects.Information.VMess.Outbounds() { settings = new Objects.Information.VMess.OutboundSettings() { vnext = new List <Objects.Information.VMess.VNext>() { new Objects.Information.VMess.VNext() { address = server.Address, port = server.Port, users = new List <Objects.Information.VMess.User> { new Objects.Information.VMess.User() { id = server.UserID, alterId = server.AlterID, security = server.EncryptMethod } } } } }, streamSettings = new Objects.Information.VMess.StreamSettings() { network = server.TransferProtocol, security = server.TLSSecure == true ? "tls" : "", wsSettings = server.TransferProtocol == "ws" ? new Objects.Information.VMess.WebSocketSettings() { path = server.Path == "" ? "/" : server.Path, headers = new Objects.Information.VMess.WSHeaders() { Host = server.Host == "" ? server.Address : server.Host } } : null, tcpSettings = server.FakeType == "http" ? new Objects.Information.VMess.TCPSettings() { header = new Objects.Information.VMess.TCPHeaders() { type = server.FakeType, request = new Objects.Information.VMess.TCPRequest() { path = server.Path == "" ? "/" : server.Path, headers = new Objects.Information.VMess.TCPRequestHeaders() { Host = server.Host == "" ? server.Address : server.Host } } } } : null, kcpSettings = server.TransferProtocol == "kcp" ? new Objects.Information.VMess.KCPSettings() { header = new Objects.Information.VMess.TCPHeaders() { type = server.FakeType } } : null, quicSettings = server.TransferProtocol == "quic" ? new Objects.Information.VMess.QUICSettings() { security = server.QUICSecurity, key = server.QUICSecret, header = new Objects.Information.VMess.TCPHeaders() { type = server.FakeType } } : null, httpSettings = server.TransferProtocol == "h2" ? new Objects.Information.VMess.HTTPSettings() { host = server.Host == "" ? server.Address : server.Host, path = server.Path == "" ? "/" : server.Path } : null, tlsSettings = new Objects.Information.VMess.TLSSettings() }, mux = new Objects.Information.VMess.OutboundMux() } }, routing = new Objects.Information.VMess.Routing() })); // 清理上一次的日志文件,防止淤积占用磁盘空间 if (Directory.Exists("logging")) { if (File.Exists("logging\\v2ray.log")) { File.Delete("logging\\v2ray.log"); } } Instance = MainController.GetProcess(); Instance.StartInfo.FileName = "bin\\v2ray.exe"; Instance.StartInfo.Arguments = "-config ..\\data\\last.json"; Instance.OutputDataReceived += OnOutputDataReceived; Instance.ErrorDataReceived += OnOutputDataReceived; State = Objects.State.Starting; Instance.Start(); Instance.BeginOutputReadLine(); Instance.BeginErrorReadLine(); for (int i = 0; i < 1000; i++) { Thread.Sleep(10); if (State == Objects.State.Started) { if (File.Exists("data\\last.json")) { File.Delete("data\\last.json"); } return(true); } if (State == Objects.State.Stopped) { Utils.Logging.Info("V2Ray 进程启动失败"); Stop(); return(false); } } Utils.Logging.Info("V2Ray 进程启动超时"); Stop(); return(false); }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { foreach (var proc in Process.GetProcessesByName("Shadowsocks")) { try { proc.Kill(); } catch (Exception) { // 跳过 } } if (!File.Exists("bin\\Shadowsocks.exe")) { return(false); } // 清理上一次的日志文件,防止淤积占用磁盘空间 if (Directory.Exists("logging")) { if (File.Exists("logging\\shadowsocks.log")) { File.Delete("logging\\shadowsocks.log"); } } Instance = MainController.GetProcess(); Instance.StartInfo.FileName = "bin\\Shadowsocks.exe"; if (!String.IsNullOrWhiteSpace(server.OBFS) && !String.IsNullOrWhiteSpace(server.OBFSParam)) { Instance.StartInfo.Arguments = String.Format("-s {0} -p {1} -b 0.0.0.0 -l 2801 -m {2} -k \"{3}\" -u --plugin {4} --plugin-opts \"{5}\"", server.Address, server.Port, server.EncryptMethod, server.Password, server.OBFS, server.OBFSParam); } else { Instance.StartInfo.Arguments = String.Format("-s {0} -p {1} -b 0.0.0.0 -l 2801 -m {2} -k \"{3}\" -u", server.Address, server.Port, server.EncryptMethod, server.Password); } if (mode.BypassChina) { Instance.StartInfo.Arguments += " --acl default.acl"; } Instance.OutputDataReceived += OnOutputDataReceived; Instance.ErrorDataReceived += OnOutputDataReceived; State = Objects.State.Starting; Instance.Start(); Instance.BeginOutputReadLine(); Instance.BeginErrorReadLine(); for (int i = 0; i < 1000; i++) { Thread.Sleep(10); if (State == Objects.State.Started) { return(true); } if (State == Objects.State.Stopped) { Utils.Logging.Info("SS 进程启动失败"); Stop(); return(false); } } Utils.Logging.Info("SS 进程启动超时"); Stop(); return(false); }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { var result = false; switch (server.Type) { case "Socks5": result = true; break; case "Shadowsocks": KillProcess("Shadowsocks"); result = pSSController.Start(server, mode); break; case "ShadowsocksR": KillProcess("ShadowsocksR"); result = pSSRController.Start(server, mode); break; case "VMess": KillProcess("v2ray"); result = pVMessController.Start(server, mode); break; default: break; } if (result) { if (mode.Type == 0) { // 进程代理模式,启动 NF 控制器 result = pNFController.Start(server, mode); } else if (mode.Type == 1) { // TUN/TAP 全局代理模式,启动 TUN/TAP 控制器 result = pTUNTAPController.Start(server, mode); } else if (mode.Type == 2) { // TUN/TAP 全局代理模式,启动 TUN/TAP 控制器 result = pTUNTAPController.Start(server, mode); } else if (mode.Type == 3 || mode.Type == 5) { // HTTP 系统代理和 Socks5 和 HTTP 代理模式,启动 HTTP 控制器 result = pHTTPController.Start(server, mode); } else if (mode.Type == 4) { // Socks5 代理模式,不需要启动额外的控制器 } else { result = false; } } if (!result) { Stop(); } return(result); }
public void InitMode() { ModeComboBox.Items.Clear(); if (Directory.Exists("mode")) { var list = new List <Objects.Mode>(); foreach (var name in Directory.GetFiles("mode", "*.txt")) { var ok = true; var mode = new Objects.Mode(); using (var sr = new StringReader(File.ReadAllText(name))) { var i = 0; string text; while ((text = sr.ReadLine()) != null) { if (i == 0) { var splited = text.Trim().Substring(1).Split(','); if (splited.Length == 0) { ok = false; break; } if (splited.Length >= 1) { mode.Remark = splited[0].Trim(); } if (splited.Length >= 2) { if (int.TryParse(splited[1], out int result)) { mode.Type = result; } else { ok = false; break; } } if (splited.Length >= 3) { if (int.TryParse(splited[2], out int result)) { mode.BypassChina = (result == 1); } else { ok = false; break; } } } else { if (!text.StartsWith("#") && !String.IsNullOrWhiteSpace(text)) { mode.Rule.Add(text.Trim()); } } i++; } } if (ok) { list.Add(mode); } } var array = list.ToArray(); Array.Sort(array, (a, b) => String.Compare(a.Remark, b.Remark, StringComparison.Ordinal)); ModeComboBox.Items.AddRange(array); } // 查询设置中是否正常加载了上次存储的服务器位置 if (Global.Settings.TryGetValue("ModeComboBoxSelectedIndex", out int count)) { // 如果值合法,选中该位置 if (count > 0 && count < ModeComboBox.Items.Count) { ModeComboBox.SelectedIndex = count; } // 如果值非法,且当前 ModeComboBox 中有元素,选择第一个位置 else if (ModeComboBox.Items.Count > 0) { ModeComboBox.SelectedIndex = 0; } // 如果当前 ModeComboBox 中没元素,不做处理 } else // 如果设置中没有加载上次的位置,给Settings添加元素 { Global.Settings.Add("ModeComboBoxSelectedIndex", 0); // 如果当前 ModeComboBox 中有元素,选择第一个位置 if (ModeComboBox.Items.Count > 0) { ModeComboBox.SelectedIndex = 0; } // 如果当前 ModeComboBox 中没元素,不做处理 } }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { if (!File.Exists("NetchCore.dll")) { Utils.Logging.Info("核心文件 NetchCore.dll 丢失"); return(false); } // 生成驱动文件路径 var driver = String.Format("{0}\\drivers\\netfilter2.sys", Environment.SystemDirectory); // 检查驱动是否存在 if (!File.Exists(driver)) { // 生成系统版本 var version = $"{Environment.OSVersion.Version.Major.ToString()}.{Environment.OSVersion.Version.Minor.ToString()}"; // 检查系统版本并复制对应驱动 try { switch (version) { case "10.0": File.Copy("bin\\Win-10.sys", driver); Utils.Logging.Info("已复制 Win10 驱动"); break; case "6.3": case "6.2": File.Copy("bin\\Win-8.sys", driver); Utils.Logging.Info("已复制 Win8 驱动"); break; case "6.1": case "6.0": File.Copy("bin\\Win-7.sys", driver); Utils.Logging.Info("已复制 Win7 驱动"); break; default: Utils.Logging.Info($"不支持的系统版本:{version}"); return(false); } } catch (Exception e) { Utils.Logging.Info("复制驱动文件失败"); Utils.Logging.Info(e.ToString()); return(false); } // 注册驱动文件 var result = nfapinet.NFAPI.nf_registerDriver("netfilter2"); if (result != nfapinet.NF_STATUS.NF_STATUS_SUCCESS) { Utils.Logging.Info($"注册驱动失败,返回值:{result}"); return(false); } } try { var service = new ServiceController("netfilter2"); if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped); } service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); } catch (Exception e) { Utils.Logging.Info(e.ToString()); var result = nfapinet.NFAPI.nf_registerDriver("netfilter2"); if (result != nfapinet.NF_STATUS.NF_STATUS_SUCCESS) { Utils.Logging.Info($"注册驱动失败,返回值:{result}"); return(false); } } // 初始化 if (!Win32Native.srn_init()) { Utils.Logging.Info("初始化失败"); return(false); } // 设置驱动名 Win32Native.srn_addOption(Win32Native.OptionType.OT_DRIVER_NAME, "netfilter2"); // 绕过 IPv4 环路地址 Win32Native.srn_startRule(); Win32Native.srn_addOption(Win32Native.OptionType.OT_REMOTE_ADDRESS, "127.0.0.0/8"); Win32Native.srn_addOption(Win32Native.OptionType.OT_ACTION, "bypass"); Win32Native.srn_endRule(); // 绕过 IPv6 环路地址 Win32Native.srn_startRule(); Win32Native.srn_addOption(Win32Native.OptionType.OT_REMOTE_ADDRESS, "[::1]/128"); Win32Native.srn_addOption(Win32Native.OptionType.OT_ACTION, "bypass"); Win32Native.srn_endRule(); // 设置需要劫持的进程 foreach (var proc in mode.Rule) { Win32Native.srn_startRule(); Win32Native.srn_addOption(Win32Native.OptionType.OT_PROCESS_NAME, proc); Win32Native.srn_addOption(Win32Native.OptionType.OT_PROXY_ADDRESS, "127.0.0.1:2801"); if (!String.IsNullOrWhiteSpace(server.Username) && !String.IsNullOrWhiteSpace(server.Password)) { Win32Native.srn_addOption(Win32Native.OptionType.OT_PROXY_USER_NAME, server.Username); Win32Native.srn_addOption(Win32Native.OptionType.OT_PROXY_PASSWORD, server.Password); } Win32Native.srn_endRule(); } if (!Win32Native.srn_enable(1)) { Win32Native.srn_free(); return(false); } return(true); }
/// <summary> /// 初始化配置 /// </summary> public static void Init() { if (File.Exists("Data\\TUNTAP.ini")) { var parser = new IniParser.FileIniDataParser(); var data = parser.ReadFile("Data\\TUNTAP.ini"); if (IPAddress.TryParse(data["Generic"]["Address"], out var address)) { Global.TUNTAP.Address = address; } if (IPAddress.TryParse(data["Generic"]["Netmask"], out var netmask)) { Global.TUNTAP.Netmask = netmask; } if (IPAddress.TryParse(data["Generic"]["Gateway"], out var gateway)) { Global.TUNTAP.Gateway = gateway; } var dns = new List <IPAddress>(); foreach (var ip in data["Generic"]["DNS"].Split(',')) { if (IPAddress.TryParse(ip, out var value)) { dns.Add(value); } } if (Boolean.TryParse(data["Generic"]["UseCustomDNS"], out var useCustomDNS)) { Global.TUNTAP.UseCustomDNS = useCustomDNS; } if (dns.Count > 0) { Global.TUNTAP.DNS = dns; } } if (File.Exists("Data\\Servers.json")) { Global.Servers = Newtonsoft.Json.JsonConvert.DeserializeObject <List <Objects.Server> >(File.ReadAllText("Data\\Servers.json")); } if (File.Exists("Data\\BypassIPs.json")) { Global.BypassIPs = Newtonsoft.Json.JsonConvert.DeserializeObject <List <String> >(File.ReadAllText("Data\\BypassIPs.json")); } foreach (var name in Directory.GetFiles("Mode", "*.txt")) { var mode = new Objects.Mode(); using (var sr = new StringReader(File.ReadAllText(name))) { var i = 0; var ok = true; string text; while ((text = sr.ReadLine()) != null) { if (i == 0) { var splited = text.Substring(1).Split(','); if (splited.Length == 3) { mode.Name = splited[0].Trim(); mode.Type = int.Parse(splited[1]); mode.BypassChina = (int.Parse(splited[2]) == 1) ? true : false; } else { ok = false; break; } } else { if (!text.StartsWith("#")) { mode.Rule.Add(text.Trim()); } } i++; } if (!ok) { break; } } Global.Modes.Add(mode); } }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { if (!File.Exists("bin\\Shadowsocks.exe")) { return(false); } // 清理上一次的日志文件,防止淤积占用磁盘空间 if (Directory.Exists("logging")) { if (File.Exists("logging\\shadowsocks.log")) { File.Delete("logging\\shadowsocks.log"); } } Instance = MainController.GetProcess(); Instance.StartInfo.FileName = "bin\\Shadowsocks.exe"; if (!String.IsNullOrWhiteSpace(server.OBFS) && !String.IsNullOrWhiteSpace(server.OBFSParam)) { Instance.StartInfo.Arguments = $"-s {server.Address} -p {server.Port} -b {Global.Settings.LocalAddress} -l {Global.Settings.Socks5LocalPort} -m {server.EncryptMethod} -k \"{server.Password}\" -u --plugin {server.OBFS} --plugin-opts \"{server.OBFSParam}\""; } else { Instance.StartInfo.Arguments = $"-s {server.Address} -p {server.Port} -b {Global.Settings.LocalAddress} -l {Global.Settings.Socks5LocalPort} -m {server.EncryptMethod} -k \"{server.Password}\" -u"; } if (mode.BypassChina) { Instance.StartInfo.Arguments += " --acl default.acl"; } Instance.OutputDataReceived += OnOutputDataReceived; Instance.ErrorDataReceived += OnOutputDataReceived; State = Objects.State.Starting; Instance.Start(); Instance.BeginOutputReadLine(); Instance.BeginErrorReadLine(); for (int i = 0; i < 1000; i++) { Thread.Sleep(10); if (State == Objects.State.Started) { return(true); } if (State == Objects.State.Stopped) { Utils.Logging.Info("SS 进程启动失败"); Stop(); return(false); } } Utils.Logging.Info("SS 进程启动超时"); Stop(); return(false); }
/// <summary> /// 启动 /// </summary> /// <param name="server">服务器</param> /// <param name="mode">模式</param> /// <returns>是否启动成功</returns> public bool Start(Objects.Server server, Objects.Mode mode) { var result = false; switch (server.Type) { case "Socks5": result = true; break; case "Shadowsocks": result = pSSController.Start(server, mode); break; case "ShadowsocksR": result = pSSRController.Start(server, mode); break; case "VMess": result = pVMessController.Start(server, mode); break; default: break; } if (result) { if (mode.Type == 0) { result = pNFController.Start(server, mode); } else if (mode.Type == 1) { result = pTUNTAPController.Start(server, mode); } else if (mode.Type == 2) { result = pTUNTAPController.Start(server, mode); } else if (mode.Type == 3 || mode.Type == 5) { result = pHTTPController.Start(server, mode); } else if (mode.Type == 4) { // 跳过 } else { result = false; } } if (!result) { Stop(); } return(result); }
/// <summary> /// 从文件初始化 /// </summary> public static void InitFromFile() { // 检查配置文件是否存在,如果不存在则写入一个默认的配置 if (!File.Exists("x2tap.ini")) { File.WriteAllBytes("x2tap.ini", Resources.defaultConfig); } var parser = new FileIniDataParser(); var data = parser.ReadFile("x2tap.ini"); Global.Config.v2rayLoggingLevel = int.Parse(data["x2tap"]["v2rayLoggingLevel"]); Global.Config.TUNTAP.Address = data["TUNTAP"]["Address"]; Global.Config.TUNTAP.Netmask = data["TUNTAP"]["Netmask"]; Global.Config.TUNTAP.Gateway = data["TUNTAP"]["Gateway"]; Global.Config.TUNTAP.Metric = int.Parse(data["TUNTAP"]["Metric"]); if (File.Exists("SubscriptionLinks.json")) { Global.SubscriptionLinks = JsonConvert.DeserializeObject <List <string> >(File.ReadAllText("SubscriptionLinks.json")); } if (File.Exists("v2ray.json")) { Global.v2rayProxies = JsonConvert.DeserializeObject <List <Objects.Server.v2ray> >(File.ReadAllText("v2ray.json")); } if (File.Exists("Shadowsocks.json")) { Global.ShadowsocksProxies = JsonConvert.DeserializeObject <List <Shadowsocks> >(File.ReadAllText("Shadowsocks.json")); } if (File.Exists("ShadowsocksR.json")) { Global.ShadowsocksRProxies = JsonConvert.DeserializeObject <List <ShadowsocksR> >(File.ReadAllText("ShadowsocksR.json")); } if (Directory.Exists("mode")) { foreach (var name in Directory.GetFiles("mode", "*.txt")) { var mode = new Objects.Mode() { Name = name.Substring(5, name.Length - 9) }; using (var sr = new StringReader(File.ReadAllText(name))) { var i = 0; var ok = true; string text; while ((text = sr.ReadLine()) != null) { if (i == 0) { var splited = text.Substring(2).Split(','); if (splited.Length == 2) { mode.Name = splited[0].Trim(); mode.Type = int.Parse(splited[1].Trim()); } else { ok = false; break; } } else { if (!text.StartsWith("#")) { mode.Rule.Add(text.Trim()); } } i++; } if (!ok) { break; } } Global.Modes.Add(mode); } } }