Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
        /// <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);
        }
Exemple #9
0
        /// <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);
        }
Exemple #10
0
        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 中没元素,不做处理
            }
        }
Exemple #11
0
        /// <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);
        }
Exemple #12
0
        /// <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);
            }
        }
Exemple #13
0
        /// <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);
        }
Exemple #14
0
        /// <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);
        }
Exemple #15
0
        /// <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);
                }
            }
        }