2025-06-17 20:21:28 +08:00
|
|
|
|
using dnlib.DotNet;
|
|
|
|
|
using Obfuz.Conf;
|
2025-06-20 16:56:14 +08:00
|
|
|
|
using Obfuz.Settings;
|
2025-06-17 20:21:28 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Xml;
|
|
|
|
|
|
|
|
|
|
namespace Obfuz.ObfusPasses.ExprObfus
|
|
|
|
|
{
|
2025-06-20 17:34:25 +08:00
|
|
|
|
struct ObfuscationRuleData
|
|
|
|
|
{
|
|
|
|
|
public readonly ObfuscationLevel obfuscationLevel;
|
|
|
|
|
public readonly float obfuscationPercentage;
|
|
|
|
|
public ObfuscationRuleData(ObfuscationLevel level, float percentage)
|
|
|
|
|
{
|
|
|
|
|
obfuscationLevel = level;
|
|
|
|
|
obfuscationPercentage = percentage;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-17 20:21:28 +08:00
|
|
|
|
|
2025-06-20 17:34:25 +08:00
|
|
|
|
interface IObfuscationPolicy
|
2025-06-17 20:21:28 +08:00
|
|
|
|
{
|
|
|
|
|
bool NeedObfuscate(MethodDef method);
|
2025-06-20 17:34:25 +08:00
|
|
|
|
|
|
|
|
|
ObfuscationRuleData GetObfuscationRuleData(MethodDef method);
|
2025-06-17 20:21:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-06-20 17:34:25 +08:00
|
|
|
|
abstract class ObfuscationPolicyBase : IObfuscationPolicy
|
2025-06-17 20:21:28 +08:00
|
|
|
|
{
|
|
|
|
|
public abstract bool NeedObfuscate(MethodDef method);
|
2025-06-20 17:34:25 +08:00
|
|
|
|
|
|
|
|
|
public abstract ObfuscationRuleData GetObfuscationRuleData(MethodDef method);
|
2025-06-17 20:21:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-06-20 17:34:25 +08:00
|
|
|
|
class ConfigurableObfuscationPolicy : ObfuscationPolicyBase
|
2025-06-17 20:21:28 +08:00
|
|
|
|
{
|
|
|
|
|
class ObfuscationRule : IRule<ObfuscationRule>
|
|
|
|
|
{
|
2025-06-20 16:56:14 +08:00
|
|
|
|
public ObfuscationLevel? obfuscationLevel;
|
|
|
|
|
public float? obfuscationPercentage;
|
2025-06-17 20:21:28 +08:00
|
|
|
|
|
|
|
|
|
public void InheritParent(ObfuscationRule parentRule)
|
|
|
|
|
{
|
2025-06-20 16:56:14 +08:00
|
|
|
|
if (obfuscationLevel == null)
|
|
|
|
|
obfuscationLevel = parentRule.obfuscationLevel;
|
|
|
|
|
if (obfuscationPercentage == null)
|
|
|
|
|
obfuscationPercentage = parentRule.obfuscationPercentage;
|
2025-06-17 20:21:28 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class MethodSpec : MethodRuleBase<ObfuscationRule>
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class TypeSpec : TypeRuleBase<MethodSpec, ObfuscationRule>
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class AssemblySpec : AssemblyRuleBase<TypeSpec, MethodSpec, ObfuscationRule>
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static readonly ObfuscationRule s_default = new ObfuscationRule()
|
|
|
|
|
{
|
2025-06-21 11:42:43 +08:00
|
|
|
|
obfuscationLevel = ObfuscationLevel.Basic,
|
|
|
|
|
obfuscationPercentage = 0.3f,
|
2025-06-17 20:21:28 +08:00
|
|
|
|
};
|
|
|
|
|
|
2025-06-20 17:34:25 +08:00
|
|
|
|
private ObfuscationRule _global;
|
|
|
|
|
|
2025-06-17 20:21:28 +08:00
|
|
|
|
private readonly XmlAssemblyTypeMethodRuleParser<AssemblySpec, TypeSpec, MethodSpec, ObfuscationRule> _xmlParser;
|
|
|
|
|
|
|
|
|
|
private readonly Dictionary<MethodDef, ObfuscationRule> _methodRuleCache = new Dictionary<MethodDef, ObfuscationRule>();
|
|
|
|
|
|
|
|
|
|
public ConfigurableObfuscationPolicy(List<string> toObfuscatedAssemblyNames, List<string> xmlConfigFiles)
|
|
|
|
|
{
|
|
|
|
|
_xmlParser = new XmlAssemblyTypeMethodRuleParser<AssemblySpec, TypeSpec, MethodSpec, ObfuscationRule>(
|
2025-06-20 17:34:25 +08:00
|
|
|
|
toObfuscatedAssemblyNames, ParseObfuscationRule, ParseGlobal);
|
2025-06-17 20:21:28 +08:00
|
|
|
|
LoadConfigs(xmlConfigFiles);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void LoadConfigs(List<string> configFiles)
|
|
|
|
|
{
|
|
|
|
|
_xmlParser.LoadConfigs(configFiles);
|
2025-06-20 17:34:25 +08:00
|
|
|
|
|
|
|
|
|
if (_global == null)
|
|
|
|
|
{
|
|
|
|
|
_global = s_default;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_global.InheritParent(s_default);
|
|
|
|
|
}
|
|
|
|
|
_xmlParser.InheritParentRules(_global);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ParseGlobal(string configFile, XmlElement ele)
|
|
|
|
|
{
|
|
|
|
|
switch (ele.Name)
|
|
|
|
|
{
|
|
|
|
|
case "global": _global = ParseObfuscationRule(configFile, ele); break;
|
|
|
|
|
default: throw new Exception($"Invalid xml file {configFile}, unknown node {ele.Name}");
|
|
|
|
|
}
|
2025-06-17 20:21:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-06-20 16:56:14 +08:00
|
|
|
|
private ObfuscationLevel ParseObfuscationLevel(string str)
|
|
|
|
|
{
|
|
|
|
|
return (ObfuscationLevel)Enum.Parse(typeof(ObfuscationLevel), str);
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-17 20:21:28 +08:00
|
|
|
|
private ObfuscationRule ParseObfuscationRule(string configFile, XmlElement ele)
|
|
|
|
|
{
|
|
|
|
|
var rule = new ObfuscationRule();
|
2025-06-20 16:56:14 +08:00
|
|
|
|
if (ele.HasAttribute("obfuscationLevel"))
|
|
|
|
|
{
|
|
|
|
|
rule.obfuscationLevel = ParseObfuscationLevel(ele.GetAttribute("obfuscationLevel"));
|
|
|
|
|
}
|
|
|
|
|
if (ele.HasAttribute("obfuscationPercentage"))
|
2025-06-17 20:21:28 +08:00
|
|
|
|
{
|
2025-06-20 16:56:14 +08:00
|
|
|
|
rule.obfuscationPercentage = float.Parse(ele.GetAttribute("obfuscationPercentage"));
|
2025-06-17 20:21:28 +08:00
|
|
|
|
}
|
|
|
|
|
return rule;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ObfuscationRule GetMethodObfuscationRule(MethodDef method)
|
|
|
|
|
{
|
|
|
|
|
if (!_methodRuleCache.TryGetValue(method, out var rule))
|
|
|
|
|
{
|
2025-06-22 19:33:28 +08:00
|
|
|
|
rule = _xmlParser.GetMethodRule(method, _global);
|
2025-06-17 20:21:28 +08:00
|
|
|
|
_methodRuleCache[method] = rule;
|
|
|
|
|
}
|
|
|
|
|
return rule;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool NeedObfuscate(MethodDef method)
|
|
|
|
|
{
|
|
|
|
|
ObfuscationRule rule = GetMethodObfuscationRule(method);
|
2025-06-20 16:56:14 +08:00
|
|
|
|
return rule.obfuscationLevel.Value > ObfuscationLevel.None;
|
2025-06-17 20:21:28 +08:00
|
|
|
|
}
|
2025-06-20 17:34:25 +08:00
|
|
|
|
|
|
|
|
|
public override ObfuscationRuleData GetObfuscationRuleData(MethodDef method)
|
|
|
|
|
{
|
|
|
|
|
var rule = GetMethodObfuscationRule(method);
|
|
|
|
|
return new ObfuscationRuleData(rule.obfuscationLevel.Value, rule.obfuscationPercentage.Value);
|
|
|
|
|
}
|
2025-06-17 20:21:28 +08:00
|
|
|
|
}
|
|
|
|
|
}
|