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); }
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); }
public DateServerStats GetMostPopularDayForServer(Models.Server server) { return(Db.DateServerStats .Where(ds => ds.ServerId == server.Id) .OrderByDescending(ds => ds.MatchesPlayed) .FirstOrDefault()); }
/// <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); }
public ShadowsocksR(Models.Server server = default) { InitializeComponent(); _server = server ?? new Models.Server { EncryptMethod = Global.EncryptMethods.SSR[0] }; }
/// <summary> /// 初始化 /// </summary> /// <param name="index">需要编辑的索引</param> public Socks5(int index = -1) { InitializeComponent(); _server = index != -1 ? Global.Settings.Server[index] : new Models.Server(); }
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()); }
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()); }
public VMess(Models.Server server = default) { InitializeComponent(); _server = server ?? new Models.Server { EncryptMethod = Global.EncryptMethods.VMess[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; }
/// <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] }; }
public VMess(int index = -1) { InitializeComponent(); server = index != -1 ? Global.Settings.Server[index] : new Models.Server { EncryptMethod = Global.EncryptMethods.VMess[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")}"); 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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
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); }
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); }
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); }
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); }
// //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); }
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"); } }
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); }
/// <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); }
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); }
/// <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); }
public API(Models.Server Server) { this.Server = Server; httpClient = new HttpClient(new Utils.BasicAuthHandler(Server.Username, Server.Password)); }
/// <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); }
/// <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); }
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(); }