From 74ab7ad09736cb579c885cdd936d09e49585a476 Mon Sep 17 00:00:00 2001 From: DHR60 <192860629+DHR60@users.noreply.github.com> Date: Wed, 15 Jul 2026 09:32:07 +0000 Subject: [PATCH] Add ProtectCoreTypeList (#9756) * Add ProtectCoreTypeList * Add process path restrictions --- .../Builder/CoreConfigContextBuilder.cs | 5 +++ .../Models/CoreConfigs/CoreConfigContext.cs | 2 + .../Singbox/SingboxRoutingService.cs | 34 +++++++++------- .../CoreConfig/V2ray/V2rayRoutingService.cs | 40 +++++++++++-------- 4 files changed, 50 insertions(+), 31 deletions(-) diff --git a/v2rayN/ServiceLib/Handler/Builder/CoreConfigContextBuilder.cs b/v2rayN/ServiceLib/Handler/Builder/CoreConfigContextBuilder.cs index 27e07b5b..89e13a6f 100644 --- a/v2rayN/ServiceLib/Handler/Builder/CoreConfigContextBuilder.cs +++ b/v2rayN/ServiceLib/Handler/Builder/CoreConfigContextBuilder.cs @@ -193,12 +193,17 @@ public class CoreConfigContextBuilder if (preSocksItem != null) { var preSocksResult = await Build(nodeContext.AppConfig, preSocksItem); + + var protectCoreTypeList = nodeContext.ProtectCoreTypeList; + protectCoreTypeList.Add(nodeContext.RunCoreType); + return preSocksResult with { Context = preSocksResult.Context with { ProtectDomainList = [.. nodeContext.ProtectDomainList ?? [], .. preSocksResult.Context.ProtectDomainList ?? []], + ProtectCoreTypeList = protectCoreTypeList, }, }; } diff --git a/v2rayN/ServiceLib/Models/CoreConfigs/CoreConfigContext.cs b/v2rayN/ServiceLib/Models/CoreConfigs/CoreConfigContext.cs index e1100868..b9561b1b 100644 --- a/v2rayN/ServiceLib/Models/CoreConfigs/CoreConfigContext.cs +++ b/v2rayN/ServiceLib/Models/CoreConfigs/CoreConfigContext.cs @@ -17,6 +17,8 @@ public record CoreConfigContext // TUN Compatibility public bool IsTunEnabled { get; init; } = false; public HashSet ProtectDomainList { get; init; } = []; + // Typically, it is the core of the outbound chain + public HashSet ProtectCoreTypeList { get; init; } = []; public bool IsWindows { get; init; } public bool IsMacOS { get; init; } diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs index 5ea1f741..b8175b3f 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs @@ -34,18 +34,18 @@ public partial class CoreConfigSingboxService _coreConfig.route.rules.AddRange(tunRules); } - var (lstDnsExe, lstDirectExe) = BuildRoutingDirectExe(); + var lstDirectExe = BuildRoutingDirectExe(); _coreConfig.route.rules.Add(new() { port = [53], action = "hijack-dns", - process_name = lstDnsExe + process_path = lstDirectExe }); _coreConfig.route.rules.Add(new() { outbound = Global.DirectTag, - process_name = lstDirectExe + process_path = lstDirectExe }); // ICMP Routing @@ -256,34 +256,38 @@ public partial class CoreConfigSingboxService } } - private static (List lstDnsExe, List lstDirectExe) BuildRoutingDirectExe() + private List BuildRoutingDirectExe() { - var dnsExeSet = new HashSet(StringComparer.OrdinalIgnoreCase); var directExeSet = new HashSet(StringComparer.OrdinalIgnoreCase); - var coreInfoResult = CoreInfoManager.Instance.GetCoreInfo(); + var allCoreInfo = CoreInfoManager.Instance.GetCoreInfo(); - foreach (var coreConfig in coreInfoResult) + foreach (var coreConfig in allCoreInfo) { + if (!context.ProtectCoreTypeList.Contains(coreConfig.CoreType)) + { + continue; + } if (coreConfig.CoreType == ECoreType.v2rayN) { continue; } - + if (coreConfig.CoreExes == null) + { + continue; + } foreach (var baseExeName in coreConfig.CoreExes) { - if (coreConfig.CoreType != ECoreType.sing_box) + //directExeSet.Add(Utils.GetExeName(baseExeName)); + var exePath = CoreInfoManager.Instance.GetCoreExecFile(coreConfig, out _); + if (!exePath.IsNullOrEmpty()) { - dnsExeSet.Add(Utils.GetExeName(baseExeName)); + directExeSet.Add(exePath); } - directExeSet.Add(Utils.GetExeName(baseExeName)); } } - var lstDnsExe = new List(dnsExeSet); - var lstDirectExe = new List(directExeSet); - - return (lstDnsExe, lstDirectExe); + return directExeSet.ToList(); } private void GenRoutingUserRule(RulesItem? item) diff --git a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayRoutingService.cs b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayRoutingService.cs index c3bcf616..2349fe7f 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayRoutingService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayRoutingService.cs @@ -13,11 +13,11 @@ public partial class CoreConfigV2rayService { _coreConfig.routing.rules.AddRange(tunRules); } - var (lstDnsExe, lstDirectExe) = BuildRoutingDirectExe(); + var lstDirectExe = BuildRoutingDirectExe(); _coreConfig.routing.rules.Add(new() { port = "53", - process = lstDnsExe, + process = lstDirectExe, outboundTag = Global.DnsOutboundTag, }); _coreConfig.routing.rules.Add(new() @@ -232,36 +232,44 @@ public partial class CoreConfigV2rayService return finalRule; } - private static (List lstDnsExe, List lstDirectExe) BuildRoutingDirectExe() + private List BuildRoutingDirectExe() { - var dnsExeSet = new HashSet(StringComparer.OrdinalIgnoreCase); var directExeSet = new HashSet(StringComparer.OrdinalIgnoreCase); - var coreInfoResult = CoreInfoManager.Instance.GetCoreInfo(); + var allCoreInfo = CoreInfoManager.Instance.GetCoreInfo(); - foreach (var coreConfig in coreInfoResult) + foreach (var coreConfig in allCoreInfo) { + if (!context.ProtectCoreTypeList.Contains(coreConfig.CoreType)) + { + continue; + } if (coreConfig.CoreType == ECoreType.v2rayN) { continue; } - + if (coreConfig.CoreExes == null) + { + continue; + } + if (coreConfig.CoreType == ECoreType.Xray) + { + directExeSet.Add("xray/"); + continue; + } foreach (var baseExeName in coreConfig.CoreExes) { - if (coreConfig.CoreType != ECoreType.Xray) + //directExeSet.Add(Utils.GetExeName(baseExeName)); + var exePath = CoreInfoManager.Instance.GetCoreExecFile(coreConfig, out _); + if (!exePath.IsNullOrEmpty()) { - dnsExeSet.Add(Utils.GetExeName(baseExeName)); + directExeSet.Add(exePath); } - directExeSet.Add(Utils.GetExeName(baseExeName)); } } - - directExeSet.Add("xray/"); + //directExeSet.Add("xray/"); directExeSet.Add("self/"); - var lstDnsExe = new List(dnsExeSet); - var lstDirectExe = new List(directExeSet); - - return (lstDnsExe, lstDirectExe); + return directExeSet.ToList(); } }