mirror of
https://github.com/2dust/v2rayN.git
synced 2026-01-18 21:26:36 +00:00
Add process matching rules support
This commit is contained in:
parent
fe183798b6
commit
2297338003
4 changed files with 63 additions and 4 deletions
|
|
@ -68,6 +68,7 @@ public class Rule4Sbox
|
||||||
public List<string>? ip_cidr { get; set; }
|
public List<string>? ip_cidr { get; set; }
|
||||||
public List<string>? source_ip_cidr { get; set; }
|
public List<string>? source_ip_cidr { get; set; }
|
||||||
public List<string>? process_name { get; set; }
|
public List<string>? process_name { get; set; }
|
||||||
|
public List<string>? process_path { get; set; }
|
||||||
public List<string>? rule_set { get; set; }
|
public List<string>? rule_set { get; set; }
|
||||||
public List<Rule4Sbox>? rules { get; set; }
|
public List<Rule4Sbox>? rules { get; set; }
|
||||||
public string? action { get; set; }
|
public string? action { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -256,6 +256,8 @@ public class RulesItem4Ray
|
||||||
public List<string>? domain { get; set; }
|
public List<string>? domain { get; set; }
|
||||||
|
|
||||||
public List<string>? protocol { get; set; }
|
public List<string>? protocol { get; set; }
|
||||||
|
|
||||||
|
public List<string>? process { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BalancersItem4Ray
|
public class BalancersItem4Ray
|
||||||
|
|
|
||||||
|
|
@ -278,13 +278,53 @@ public partial class CoreConfigSingboxService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_config.TunModeItem.EnableTun && item.Process?.Count > 0)
|
if (item.Process?.Count > 0)
|
||||||
{
|
{
|
||||||
rule3.process_name = item.Process;
|
var ruleProcName = JsonUtils.DeepCopy(rule3);
|
||||||
rules.Add(rule3);
|
var ruleProcPath = JsonUtils.DeepCopy(rule3);
|
||||||
|
foreach (var process in item.Process)
|
||||||
|
{
|
||||||
|
// sing-box doesn't support this, fall back to process name match
|
||||||
|
if (process is "self/" or "xray/")
|
||||||
|
{
|
||||||
|
ruleProcName.process_name.Add(Utils.GetExeName("sing-box"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.Contains('/') || process.Contains('\\'))
|
||||||
|
{
|
||||||
|
var procPath = process;
|
||||||
|
if (Utils.IsWindows())
|
||||||
|
{
|
||||||
|
procPath = procPath.Replace('/', '\\');
|
||||||
|
}
|
||||||
|
ruleProcPath.process_path.Add(procPath);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sing-box strictly matches the exe suffix on Windows
|
||||||
|
var procName = process;
|
||||||
|
if (Utils.IsWindows() && !procName.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
procName += ".exe";
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleProcName.process_name.Add(procName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ruleProcName.process_name.Count > 0)
|
||||||
|
{
|
||||||
|
rules.Add(ruleProcName);
|
||||||
hasDomainIp = true;
|
hasDomainIp = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ruleProcPath.process_path.Count > 0)
|
||||||
|
{
|
||||||
|
rules.Add(ruleProcPath);
|
||||||
|
hasDomainIp = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!hasDomainIp
|
if (!hasDomainIp
|
||||||
&& (rule.port != null || rule.port_range != null || rule.protocol != null || rule.inbound != null || rule.network != null))
|
&& (rule.port != null || rule.port_range != null || rule.protocol != null || rule.inbound != null || rule.network != null))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -77,12 +77,17 @@ public partial class CoreConfigV2rayService
|
||||||
{
|
{
|
||||||
rule.inboundTag = null;
|
rule.inboundTag = null;
|
||||||
}
|
}
|
||||||
|
if (rule.process?.Count == 0)
|
||||||
|
{
|
||||||
|
rule.process = null;
|
||||||
|
}
|
||||||
|
|
||||||
var hasDomainIp = false;
|
var hasDomainIp = false;
|
||||||
if (rule.domain?.Count > 0)
|
if (rule.domain?.Count > 0)
|
||||||
{
|
{
|
||||||
var it = JsonUtils.DeepCopy(rule);
|
var it = JsonUtils.DeepCopy(rule);
|
||||||
it.ip = null;
|
it.ip = null;
|
||||||
|
it.process = null;
|
||||||
it.type = "field";
|
it.type = "field";
|
||||||
for (var k = it.domain.Count - 1; k >= 0; k--)
|
for (var k = it.domain.Count - 1; k >= 0; k--)
|
||||||
{
|
{
|
||||||
|
|
@ -99,6 +104,17 @@ public partial class CoreConfigV2rayService
|
||||||
{
|
{
|
||||||
var it = JsonUtils.DeepCopy(rule);
|
var it = JsonUtils.DeepCopy(rule);
|
||||||
it.domain = null;
|
it.domain = null;
|
||||||
|
it.process = null;
|
||||||
|
it.type = "field";
|
||||||
|
v2rayConfig.routing.rules.Add(it);
|
||||||
|
hasDomainIp = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rule.process?.Count > 0)
|
||||||
|
{
|
||||||
|
var it = JsonUtils.DeepCopy(rule);
|
||||||
|
it.domain = null;
|
||||||
|
it.ip = null;
|
||||||
it.type = "field";
|
it.type = "field";
|
||||||
v2rayConfig.routing.rules.Add(it);
|
v2rayConfig.routing.rules.Add(it);
|
||||||
hasDomainIp = true;
|
hasDomainIp = true;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue