コード例 #1
0
        public Match AddNewMatch(MatchInfo matchInfo, Models.Server server)
        {
            var match = new Match
            {
                Server      = server,
                Timestamp   = matchInfo.Timestamp,
                Map         = Maps.FindOrAddMap(matchInfo.Map),
                GameMode    = GameModes.FindOrAddGameMode(matchInfo.GameMode),
                FragLimit   = matchInfo.FragLimit,
                TimeLimit   = matchInfo.TimeLimit,
                TimeElapsed = matchInfo.TimeElapsed
            };

            foreach (var scoreInfo in matchInfo.Scoreboard)
            {
                var score = new Score
                {
                    Match    = match,
                    Position = scoreInfo.Position,
                    Player   = Players.FindOrAddPlayer(scoreInfo.Name),
                    Frags    = scoreInfo.Frags,
                    Kills    = scoreInfo.Kills,
                    Deaths   = scoreInfo.Deaths
                };

                match.Scoreboard.Add(score);
            }

            match.IsProcessedForStatistics = false;

            Matches.Add(match);

            return(match);
        }
コード例 #2
0
        public ServerStats GetServerStats(Models.Server server)
        {
            var serverStats = new ServerStats();
            var statistics  = server.Statistics;

            serverStats.TotalMatchesPlayed = statistics.TotalMatchesPlayed;

            var mostPopularDay = DateServerStats.GetMostPopularDayForServer(server);

            if (mostPopularDay != null)
            {
                serverStats.MaximumMatchesPerDay = mostPopularDay.MatchesPlayed;
            }

            var totalDays = TimeHelper.GetUtcNumberOfDaysBetween(statistics.FirstMatchTimestamp,
                                                                 Matches.GetLastMatchTimestampAmongAllServers());

            serverStats.AverageMatchesPerDay = (double)serverStats.TotalMatchesPlayed / totalDays;

            serverStats.MaximumPopulation = statistics.MaximumPopulation;
            serverStats.AveragePopulation = (double)statistics.SumOfPopulations / serverStats.TotalMatchesPlayed;

            serverStats.Top5GameModes = ServerGameModeStats.FindTopGameModesForServer(server, ServerStats.TopGameModesCount)
                                        .Select(gm => gm.GameMode.Name)
                                        .ToArray();

            serverStats.Top5Maps = ServerMapStats.FindTopMapsForServer(server, ServerStats.TopMapsCount)
                                   .Select(map => map.Map.Name)
                                   .ToArray();

            return(serverStats);
        }
コード例 #3
0
 public DateServerStats GetMostPopularDayForServer(Models.Server server)
 {
     return(Db.DateServerStats
            .Where(ds => ds.ServerId == server.Id)
            .OrderByDescending(ds => ds.MatchesPlayed)
            .FirstOrDefault());
 }
コード例 #4
0
ファイル: SSController.cs プロジェクト: wlaotou/Netch
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Models.Server server, Models.Mode mode)
        {
            if (!File.Exists("bin\\Shadowsocks.exe"))
            {
                return(false);
            }

            // 清理上一次的日志文件,防止淤积占用磁盘空间
            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 = Models.State.Starting;
            Instance.Start();
            Instance.BeginOutputReadLine();
            Instance.BeginErrorReadLine();
            for (int i = 0; i < 1000; i++)
            {
                Thread.Sleep(10);

                if (State == Models.State.Started)
                {
                    return(true);
                }

                if (State == Models.State.Stopped)
                {
                    Utils.Logging.Info("SS 进程启动失败");

                    Stop();
                    return(false);
                }
            }

            Utils.Logging.Info("SS 进程启动超时");
            Stop();
            return(false);
        }
コード例 #5
0
ファイル: ShadowsocksR.cs プロジェクト: zt199510/Netch
        public ShadowsocksR(Models.Server server = default)
        {
            InitializeComponent();

            _server = server ?? new Models.Server {
                EncryptMethod = Global.EncryptMethods.SSR[0]
            };
        }
コード例 #6
0
        /// <summary>
        ///     初始化
        /// </summary>
        /// <param name="index">需要编辑的索引</param>
        public Socks5(int index = -1)
        {
            InitializeComponent();

            _server = index != -1
                ? Global.Settings.Server[index]
                : new Models.Server();
        }
コード例 #7
0
 public IEnumerable <ServerMapStats> FindTopMapsForServer(Models.Server server, int count)
 {
     return(Db.ServerMapStats
            .Where(sm => sm.ServerId == server.Id)
            .OrderByDescending(sm => sm.MatchesPlayed)
            .Take(ServerStats.TopMapsCount)
            .ToList());
 }
コード例 #8
0
 public IEnumerable <ServerGameModeStats> FindTopGameModesForServer(Models.Server server, int count)
 {
     return(Db.ServerGameModeStats
            .Where(gm => gm.ServerId == server.Id)
            .OrderByDescending(gm => gm.MatchesPlayed)
            .Take(ServerStats.TopGameModesCount)
            .ToList());
 }
コード例 #9
0
ファイル: Vmess.cs プロジェクト: zt199510/Netch
        public VMess(Models.Server server = default)
        {
            InitializeComponent();

            _server = server ?? new Models.Server {
                EncryptMethod = Global.EncryptMethods.VMess[0]
            };
        }
コード例 #10
0
        public PopularServer(Models.Server server, DateTime lastMatchTimestamp)
        {
            Endpoint = server.Endpoint;
            Name     = server.Name;

            var totalDays = TimeHelper.GetUtcNumberOfDaysBetween(server.Statistics.FirstMatchTimestamp,
                                                                 lastMatchTimestamp);

            AverageMatchesPerDay = (double)server.Statistics.TotalMatchesPlayed / totalDays;
        }
コード例 #11
0
        /// <summary>
        ///     初始化
        /// </summary>
        /// <param name="index">需要编辑的索引</param>
        public Shadowsocks(int index = -1)
        {
            InitializeComponent();

            _server = index != -1
                ? Global.Settings.Server[index]
                : new Models.Server {
                EncryptMethod = Global.EncryptMethods.SS[0]
            };
        }
コード例 #12
0
        public VMess(int index = -1)
        {
            InitializeComponent();

            server = index != -1
                ? Global.Settings.Server[index]
                : new Models.Server {
                EncryptMethod = Global.EncryptMethods.VMess[0]
            };
        }
コード例 #13
0
ファイル: SSController.cs プロジェクト: zorlei/Netch
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Models.Server server, Models.Mode mode)
        {
            MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting Shadowsocks")}");
            if (!File.Exists("bin\\Shadowsocks.exe"))
            {
                return(false);
            }

            Instance = MainController.GetProcess();
            Instance.StartInfo.FileName = "bin\\Shadowsocks.exe";

            if (!string.IsNullOrWhiteSpace(server.Plugin) && !string.IsNullOrWhiteSpace(server.PluginOption))
            {
                Instance.StartInfo.Arguments = $"-s {server.Hostname} -p {server.Port} -b {Global.Settings.LocalAddress} -l {Global.Settings.Socks5LocalPort} -m {server.EncryptMethod} -k \"{server.Password}\" -u --plugin {server.Plugin} --plugin-opts \"{server.PluginOption}\"";
            }
            else
            {
                Instance.StartInfo.Arguments = $"-s {server.Hostname} -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 = Models.State.Starting;
            Instance.Start();
            Instance.BeginOutputReadLine();
            Instance.BeginErrorReadLine();
            for (var i = 0; i < 1000; i++)
            {
                Thread.Sleep(10);

                if (State == Models.State.Started)
                {
                    return(true);
                }

                if (State == Models.State.Stopped)
                {
                    Utils.Logging.Info("SS 进程启动失败");

                    Stop();
                    return(false);
                }
            }

            Utils.Logging.Info("SS 进程启动超时");
            Stop();
            return(false);
        }
コード例 #14
0
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Models.Server server, Models.Mode mode)
        {
            Forms.MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting Trojan")}");

            File.Delete("logging\\trojan.log");
            if (!File.Exists("bin\\Trojan.exe"))
            {
                return(false);
            }

            File.WriteAllText("data\\last.json", Newtonsoft.Json.JsonConvert.SerializeObject(new Models.Trojan()
            {
                local_addr  = Global.Settings.LocalAddress,
                local_port  = Global.Settings.Socks5LocalPort,
                remote_addr = server.Hostname,
                remote_port = server.Port,
                password    = new List <string>()
                {
                    server.Password
                }
            }));

            Instance = MainController.GetProcess();
            Instance.StartInfo.FileName  = "bin\\Trojan.exe";
            Instance.StartInfo.Arguments = "-c ..\\data\\last.json";
            Instance.OutputDataReceived += OnOutputDataReceived;
            Instance.ErrorDataReceived  += OnOutputDataReceived;

            State = Models.State.Starting;
            Instance.Start();
            Instance.BeginOutputReadLine();
            Instance.BeginErrorReadLine();
            for (var i = 0; i < 1000; i++)
            {
                Thread.Sleep(10);

                if (State == Models.State.Started)
                {
                    return(true);
                }

                if (State == Models.State.Stopped)
                {
                    Utils.Logging.Info("Trojan 进程启动失败");

                    Stop();
                    return(false);
                }
            }

            Utils.Logging.Info("Trojan 进程启动超时");
            Stop();
            return(false);
        }
コード例 #15
0
ファイル: ShareLink.cs プロジェクト: zwzk4/Netch
        /// <summary>
        ///		根据服务器生成分享链接
        /// </summary>
        /// <param name="server">需要获取分享链接的服务器</param>
        /// <returns>解码后的字符串</returns>
        public static string GetShareLink(Models.Server server)
        {
            string retLinkStr = "";

            switch (server.Type)
            {
            case "Socks5":
                // https://t.me/socks?server=1.1.1.1&port=443
                retLinkStr = string.Format("https://t.me/socks?server={0}&port={1}", server.Hostname, server.Port);

                break;

            case "SS":
                // ss://method:password@server:port#Remark
                retLinkStr = "ss://" + URLSafeBase64Encode(string.Format("{0}:{1}@{2}:{3}", server.EncryptMethod, server.Password, server.Hostname, server.Port)) + "#" + HttpUtility.UrlEncode(server.Remark);

                break;

            case "SSR":
                // https://github.com/shadowsocksr-backup/shadowsocks-rss/wiki/SSR-QRcode-scheme
                // ssr://base64(host:port:protocol:method:obfs:base64pass/?obfsparam=base64param&protoparam=base64param&remarks=base64remarks&group=base64group&udpport=0&uot=0)
                string paraStr = string.Format("/?obfsparam={0}&protoparam={1}&remarks={2}", URLSafeBase64Encode(server.OBFSParam), URLSafeBase64Encode(server.ProtocolParam), URLSafeBase64Encode(server.Remark));
                retLinkStr = "ssr://" + URLSafeBase64Encode(string.Format("{0}:{1}:{2}:{3}:{4}:{5}{6}", server.Hostname, server.Port, server.Protocol, server.EncryptMethod, server.OBFS, URLSafeBase64Encode(server.Password), paraStr));

                break;

            case "VMess":
                string vmessJson = Newtonsoft.Json.JsonConvert.SerializeObject(new
                {
                    v    = "2",
                    ps   = server.Remark,
                    add  = server.Hostname,
                    port = server.Port,
                    id   = server.UserID,
                    aid  = server.AlterID,
                    net  = server.TransferProtocol,
                    type = server.FakeType,
                    host = server.Host,
                    path = server.Path,
                    tls  = server.TLSSecure ? "tls" : ""
                });
                retLinkStr = "vmess://" + URLSafeBase64Encode(vmessJson);

                break;

            default:
                return(null);
            }
            return(retLinkStr);
        }
コード例 #16
0
ファイル: HTTPController.cs プロジェクト: tsinhi/Netch
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Models.Server server, Models.Mode mode)
        {
            try
            {
                if (server.Type == "Socks5")
                {
                    if (!string.IsNullOrWhiteSpace(server.Username) && !string.IsNullOrWhiteSpace(server.Password))
                    {
                        return(false);
                    }

                    pPrivoxyController.Start(server, mode);
                }
                else
                {
                    pPrivoxyController.Start(server, mode);
                }

                if (mode.Type != 5)
                {
                    RecordPrevious();

                    NativeMethods.SetGlobal($"127.0.0.1:{Global.Settings.HTTPLocalPort}", "<local>");

                    // HTTP 系统代理模式,启动系统代理

                    /*
                     * using (var registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
                     * {
                     *  registry.SetValue("ProxyEnable", 1);
                     *  registry.SetValue("ProxyServer", $"127.0.0.1:{Global.Settings.HTTPLocalPort}");
                     *
                     *  Win32Native.InternetSetOption(IntPtr.Zero, 39, IntPtr.Zero, 0);
                     *  Win32Native.InternetSetOption(IntPtr.Zero, 37, IntPtr.Zero, 0);
                     * }
                     */
                }
            }
            catch (Exception e)
            {
                if (System.Windows.Forms.MessageBox.Show(i18N.Translate("Failed to set the system proxy, it may be caused by the lack of dependent programs. Do you want to jump to Netch's official website to download dependent programs?"), i18N.Translate("Information"), MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
                {
                    System.Diagnostics.Process.Start("https://netch.org/#/?id=%e4%be%9d%e8%b5%96");
                }
                Utils.Logging.Info("设置系统代理失败" + e.ToString());
                return(false);
            }

            return(true);
        }
コード例 #17
0
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Models.Server server, Models.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);
            }

            if (server.Type != "Socks5")
            {
                File.WriteAllText("data\\privoxy.conf", File.ReadAllText("bin\\default.conf").Replace("_BIND_PORT_", Global.Settings.HTTPLocalPort.ToString()).Replace("_DEST_PORT_", Global.Settings.Socks5LocalPort.ToString()).Replace("0.0.0.0", Global.Settings.LocalAddress));
            }
            else
            {
                File.WriteAllText("data\\privoxy.conf", File.ReadAllText("bin\\default.conf").Replace("_BIND_PORT_", Global.Settings.HTTPLocalPort.ToString()).Replace("_DEST_PORT_", server.Port.ToString()).Replace("s 0.0.0.0", $"s {Global.Settings.LocalAddress}").Replace("/ 127.0.0.1", $"/ {server.Hostname}"));
            }


            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);
        }
コード例 #18
0
ファイル: HTTPController.cs プロジェクト: testsunhub/Netch
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Models.Server server, Models.Mode mode)
        {
            try
            {
                if (server.Type == "Socks5")
                {
                    if (!string.IsNullOrWhiteSpace(server.Username) && !string.IsNullOrWhiteSpace(server.Password))
                    {
                        return(false);
                    }

                    pPrivoxyController.Start(server, mode);
                }
                else
                {
                    pPrivoxyController.Start(server, mode);
                }

                if (mode.Type != 5)
                {
                    NativeMethods.SetGlobal($"127.0.0.1:{Global.Settings.HTTPLocalPort}", "<local>");

                    // HTTP 系统代理模式,启动系统代理

                    /*
                     * using (var registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
                     * {
                     *  registry.SetValue("ProxyEnable", 1);
                     *  registry.SetValue("ProxyServer", $"127.0.0.1:{Global.Settings.HTTPLocalPort}");
                     *
                     *  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);
        }
コード例 #19
0
        public ServerMapStats FindOrAddServerMapStats(Models.Server server, Map map)
        {
            var serverMap = Db.ServerMapStats.FirstOrDefault(sm => sm.ServerId == server.Id && sm.MapId == map.Id);

            if (serverMap != null)
            {
                return(serverMap);
            }

            serverMap = new ServerMapStats
            {
                Server        = server,
                Map           = map,
                MatchesPlayed = 0
            };

            Db.ServerMapStats.Add(serverMap);
            return(serverMap);
        }
コード例 #20
0
        public PlayerServerStats FindOrAddPlayerServerStats(Player player, Models.Server server)
        {
            var playerServerStats =
                Db.PlayerServerStats.FirstOrDefault(ps => ps.PlayerId == player.Id && ps.ServerId == server.Id);

            if (playerServerStats != null)
            {
                return(playerServerStats);
            }

            playerServerStats = new PlayerServerStats
            {
                Player        = player,
                Server        = server,
                MatchesPlayed = 0
            };

            Db.PlayerServerStats.Add(playerServerStats);

            return(playerServerStats);
        }
コード例 #21
0
        public ServerGameModeStats FindOrAddServerGameModeStats(Models.Server server, GameMode gameMode)
        {
            var serverGameMode =
                Db.ServerGameModeStats.FirstOrDefault(sgm => sgm.ServerId == server.Id && sgm.GameModeId == gameMode.Id);

            if (serverGameMode != null)
            {
                return(serverGameMode);
            }

            serverGameMode = new ServerGameModeStats
            {
                Server        = server,
                GameMode      = gameMode,
                MatchesPlayed = 0
            };

            Db.ServerGameModeStats.Add(serverGameMode);

            return(serverGameMode);
        }
コード例 #22
0
        public DateServerStats FindOrAddDateServerStats(int year, int dayOfYear, Models.Server server)
        {
            var dateServer =
                Db.DateServerStats.FirstOrDefault(
                    ds => ds.Year == year && ds.DayOfYear == dayOfYear && ds.ServerId == server.Id);

            if (dateServer != null)
            {
                return(dateServer);
            }

            dateServer = new DateServerStats
            {
                Year          = year,
                DayOfYear     = dayOfYear,
                Server        = server,
                MatchesPlayed = 0
            };

            Db.DateServerStats.Add(dateServer);

            return(dateServer);
        }
コード例 #23
0
        //
        //Apply our Server Models and return the split list (US and EU)
        //
        public Models.Servers GetServerStatuses()
        {
            var servers       = GetServers();
            var returnServers = new Models.Servers();

            foreach (var item in servers)
            {
                var newServer = new Models.Server()
                {
                    ServerName = item[0], State = item[1]
                };

                if (!newServer.ServerName.Contains("(EU)"))
                {
                    returnServers.US.Add(newServer);
                }
                else
                {
                    returnServers.EU.Add(newServer);
                }
            }
            return(returnServers);
        }
コード例 #24
0
 public void Info([FromBody] Info info, string endpoint)
 {
     try
     {
         for (int i = 0; i < info.InfoGameMods.Count; i++)
         {
             GameMode PUT_GameMode = info.InfoGameMods[i].GameMode;
             GameMode Db_GameMode  = db.GameMods.FirstOrDefault(gm => gm.Name == PUT_GameMode.Name);
             if (Db_GameMode != null)
             {
                 info.InfoGameMods[i].GameMode = Db_GameMode;
             }
         }
         var Db_Server = db.Servers.Include(s => s.Info).FirstOrDefault(s => s.Endpoint == endpoint);
         if (Db_Server != null)
         {
             db.Info.Remove(Db_Server.Info);
             Db_Server.Info = info;
             info.Server    = Db_Server;
             db.Info.Add(info);
             db.SaveChanges();
             return;
         }
         Models.Server PUT_Server = new Models.Server
         {
             Endpoint = endpoint,
             Info     = info,
             Matches  = new List <Match>()
         };
         db.Servers.Add(PUT_Server);
         db.SaveChanges();
     }
     catch (Exception exc)
     {
         Console.WriteLine($"{exc.Source}\n{exc.Message}\n");
     }
 }
コード例 #25
0
        public static List <Models.Server> Parse(string text)
        {
            var list = new List <Models.Server>();

            try
            {
                if (text.StartsWith("tg://socks?") || text.StartsWith("https://t.me/socks?"))
                {
                    var data = new Models.Server();
                    data.Type = "Socks5";

                    var dict = new Dictionary <string, string>();
                    foreach (var str in text.Replace("tg://socks?", "").Replace("https://t.me/socks?", "").Split('&'))
                    {
                        var splited = str.Split('=');

                        dict.Add(splited[0], splited[1]);
                    }

                    if (!dict.ContainsKey("server") || !dict.ContainsKey("port"))
                    {
                        return(null);
                    }

                    data.Hostname = dict["server"];
                    data.Port     = int.Parse(dict["port"]);
                    if (dict.ContainsKey("user") && !String.IsNullOrWhiteSpace(dict["user"]))
                    {
                        data.Username = dict["user"];
                    }
                    if (dict.ContainsKey("pass") && !String.IsNullOrWhiteSpace(dict["pass"]))
                    {
                        data.Password = dict["pass"];
                    }

                    list.Add(data);
                }
                else if (text.StartsWith("ss://"))
                {
                    var data = new Models.Server();
                    data.Type = "SS";

                    /*
                     * try
                     * {
                     *  if(!text.Contains("/?"))
                     *  {
                     *      var finder = new Regex(@"ss://(?<base64>[A-Za-z0-9+-/=_]+)(?:#(?<tag>\S+))?", RegexOptions.IgnoreCase);
                     *      var parser = new Regex(@"^((?<method>.+?):(?<password>.*)@(?<hostname>.+?):(?<port>\d+?))$", RegexOptions.IgnoreCase);
                     *      var match = finder.Match(text);
                     *      if (!match.Success)
                     *      {
                     *          throw new FormatException();
                     *      }
                     *
                     *      var base64 = match.Groups["base64"].Value.TrimEnd('/');
                     *      var tag = match.Groups["tag"].Value;
                     *      if (!String.IsNullOrEmpty(tag))
                     *      {
                     *          data.Remark = HttpUtility.UrlDecode(tag);
                     *      }
                     *
                     *      match = parser.Match(URLSafeBase64Decode(base64));
                     *      if (!match.Success)
                     *      {
                     *          throw new FormatException();
                     *      }
                     *
                     *      data.Address = match.Groups["hostname"].Value;
                     *      data.Port = int.Parse(match.Groups["port"].Value);
                     *      data.Password = match.Groups["password"].Value;
                     *      data.EncryptMethod = match.Groups["method"].Value;
                     *  }
                     *  else
                     *  {
                     *      if (text.Contains("#"))
                     *      {
                     *          data.Remark = HttpUtility.UrlDecode(text.Split('#')[1]);
                     *          text = text.Split('#')[0];
                     *      }
                     *      var finder = new Regex(@"ss://(?<base64>.+?)@(?<server>.+?):(?<port>\d+?)/\?plugin=(?<plugin>.+)");
                     *      var parser = new Regex(@"^(?<method>.+?):(?<password>.+)$");
                     *      var match = finder.Match(text);
                     *      if (!match.Success)
                     *      {
                     *          throw new FormatException();
                     *      }
                     *
                     *      data.Address = match.Groups["server"].Value;
                     *      data.Port = int.Parse(match.Groups["port"].Value);
                     *      var plugins = HttpUtility.UrlDecode(match.Groups["plugin"].Value).Split(';');
                     *      if (plugins[0] == "obfs-local")
                     *          plugins[0] = "simple-obfs";
                     *
                     *      var base64 = URLSafeBase64Decode(match.Groups["base64"].Value);
                     *      match = parser.Match(base64);
                     *      if (!match.Success)
                     *      {
                     *          throw new FormatException();
                     *      }
                     *
                     *      data.EncryptMethod = match.Groups["method"].Value;
                     *      data.Password = match.Groups["password"].Value;
                     *      data.Plugin = plugins[0];
                     *      data.PluginOption = plugins[1];
                     *  }
                     *
                     *  if (!Global.EncryptMethods.SS.Contains(data.EncryptMethod))
                     *  {
                     *      Logging.Info(String.Format("不支持的 SS 加密方式:{0}", data.EncryptMethod));
                     *      return null;
                     *  }
                     *
                     *  list.Add(data);
                     * }
                     * catch (FormatException)
                     * {
                     *  try
                     *  {
                     *      var uri = new Uri(text);
                     *      var userinfo = URLSafeBase64Decode(uri.UserInfo).Split(new char[] { ':' }, 2);
                     *      if (userinfo.Length != 2)
                     *      {
                     *          return null;
                     *      }
                     *
                     *      data.Remark = uri.GetComponents(UriComponents.Fragment, UriFormat.Unescaped);
                     *      data.Address = uri.IdnHost;
                     *      data.Port = uri.Port;
                     *      data.Password = userinfo[1];
                     *      data.EncryptMethod = userinfo[0];
                     *
                     *      if (!Global.EncryptMethods.SS.Contains(data.EncryptMethod))
                     *      {
                     *          Logging.Info(String.Format("不支持的 SS 加密方式:{0}", data.EncryptMethod));
                     *          return null;
                     *      }
                     *
                     *      list.Add(data);
                     *  }
                     *  catch (UriFormatException)
                     *  {
                     *      return null;
                     *  }
                     * }
                     */
                    text = text.Replace("/?", "?");
                    try
                    {
                        if (text.Contains("#"))
                        {
                            data.Remark = HttpUtility.UrlDecode(text.Split('#')[1]);
                            text        = text.Split('#')[0];
                        }
                        if (text.Contains("?"))
                        {
                            var finder = new Regex(@"^(?<data>.+?)\?(.+)$");
                            var match  = finder.Match(text);

                            if (match.Success)
                            {
                                var plugins    = HttpUtility.UrlDecode(HttpUtility.ParseQueryString(new Uri(text).Query).Get("plugin"));
                                var plugin     = plugins.Substring(0, plugins.IndexOf(";"));
                                var pluginopts = plugins.Substring(plugins.IndexOf(";") + 1);
                                if (plugin == "obfs-local" || plugin == "simple-obfs")
                                {
                                    plugin = "simple-obfs";
                                    if (!pluginopts.Contains("obfs="))
                                    {
                                        pluginopts = "obfs=http;obfs-host=" + pluginopts;
                                    }
                                }
                                else if (plugin == "simple-obfs-tls")
                                {
                                    plugin = "simple-obfs";
                                    if (!pluginopts.Contains("obfs="))
                                    {
                                        pluginopts = "obfs=tls;obfs-host=" + pluginopts;
                                    }
                                }

                                data.Plugin       = plugin;
                                data.PluginOption = pluginopts;
                                text = match.Groups["data"].Value;
                            }
                            else
                            {
                                throw new FormatException();
                            }
                        }
                        if (text.Contains("@"))
                        {
                            var finder = new Regex(@"^ss://(?<base64>.+?)@(?<server>.+):(?<port>\d+)");
                            var parser = new Regex(@"^(?<method>.+?):(?<password>.+)$");
                            var match  = finder.Match(text);
                            if (!match.Success)
                            {
                                throw new FormatException();
                            }

                            data.Hostname = match.Groups["server"].Value;
                            data.Port     = int.Parse(match.Groups["port"].Value);

                            var base64 = URLSafeBase64Decode(match.Groups["base64"].Value);
                            match = parser.Match(base64);
                            if (!match.Success)
                            {
                                throw new FormatException();
                            }

                            data.EncryptMethod = match.Groups["method"].Value;
                            data.Password      = match.Groups["password"].Value;
                        }
                        else
                        {
                            var parser = new Regex(@"^((?<method>.+?):(?<password>.+)@(?<server>.+):(?<port>\d+))");
                            var match  = parser.Match(URLSafeBase64Decode(text.Replace("ss://", "")));
                            if (!match.Success)
                            {
                                throw new FormatException();
                            }

                            data.Hostname      = match.Groups["server"].Value;
                            data.Port          = int.Parse(match.Groups["port"].Value);
                            data.EncryptMethod = match.Groups["method"].Value;
                            data.Password      = match.Groups["password"].Value;
                        }

                        if (!Global.EncryptMethods.SS.Contains(data.EncryptMethod))
                        {
                            Logging.Info(String.Format("不支持的 SS 加密方式:{0}", data.EncryptMethod));
                            return(null);
                        }

                        list.Add(data);
                    }
                    catch (FormatException)
                    {
                        return(null);
                    }
                }
                else if (text.StartsWith("ssd://"))
                {
                    var json = Newtonsoft.Json.JsonConvert.DeserializeObject <Models.SSD.Main>(URLSafeBase64Decode(text.Substring(6)));

                    foreach (var server in json.servers)
                    {
                        var data = new Models.Server();
                        data.Type = "SS";

                        data.Remark        = server.remarks;
                        data.Hostname      = server.server;
                        data.Port          = (server.port != 0) ? server.port : json.port;
                        data.Password      = (server.password != null) ? server.password : json.password;
                        data.EncryptMethod = (server.encryption != null) ? server.encryption : json.encryption;
                        data.Plugin        = (String.IsNullOrEmpty(json.plugin)) ? (String.IsNullOrEmpty(server.plugin) ? null : server.plugin) : json.plugin;
                        data.PluginOption  = (String.IsNullOrEmpty(json.plugin_options)) ? (String.IsNullOrEmpty(server.plugin_options) ? null : server.plugin_options) : json.plugin_options;

                        if (Global.EncryptMethods.SS.Contains(data.EncryptMethod))
                        {
                            list.Add(data);
                        }
                    }
                }
                else if (text.StartsWith("ssr://"))
                {
                    var data = new Models.Server();
                    data.Type = "SSR";

                    text = text.Substring(6);

                    /*
                     * var shadowsocksr = URLSafeBase64Decode(text).Split(':');
                     *
                     * if (shadowsocksr.Length > 6)
                     * {
                     *  var buff = "";
                     *
                     *  for (int i = 0; i < shadowsocksr.Length - 5; i++)
                     *  {
                     *      buff += shadowsocksr[i];
                     *      buff += ":";
                     *  }
                     *
                     *  data.Address = buff.Substring(0, buff.Length - 1).Trim();
                     * }
                     * else
                     * {
                     *  data.Address = shadowsocksr[0];
                     * }
                     * data.Port = int.Parse(shadowsocksr[shadowsocksr.Length - 5]);
                     * data.Protocol = shadowsocksr[shadowsocksr.Length - 4];
                     * if (!Global.Protocols.Contains(data.Protocol))
                     * {
                     *  Logging.Info(String.Format("不支持的 SSR 协议:{0}", data.Protocol));
                     *  return null;
                     * }
                     *
                     * data.EncryptMethod = shadowsocksr[shadowsocksr.Length - 3];
                     * if (!Global.EncryptMethods.SSR.Contains(data.EncryptMethod))
                     * {
                     *  Logging.Info(String.Format("不支持的 SSR 加密方式:{0}", data.EncryptMethod));
                     *  return null;
                     * }
                     *
                     * data.OBFS = shadowsocksr[shadowsocksr.Length - 2];
                     * if (!Global.OBFSs.Contains(data.OBFS))
                     * {
                     *  Logging.Info(String.Format("不支持的 SSR 混淆:{0}", data.OBFS));
                     *  return null;
                     * }
                     *
                     * var info = shadowsocksr[shadowsocksr.Length - 1].Split('/');
                     * data.Password = URLSafeBase64Decode(info[0]);
                     *
                     * var dict = new Dictionary<string, string>();
                     * if (info.Length > 1 && info[1].Length > 1)
                     * {
                     *  foreach (var str in info[1].Substring(1).Split('&'))
                     *  {
                     *      var splited = str.Split('=');
                     *
                     *      dict.Add(splited[0], splited[1]);
                     *  }
                     * }
                     *
                     * if (dict.ContainsKey("remarks"))
                     * {
                     *  data.Remark = URLSafeBase64Decode(dict["remarks"]);
                     * }
                     *
                     * if (dict.ContainsKey("protoparam"))
                     * {
                     *  data.ProtocolParam = URLSafeBase64Decode(dict["protoparam"]);
                     * }
                     *
                     * if (dict.ContainsKey("obfsparam"))
                     * {
                     *  data.OBFSParam = URLSafeBase64Decode(dict["obfsparam"]);
                     * }
                     *
                     * if (data.EncryptMethod != "none" && data.Protocol == "origin" && data.OBFS == "plain")
                     * {
                     *  data.Type = "SS";
                     * }
                     */
                    var parser = new Regex(@"^(?<server>.+):(?<port>(-?\d+?)):(?<protocol>.+?):(?<method>.+?):(?<obfs>.+?):(?<password>.+?)/\?(?<info>.*)$");
                    var match  = parser.Match(URLSafeBase64Decode(text));

                    if (match.Success)
                    {
                        data.Hostname = match.Groups["server"].Value;
                        data.Port     = int.Parse(match.Groups["port"].Value);
                        if (data.Port < 0)
                        {
                            data.Port += 65536;
                        }
                        data.Password = URLSafeBase64Decode(match.Groups["password"].Value);

                        data.EncryptMethod = match.Groups["method"].Value;
                        if (!Global.EncryptMethods.SSR.Contains(data.EncryptMethod))
                        {
                            Logging.Info(String.Format("不支持的 SSR 加密方式:{0}", data.EncryptMethod));
                            return(null);
                        }

                        data.Protocol = match.Groups["protocol"].Value;
                        if (!Global.Protocols.Contains(data.Protocol))
                        {
                            Logging.Info(String.Format("不支持的 SSR 协议:{0}", data.Protocol));
                            return(null);
                        }

                        data.OBFS = match.Groups["obfs"].Value;
                        if (data.OBFS == @"tls1.2_ticket_fastauth")
                        {
                            data.OBFS = @"tls1.2_ticket_auth";
                        }
                        if (!Global.OBFSs.Contains(data.OBFS))
                        {
                            Logging.Info(String.Format("不支持的 SSR 混淆:{0}", data.OBFS));
                            return(null);
                        }

                        var info = match.Groups["info"].Value;
                        var dict = new Dictionary <string, string>();
                        foreach (var str in info.Split('&'))
                        {
                            var splited = str.Split('=');
                            dict.Add(splited[0], splited[1]);
                        }

                        if (dict.ContainsKey("remarks"))
                        {
                            data.Remark = URLSafeBase64Decode(dict["remarks"]);
                        }

                        if (dict.ContainsKey("protoparam"))
                        {
                            data.ProtocolParam = URLSafeBase64Decode(dict["protoparam"]);
                        }

                        if (dict.ContainsKey("obfsparam"))
                        {
                            data.OBFSParam = URLSafeBase64Decode(dict["obfsparam"]);
                        }

                        if (Global.EncryptMethods.SS.Contains(data.EncryptMethod) && data.Protocol == "origin" && data.OBFS == "plain")
                        {
                            data.OBFS = "";
                            data.Type = "SS";
                        }
                    }

                    list.Add(data);
                }
                else if (text.StartsWith("vmess://"))
                {
                    var data = new Models.Server();
                    data.Type = "VMess";

                    text = text.Substring(8);
                    var vmess = Newtonsoft.Json.JsonConvert.DeserializeObject <Models.VMess>(URLSafeBase64Decode(text));

                    data.Remark   = vmess.ps;
                    data.Hostname = vmess.add;
                    data.Port     = vmess.port;
                    data.UserID   = vmess.id;
                    data.AlterID  = vmess.aid;

                    data.TransferProtocol = vmess.net;
                    if (!Global.TransferProtocols.Contains(data.TransferProtocol))
                    {
                        Logging.Info(String.Format("不支持的 VMess 传输协议:{0}", data.TransferProtocol));
                        return(null);
                    }

                    data.FakeType = vmess.type;
                    if (!Global.FakeTypes.Contains(data.FakeType))
                    {
                        Logging.Info(String.Format("不支持的 VMess 伪装类型:{0}", data.FakeType));
                        return(null);
                    }

                    if (vmess.v == null || vmess.v == "1")
                    {
                        var info = vmess.host.Split(';');
                        if (info.Length == 2)
                        {
                            vmess.host = info[0];
                            vmess.path = info[1];
                        }
                    }
                    if (data.TransferProtocol == "quic")
                    {
                        if (!Global.EncryptMethods.VMessQUIC.Contains(vmess.host))
                        {
                            Logging.Info(String.Format("不支持的 VMess QUIC 加密方式:{0}", vmess.host));
                            return(null);
                        }
                        else
                        {
                            data.QUICSecure = vmess.host;
                            data.QUICSecret = vmess.path;
                        }
                    }
                    else
                    {
                        data.Host = vmess.host;
                        data.Path = vmess.path;
                    }
                    data.TLSSecure = vmess.tls == "tls";

                    if (vmess.mux == null)
                    {
                        data.UseMux = false;
                    }
                    else
                    {
                        if (vmess.mux.enabled is Boolean)
                        {
                            data.UseMux = (bool)vmess.mux.enabled;
                        }
                        else if (vmess.mux.enabled is String)
                        {
                            data.UseMux = (string)vmess.mux.enabled == "true";  // 针对使用字符串当作布尔值的情况
                        }
                        else
                        {
                            data.UseMux = false;
                        }
                    }

                    data.EncryptMethod = "auto"; // V2Ray 加密方式不包括在链接中,主动添加一个

                    list.Add(data);
                }
                else if (text.StartsWith("Netch://"))
                {
                    text = text.Substring(8);
                    var NetchLink = Newtonsoft.Json.JsonConvert.DeserializeObject <Models.Server>(URLSafeBase64Decode(text));
                    if (!String.IsNullOrEmpty(NetchLink.Hostname) || NetchLink.Port > 65536 || NetchLink.Port > 0)
                    {
                        return(null);
                    }

                    switch (NetchLink.Type)
                    {
                    case "Socks5":
                        list.Add(NetchLink);
                        break;

                    case "SS":
                        if (!Global.EncryptMethods.SS.Contains(NetchLink.EncryptMethod))
                        {
                            Logging.Info($"不支持的 SS 加密方式:{NetchLink.EncryptMethod}");
                            return(null);
                        }
                        break;

                    case "SSR":
                        if (!Global.EncryptMethods.SSR.Contains(NetchLink.EncryptMethod))
                        {
                            Logging.Info($"不支持的 SSR 加密方式:{NetchLink.EncryptMethod}");
                            return(null);
                        }
                        if (!Global.Protocols.Contains(NetchLink.Protocol))
                        {
                            Logging.Info($"不支持的 SSR 协议:{NetchLink.Protocol}");
                            return(null);
                        }
                        if (!Global.OBFSs.Contains(NetchLink.OBFS))
                        {
                            Logging.Info($"不支持的 SSR 混淆:{NetchLink.OBFS}");
                            return(null);
                        }
                        break;

                    case "VMess":
                        if (!Global.TransferProtocols.Contains(NetchLink.TransferProtocol))
                        {
                            Logging.Info($"不支持的 VMess 传输协议:{NetchLink.TransferProtocol}");
                            return(null);
                        }
                        if (!Global.FakeTypes.Contains(NetchLink.FakeType))
                        {
                            Logging.Info($"不支持的 VMess 伪装类型:{NetchLink.FakeType}");
                            return(null);
                        }
                        if (NetchLink.TransferProtocol == "quic")
                        {
                            if (!Global.EncryptMethods.VMessQUIC.Contains(NetchLink.QUICSecure))
                            {
                                Logging.Info($"不支持的 VMess QUIC 加密方式:{NetchLink.QUICSecure}");
                                return(null);
                            }
                        }
                        break;

                    default:
                        return(null);
                    }
                    list.Add(NetchLink);
                }

                else
                {
                    System.Windows.Forms.MessageBox.Show("未找到可导入的链接!", "错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
                    return(null);
                }
            }
            catch (Exception e)
            {
                Logging.Info(e.ToString());
                return(null);
            }

            return(list);
        }
コード例 #26
0
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <param name="StopServiceAndRestart">先停止驱动服务再重新启动</param>
        /// <returns>是否成功</returns>
        public bool Start(Models.Server server, Models.Mode mode, bool StopServiceAndRestart)
        {
            if (!StopServiceAndRestart)
            {
                MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting Redirector")}");
            }

            if (!File.Exists("bin\\Redirector.exe"))
            {
                return(false);
            }

            // 检查驱动是否存在
            if (File.Exists(driverPath))
            {
                // 生成系统版本
                var version    = $"{Environment.OSVersion.Version.Major.ToString()}.{Environment.OSVersion.Version.Minor.ToString()}";
                var driverName = "";

                switch (version)
                {
                case "10.0":
                    driverName = "Win-10.sys";
                    break;

                case "6.3":
                case "6.2":
                    driverName = "Win-8.sys";
                    break;

                case "6.1":
                case "6.0":
                    driverName = "Win-7.sys";
                    break;

                default:
                    Utils.Logging.Info($"不支持的系统版本:{version}");
                    return(false);
                }

                // 检查驱动版本号
                FileVersionInfo SystemfileVerInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(driverPath);
                FileVersionInfo BinFileVerInfo    = System.Diagnostics.FileVersionInfo.GetVersionInfo(string.Format("bin\\{0}", driverName));

                if (!SystemfileVerInfo.FileVersion.Equals(BinFileVerInfo.FileVersion))
                {
                    Utils.Logging.Info("开始更新驱动");
                    // 需要更新驱动
                    try
                    {
                        var service = new ServiceController("netfilter2");
                        if (service.Status == ServiceControllerStatus.Running)
                        {
                            service.Stop();
                            service.WaitForStatus(ServiceControllerStatus.Stopped);
                        }
                        nfapinet.NFAPI.nf_unRegisterDriver("netfilter2");

                        //删除老驱动
                        File.Delete(driverPath);
                        if (!InstallDriver())
                        {
                            return(false);
                        }

                        Utils.Logging.Info($"驱动更新完毕,当前驱动版本:{BinFileVerInfo.FileVersion}");
                    }
                    catch (Exception)
                    {
                        Utils.Logging.Info($"更新驱动出错");
                    }
                }
            }
            else
            {
                if (!InstallDriver())
                {
                    return(false);
                }
            }

            try
            {
                // 启动驱动服务
                var service = new ServiceController("netfilter2");
                if (service.Status == ServiceControllerStatus.Running && StopServiceAndRestart)
                {
                    // 防止其他程序占用 重置 NF 百万连接数限制
                    service.Stop();
                    service.WaitForStatus(ServiceControllerStatus.Stopped);
                    MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting netfilter2 Service")}");
                    service.Start();
                }
                else if (service.Status == ServiceControllerStatus.Stopped)
                {
                    MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting netfilter2 Service")}");
                    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 = "";
            //IP过滤
            var processesIPFillter = "";

            //开启进程白名单模式
            if (!Global.Settings.ProcessWhitelistMode)
            {
                processes += "NTT.exe,";
            }

            foreach (var proc in mode.Rule)
            {
                //添加进程代理
                if (proc.EndsWith(".exe"))
                {
                    processes += proc;
                    processes += ",";
                }
                else
                {
                    //添加IP过滤器
                    processesIPFillter += proc;
                    processesIPFillter += ",";
                }
            }
            processes = processes.Substring(0, processes.Length - 1);

            Instance = MainController.GetProcess();
            var fallback = "";


            if (!File.Exists("bin\\Redirector.exe"))
            {
                return(false);
            }
            Instance.StartInfo.FileName = "bin\\Redirector.exe";

            if (server.Type != "Socks5")
            {
                fallback += $"-rtcp 127.0.0.1:{Global.Settings.Socks5LocalPort}";

                fallback = StartUDPServer(fallback);
            }
            else
            {
                var result = Utils.DNS.Lookup(server.Hostname);
                if (result == null)
                {
                    Utils.Logging.Info("无法解析服务器 IP 地址");
                    return(false);
                }

                fallback += $"-rtcp {result}:{server.Port}";

                if (!string.IsNullOrWhiteSpace(server.Username) && !string.IsNullOrWhiteSpace(server.Password))
                {
                    fallback += $" -username \"{server.Username}\" -password \"{server.Password}\"";
                }

                if (Global.Settings.UDPServer)
                {
                    if (Global.Settings.UDPServerIndex == -1)
                    {
                        fallback += $" -rudp {result}:{server.Port}";
                    }
                    else
                    {
                        fallback = StartUDPServer(fallback);
                    }
                }
                else
                {
                    fallback += $" -rudp {result}:{server.Port}";
                }
            }

            //开启进程白名单模式
            if (Global.Settings.ProcessWhitelistMode)
            {
                processes += ",ck-client.exe,Privoxy.exe,Redirector.exe,Shadowsocks.exe,ShadowsocksR.exe,simple-obfs.exe,Trojan.exe,tun2socks.exe,unbound.exe,v2ctl.exe,v2ray-plugin.exe,v2ray.exe,wv2ray.exe,tapinstall.exe,Netch.exe";
                fallback  += " -bypass true ";
            }
            else
            {
                fallback += " -bypass false";
            }

            fallback += $" -p \"{processes}\"";
            fallback += $" -fip \"{processesIPFillter}\"";

            // true  除规则内IP全走代理
            // false 仅代理规则内IP
            if (processesIPFillter.Length > 0)
            {
                if (mode.ProcesssIPFillter)
                {
                    fallback += $" -bypassip true";
                }
                else
                {
                    fallback += $" -bypassip false";
                }
            }
            else
            {
                fallback += $" -bypassip true";
            }

            //进程模式代理IP日志打印
            if (Global.Settings.ProcessProxyIPLog)
            {
                fallback += " -printProxyIP true";
            }
            else
            {
                fallback += " -printProxyIP false";
            }

            if (!Global.Settings.ProcessNoProxyForUdp)
            {
                //开启进程UDP代理
                fallback += " -udpEnable true";
            }
            else
            {
                fallback += " -udpEnable false";
            }

            Utils.Logging.Info($"Redirector : {fallback}");

            if (File.Exists("logging\\redirector.log"))
            {
                File.Delete("logging\\redirector.log");
            }

            Instance.StartInfo.Arguments = fallback;
            State = Models.State.Starting;
            Instance.Start();
            Instance.BeginOutputReadLine();
            Instance.BeginErrorReadLine();

            for (var i = 0; i < 1000; i++)
            {
                try
                {
                    if (File.Exists("logging\\redirector.log"))
                    {
                        FileStream   fs = new FileStream("logging\\redirector.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                        StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);

                        if (sr.ReadToEnd().Contains("Redirect TCP to"))
                        {
                            State = Models.State.Started;
                            return(true);
                        }
                    }
                }
                catch (Exception e)
                {
                    Utils.Logging.Info(e.Message);
                }
                finally
                {
                    Thread.Sleep(10);
                }
            }

            Utils.Logging.Info("NF 进程启动超时");
            Stop();
            return(false);
        }
コード例 #27
0
        private string StartUDPServer(string fallback)
        {
            if (Global.Settings.UDPServer)
            {
                if (Global.Settings.UDPServerIndex == -1)
                {
                    fallback += $" -rudp 127.0.0.1:{Global.Settings.Socks5LocalPort}";
                }
                else
                {
                    Models.Server UDPServer = Global.Settings.Server.AsReadOnly()[Global.Settings.UDPServerIndex];

                    var result = Utils.DNS.Lookup(UDPServer.Hostname);
                    if (result == null)
                    {
                        Utils.Logging.Info("无法解析服务器 IP 地址");
                        return("error");
                    }
                    var UDPServerHostName = result.ToString();

                    if (UDPServer.Type != "Socks5")
                    {
                        //启动UDP分流服务支持SS/SSR/Trojan
                        UDPServerInstance = MainController.GetProcess();
                        if (UDPServer.Type == "SS")
                        {
                            UDPServerInstance.StartInfo.FileName  = "bin\\Shadowsocks.exe";
                            UDPServerInstance.StartInfo.Arguments = $"-s {UDPServerHostName} -p {UDPServer.Port} -b {Global.Settings.LocalAddress} -l {Global.Settings.Socks5LocalPort + 1} -m {UDPServer.EncryptMethod} -k \"{UDPServer.Password}\" -u";
                        }

                        if (UDPServer.Type == "SSR")
                        {
                            UDPServerInstance.StartInfo.FileName = "bin\\ShadowsocksR.exe";

                            UDPServerInstance.StartInfo.Arguments = $"-s {UDPServerHostName} -p {UDPServer.Port} -k \"{UDPServer.Password}\" -m {UDPServer.EncryptMethod} -t 120";

                            if (!string.IsNullOrEmpty(UDPServer.Protocol))
                            {
                                UDPServerInstance.StartInfo.Arguments += $" -O {UDPServer.Protocol}";

                                if (!string.IsNullOrEmpty(UDPServer.ProtocolParam))
                                {
                                    UDPServerInstance.StartInfo.Arguments += $" -G \"{UDPServer.ProtocolParam}\"";
                                }
                            }

                            if (!string.IsNullOrEmpty(UDPServer.OBFS))
                            {
                                UDPServerInstance.StartInfo.Arguments += $" -o {UDPServer.OBFS}";

                                if (!string.IsNullOrEmpty(UDPServer.OBFSParam))
                                {
                                    UDPServerInstance.StartInfo.Arguments += $" -g \"{UDPServer.OBFSParam}\"";
                                }
                            }

                            UDPServerInstance.StartInfo.Arguments += $" -b {Global.Settings.LocalAddress} -l {Global.Settings.Socks5LocalPort + 1} -u";
                        }


                        if (UDPServer.Type == "TR")
                        {
                            File.WriteAllText("data\\UDPServerlast.json", Newtonsoft.Json.JsonConvert.SerializeObject(new Models.Trojan()
                            {
                                local_addr  = Global.Settings.LocalAddress,
                                local_port  = Global.Settings.Socks5LocalPort + 1,
                                remote_addr = UDPServerHostName,
                                remote_port = UDPServer.Port,
                                password    = new List <string>()
                                {
                                    UDPServer.Password
                                }
                            }));

                            UDPServerInstance = MainController.GetProcess();
                            UDPServerInstance.StartInfo.FileName  = "bin\\Trojan.exe";
                            UDPServerInstance.StartInfo.Arguments = "-c ..\\data\\UDPServerlast.json";
                        }

                        Utils.Logging.Info($"UDPServer : {UDPServerInstance.StartInfo.Arguments}");
                        File.Delete("logging\\UDPServer.log");
                        UDPServerInstance.OutputDataReceived += (sender, e) =>
                        {
                            try
                            {
                                File.AppendAllText("logging\\UDPServer.log", string.Format("{0}\r\n", e.Data));
                            }
                            catch (Exception)
                            {
                            }
                        };
                        UDPServerInstance.ErrorDataReceived += (sender, e) =>
                        {
                            try
                            {
                                File.AppendAllText("logging\\UDPServer.log", string.Format("{0}\r\n", e.Data));
                            }
                            catch (Exception)
                            {
                            }
                        };

                        UDPServerInstance.Start();
                        UDPServerInstance.BeginOutputReadLine();
                        UDPServerInstance.BeginErrorReadLine();


                        fallback += $" -rudp 127.0.0.1:{Global.Settings.Socks5LocalPort + 1}";
                    }
                    else
                    {
                        fallback += $" -rudp {UDPServerHostName}:{UDPServer.Port}";
                    }
                }
            }
            else
            {
                fallback += $" -rudp 127.0.0.1:{Global.Settings.Socks5LocalPort}";
            }
            return(fallback);
        }
コード例 #28
0
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Models.Server server, Models.Mode mode)
        {
            if (!File.Exists("bin\\v2ray.exe") || !File.Exists("bin\\v2ctl.exe"))
            {
                return(false);
            }

            File.WriteAllText("data\\last.json", Newtonsoft.Json.JsonConvert.SerializeObject(new Models.Information.VMess.Config
            {
                inbounds = new List <Models.Information.VMess.Inbounds>
                {
                    new Models.Information.VMess.Inbounds
                    {
                        settings = new Models.Information.VMess.InboundSettings(),
                        port     = Global.Settings.Socks5LocalPort,
                        listen   = Global.Settings.LocalAddress
                    }
                },
                outbounds = new List <Models.Information.VMess.Outbounds>
                {
                    new Models.Information.VMess.Outbounds
                    {
                        settings = new Models.Information.VMess.OutboundSettings
                        {
                            vnext = new List <Models.Information.VMess.VNext>
                            {
                                new Models.Information.VMess.VNext
                                {
                                    address = server.Hostname,
                                    port    = server.Port,
                                    users   = new List <Models.Information.VMess.User>
                                    {
                                        new Models.Information.VMess.User
                                        {
                                            id       = server.UserID,
                                            alterId  = server.AlterID,
                                            security = server.EncryptMethod
                                        }
                                    }
                                }
                            }
                        },
                        streamSettings = new Models.Information.VMess.StreamSettings
                        {
                            network    = server.TransferProtocol,
                            security   = server.TLSSecure ? "tls" : "",
                            wsSettings = server.TransferProtocol == "ws" ? new Models.Information.VMess.WebSocketSettings
                            {
                                path    = server.Path == "" ? "/" : server.Path,
                                headers = new Models.Information.VMess.WSHeaders
                                {
                                    Host = server.Host == "" ? server.Hostname : server.Host
                                }
                            } : null,
                            tcpSettings = server.FakeType == "http" ? new Models.Information.VMess.TCPSettings
                            {
                                header = new Models.Information.VMess.TCPHeaders
                                {
                                    type    = server.FakeType,
                                    request = new Models.Information.VMess.TCPRequest
                                    {
                                        path    = server.Path == "" ? "/" : server.Path,
                                        headers = new Models.Information.VMess.TCPRequestHeaders
                                        {
                                            Host = server.Host == "" ? server.Hostname : server.Host
                                        }
                                    }
                                }
                            } : null,
                            kcpSettings = server.TransferProtocol == "kcp" ? new Models.Information.VMess.KCPSettings
                            {
                                header = new Models.Information.VMess.TCPHeaders
                                {
                                    type = server.FakeType
                                }
                            } : null,
                            quicSettings = server.TransferProtocol == "quic" ? new Models.Information.VMess.QUICSettings
                            {
                                security = server.QUICSecure,
                                key      = server.QUICSecret,
                                header   = new Models.Information.VMess.TCPHeaders
                                {
                                    type = server.FakeType
                                }
                            } : null,
                            httpSettings = server.TransferProtocol == "h2" ? new Models.Information.VMess.HTTPSettings
                            {
                                host = server.Host == "" ? server.Hostname : server.Host,
                                path = server.Path == "" ? "/" : server.Path
                            } : null,
                            tlsSettings = new Models.Information.VMess.TLSSettings
                            {
                                allowInsecure = true,
                                serverName    = server.Host == "" ? server.Hostname : server.Host
                            }
                        },
                        mux = new Models.Information.VMess.OutboundMux
                        {
                            enabled = server.UseMux
                        }
                    },
                    new Models.Information.VMess.Outbounds
                    {
                        tag            = "direct",
                        protocol       = "freedom",
                        settings       = null,
                        streamSettings = null,
                        mux            = null
                    }
                },
                routing = new Models.Information.VMess.Routing
                {
                    rules = new List <Models.Information.VMess.RoutingRules>
                    {
                        mode.BypassChina ? new Models.Information.VMess.RoutingRules
                        {
                            type = "field",
                            ip   = new List <string>
                            {
                                "geoip:cn",
                                "geoip:private"
                            },
                            domain = new List <string>
                            {
                                "geosite:cn"
                            },
                            outboundTag = "direct"
                        } : new Models.Information.VMess.RoutingRules
                        {
                            type = "field",
                            ip   = new List <string>
                            {
                                "geoip:private"
                            },
                            outboundTag = "direct"
                        }
                    }
                }
            }));

            // 清理上一次的日志文件,防止淤积占用磁盘空间
            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 = Models.State.Starting;
            Instance.Start();
            Instance.BeginOutputReadLine();
            Instance.BeginErrorReadLine();
            for (var i = 0; i < 1000; i++)
            {
                Thread.Sleep(10);

                if (State == Models.State.Started)
                {
                    if (File.Exists("data\\last.json"))
                    {
                        File.Delete("data\\last.json");
                    }
                    return(true);
                }

                if (State == Models.State.Stopped)
                {
                    Utils.Logging.Info("V2Ray 进程启动失败");

                    Stop();
                    return(false);
                }
            }

            Utils.Logging.Info("V2Ray 进程启动超时");
            Stop();
            return(false);
        }
コード例 #29
0
ファイル: API.cs プロジェクト: lamarios/Pydio-UWP
 public API(Models.Server Server)
 {
     this.Server = Server;
     httpClient = new HttpClient(new Utils.BasicAuthHandler(Server.Username, Server.Password));
 }
コード例 #30
0
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Models.Server server, Models.Mode mode)
        {
            MainForm.Instance.StatusText($"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Starting Shadowsocks")}");

            File.Delete("logging\\shadowsocks.log");
            //从DLL启动Shaowsocks
            if (Global.Settings.BootShadowsocksFromDLL && (mode.Type == 0 || mode.Type == 1 || mode.Type == 2 || mode.Type == 3))
            {
                State = Models.State.Starting;
                var client = Encoding.UTF8.GetBytes($"0.0.0.0:{Global.Settings.Socks5LocalPort}");
                var remote = Encoding.UTF8.GetBytes($"{server.Hostname}:{server.Port}");
                var passwd = Encoding.UTF8.GetBytes($"{server.Password}");
                var method = Encoding.UTF8.GetBytes($"{server.EncryptMethod}");
                if (!NativeMethods.Shadowsocks.Info(client, remote, passwd, method))
                {
                    State = Models.State.Stopped;
                    Logging.Info("DLL SS INFO 设置失败!");
                    return(false);
                }
                Logging.Info("DLL SS INFO 设置成功!");

                if (!NativeMethods.Shadowsocks.Start())
                {
                    State = Models.State.Stopped;
                    Logging.Info("DLL SS 启动失败!");
                    return(false);
                }
                Logging.Info("DLL SS 启动成功!");
                State = Models.State.Started;
                return(true);
            }

            if (!File.Exists("bin\\Shadowsocks.exe"))
            {
                return(false);
            }
            Instance = MainController.GetProcess();
            Instance.StartInfo.FileName = "bin\\Shadowsocks.exe";

            if (!string.IsNullOrWhiteSpace(server.Plugin) && !string.IsNullOrWhiteSpace(server.PluginOption))
            {
                Instance.StartInfo.Arguments = $"-s {server.Hostname} -p {server.Port} -b {Global.Settings.LocalAddress} -l {Global.Settings.Socks5LocalPort} -m {server.EncryptMethod} -k \"{server.Password}\" -u --plugin {server.Plugin} --plugin-opts \"{server.PluginOption}\"";
            }
            else
            {
                Instance.StartInfo.Arguments = $"-s {server.Hostname} -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 = Models.State.Starting;
            Instance.Start();
            Instance.BeginOutputReadLine();
            Instance.BeginErrorReadLine();
            for (var i = 0; i < 1000; i++)
            {
                Thread.Sleep(10);

                if (State == Models.State.Started)
                {
                    return(true);
                }

                if (State == Models.State.Stopped)
                {
                    Utils.Logging.Info("SS 进程启动失败");

                    Stop();
                    return(false);
                }
            }

            Utils.Logging.Info("SS 进程启动超时");
            Stop();
            return(false);
        }
コード例 #31
0
ファイル: NFController.cs プロジェクト: rrall1985/Netch
        /// <summary>
        ///		启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否成功</returns>
        public bool Start(Models.Server server, Models.Mode mode)
        {
            if (!File.Exists("bin\\Redirector.exe"))
            {
                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.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";

            var fallback = "";

            if (server.Type != "Socks5")
            {
                fallback = $"-r 127.0.0.1:{Global.Settings.Socks5LocalPort} -p \"{processes}\"";
            }
            else
            {
                var result = Utils.DNS.Lookup(server.Hostname);
                if (result == null)
                {
                    Utils.Logging.Info("无法解析服务器 IP 地址");
                    return(false);
                }

                fallback = $"-r {result.ToString()}:{server.Port} -p \"{processes}\"";

                if (!String.IsNullOrWhiteSpace(server.Username) && !String.IsNullOrWhiteSpace(server.Password))
                {
                    fallback += $" -username \"{server.Username}\" -password \"{server.Password}\"";
                }
            }

            Instance.StartInfo.Arguments = fallback + $" -t {Global.Settings.RedirectorTCPPort}";
            Instance.OutputDataReceived += OnOutputDataReceived;
            Instance.ErrorDataReceived  += OnOutputDataReceived;
            State = Models.State.Starting;
            Instance.Start();
            Instance.BeginOutputReadLine();
            Instance.BeginErrorReadLine();

            var IsFallback = false;

            for (int i = 0; i < 1000; i++)
            {
                Thread.Sleep(10);

                if (State == Models.State.Started)
                {
                    return(true);
                }

                if (State == Models.State.Stopped)
                {
                    if (!IsFallback)
                    {
                        IsFallback = true;
                        Stop();
                        Utils.Logging.Info($"尝试去除 \"-t {Global.Settings.RedirectorTCPPort}\" 参数后启动 \"bin\\Redirector.exe\"");
                        Instance.StartInfo.Arguments = fallback;
                        Utils.Logging.Info($"当前 \"bin\\Redirector.exe\" 启动参数为 \"{Instance.StartInfo.Arguments}\"");
                        Global.Settings.RedirectorTCPPort = 2800;
                        Instance.CancelOutputRead();
                        Instance.CancelErrorRead();
                        Instance.OutputDataReceived += OnOutputDataReceived;
                        Instance.ErrorDataReceived  += OnOutputDataReceived;
                        State = Models.State.Starting;
                        Instance.Start();
                        Instance.BeginOutputReadLine();
                        Instance.BeginErrorReadLine();
                    }
                    else
                    {
                        Utils.Logging.Info("NF 进程启动失败");
                        Stop();
                        return(false);
                    }
                }
            }

            Utils.Logging.Info("NF 进程启动超时");
            Stop();
            return(false);
        }
コード例 #32
0
ファイル: GetData_HDPhim.cs プロジェクト: a5wap123/DemoDll_F
        internal static string Get_Server(string html)
        {
            server = new Models.Server();
            try
            {
                var node = Getnode.GetOneTag(html, "div", "class", "list-server");
                var nodeDescription = Getnode.GetOneTag(html, "div", "class", "block-wrapper page-single block-note");
                foreach (var item in nodeDescription.ChildNodes)
                {
                    if (item.Name != "#text") continue;
                    server.Descripton +=Getnode.GetValueHtmlToChird(item, new int[] { }, "") + "\n";
                }
                foreach (var item in node.ChildNodes)
                {
                     Models.ListEpiside listEpisode = new Models.ListEpiside();
                    listEpisode.Title = Getnode.GetValueHtmlToChird(item, new int[] { 0 }, "");
                    var nodeEpisode = Getnode.GetListNodeToNode(item, new int[] { 1 })[0];
                    foreach (var itemNode in nodeEpisode.ChildNodes)
                    {
                        Models.Episode ep = new Models.Episode();
                        ep.ID = Getnode.GetValueHtmlToChird(itemNode, new int[] { 0 }, "data-episodeid");
                        ep.Name = Getnode.GetValueHtmlToChird(itemNode, new int[] {  }, "");
                        ep.Title = Getnode.GetValueHtmlToChird(itemNode, new int[] { 0 }, "title");
                        ep.Url = Getnode.GetValueHtmlToChird(itemNode, new int[] { 0 }, "href");
                        listEpisode.Episode.Add(ep);
                    }
                    server.ListEpiside.Add(listEpisode);
                }
                json_Server.status = true;
            }
            catch
            {
                json_Server.status = false;
            }
            return BaseServer();

        }