From ddb144eac88925ea817a1bf4556383b0e272591e Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 1 Aug 2025 09:19:24 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E6=96=B0=E5=A2=9E=20RemoveConstFiel?= =?UTF-8?q?d=20pass?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/ObfusPasses/ObfuscationPassType.cs | 2 + Editor/ObfusPasses/RemoveConstField.meta | 8 ++ .../ConfigurableRemoveConstFieldPolicy.cs | 35 +++++++++ ...ConfigurableRemoveConstFieldPolicy.cs.meta | 11 +++ .../IRemoveConstFieldPolicy.cs | 14 ++++ .../IRemoveConstFieldPolicy.cs.meta | 11 +++ .../RemoveConstField/RemoveConstFieldPass.cs | 76 +++++++++++++++++++ .../RemoveConstFieldPass.cs.meta | 11 +++ Editor/ObfuscatorBuilder.cs | 5 ++ Editor/Settings/ObfuzSettings.cs | 3 + Editor/Settings/ObfuzSettingsProvider.cs | 3 + Editor/Settings/RemoveConstFieldSettings.cs | 27 +++++++ .../Settings/RemoveConstFieldSettings.cs.meta | 11 +++ 13 files changed, 217 insertions(+) create mode 100644 Editor/ObfusPasses/RemoveConstField.meta create mode 100644 Editor/ObfusPasses/RemoveConstField/ConfigurableRemoveConstFieldPolicy.cs create mode 100644 Editor/ObfusPasses/RemoveConstField/ConfigurableRemoveConstFieldPolicy.cs.meta create mode 100644 Editor/ObfusPasses/RemoveConstField/IRemoveConstFieldPolicy.cs create mode 100644 Editor/ObfusPasses/RemoveConstField/IRemoveConstFieldPolicy.cs.meta create mode 100644 Editor/ObfusPasses/RemoveConstField/RemoveConstFieldPass.cs create mode 100644 Editor/ObfusPasses/RemoveConstField/RemoveConstFieldPass.cs.meta create mode 100644 Editor/Settings/RemoveConstFieldSettings.cs create mode 100644 Editor/Settings/RemoveConstFieldSettings.cs.meta diff --git a/Editor/ObfusPasses/ObfuscationPassType.cs b/Editor/ObfusPasses/ObfuscationPassType.cs index b5deb96..697a161 100644 --- a/Editor/ObfusPasses/ObfuscationPassType.cs +++ b/Editor/ObfusPasses/ObfuscationPassType.cs @@ -16,6 +16,8 @@ namespace Obfuz.ObfusPasses ControlFlowObfus = 0x800, EvalStackObfus = 0x1000, + RemoveConstField = 0x100000, + AllObfus = SymbolObfus | CallObfus | ExprObfus | ControlFlowObfus | EvalStackObfus, AllEncrypt = ConstEncrypt | FieldEncrypt, diff --git a/Editor/ObfusPasses/RemoveConstField.meta b/Editor/ObfusPasses/RemoveConstField.meta new file mode 100644 index 0000000..a6fc2fb --- /dev/null +++ b/Editor/ObfusPasses/RemoveConstField.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d2c28a04d2997bc4d91a4c7693983d12 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ObfusPasses/RemoveConstField/ConfigurableRemoveConstFieldPolicy.cs b/Editor/ObfusPasses/RemoveConstField/ConfigurableRemoveConstFieldPolicy.cs new file mode 100644 index 0000000..c99c99f --- /dev/null +++ b/Editor/ObfusPasses/RemoveConstField/ConfigurableRemoveConstFieldPolicy.cs @@ -0,0 +1,35 @@ +using dnlib.DotNet; +using Obfuz.Conf; +using Obfuz.Utils; +using System.Collections.Generic; +using System.Xml; + +namespace Obfuz.ObfusPasses.RemoveConstField +{ + public class ConfigurableRemoveConstFieldPolicy : RemoveConstFieldBase + { + class ObfuscationRule + { + + } + + private readonly XmlFieldRuleParser _configParser; + + public ConfigurableRemoveConstFieldPolicy(List toObfuscatedAssemblyNames, List configFiles) + { + _configParser = new XmlFieldRuleParser(toObfuscatedAssemblyNames, ParseRule, null); + _configParser.LoadConfigs(configFiles); + } + + private ObfuscationRule ParseRule(string configFile, XmlElement ele) + { + return new ObfuscationRule(); + } + + public override bool NeedPreserved(FieldDef field) + { + var rule = _configParser.GetFieldRule(field); + return rule != null; + } + } +} diff --git a/Editor/ObfusPasses/RemoveConstField/ConfigurableRemoveConstFieldPolicy.cs.meta b/Editor/ObfusPasses/RemoveConstField/ConfigurableRemoveConstFieldPolicy.cs.meta new file mode 100644 index 0000000..451dc3d --- /dev/null +++ b/Editor/ObfusPasses/RemoveConstField/ConfigurableRemoveConstFieldPolicy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3b708559fbf755419d7daf4ddce72f2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ObfusPasses/RemoveConstField/IRemoveConstFieldPolicy.cs b/Editor/ObfusPasses/RemoveConstField/IRemoveConstFieldPolicy.cs new file mode 100644 index 0000000..587bf49 --- /dev/null +++ b/Editor/ObfusPasses/RemoveConstField/IRemoveConstFieldPolicy.cs @@ -0,0 +1,14 @@ +using dnlib.DotNet; + +namespace Obfuz.ObfusPasses.RemoveConstField +{ + public interface IRemoveConstFieldPolicy + { + bool NeedPreserved(FieldDef field); + } + + public abstract class RemoveConstFieldBase : IRemoveConstFieldPolicy + { + public abstract bool NeedPreserved(FieldDef field); + } +} diff --git a/Editor/ObfusPasses/RemoveConstField/IRemoveConstFieldPolicy.cs.meta b/Editor/ObfusPasses/RemoveConstField/IRemoveConstFieldPolicy.cs.meta new file mode 100644 index 0000000..8660c88 --- /dev/null +++ b/Editor/ObfusPasses/RemoveConstField/IRemoveConstFieldPolicy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5fad0b7ef9225b24cacc94f8dcaee26d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ObfusPasses/RemoveConstField/RemoveConstFieldPass.cs b/Editor/ObfusPasses/RemoveConstField/RemoveConstFieldPass.cs new file mode 100644 index 0000000..1835698 --- /dev/null +++ b/Editor/ObfusPasses/RemoveConstField/RemoveConstFieldPass.cs @@ -0,0 +1,76 @@ +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using Obfuz.Settings; +using Obfuz.Utils; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace Obfuz.ObfusPasses.RemoveConstField +{ + + public class RemoveConstFieldPass : ObfuscationPassBase + { + private RemoveConstFieldSettingsFacade _settings; + private ObfuzIgnoreScopeComputeCache _obfuzIgnoreScopeComputeCache; + private IRemoveConstFieldPolicy _removeConstFieldPolicy; + + public override ObfuscationPassType Type => ObfuscationPassType.RemoveConstField; + + public RemoveConstFieldPass(RemoveConstFieldSettingsFacade settings) + { + _settings = settings; + } + + public override void Start() + { + var ctx = ObfuscationPassContext.Current; + _obfuzIgnoreScopeComputeCache = ctx.obfuzIgnoreScopeComputeCache; + _removeConstFieldPolicy = new ConfigurableRemoveConstFieldPolicy(ctx.coreSettings.assembliesToObfuscate, _settings.ruleFiles); + } + + public override void Stop() + { + + } + + public override void Process() + { + var ctx = ObfuscationPassContext.Current; + var modules = ctx.modulesToObfuscate; + ConfigurablePassPolicy passPolicy = ctx.passPolicy; + foreach (ModuleDef mod in modules) + { + // ToArray to avoid modify list exception + foreach (TypeDef type in mod.GetTypes()) + { + if (type.IsEnum) + { + continue; + } + foreach (FieldDef field in type.Fields.ToArray()) + { + if (!field.IsLiteral) + { + continue; + } + if (!Support(passPolicy.GetFieldObfuscationPasses(field))) + { + continue; + } + if (_obfuzIgnoreScopeComputeCache.HasSelfOrDeclaringOrEnclosingOrInheritObfuzIgnoreScope(field, field.DeclaringType, ObfuzScope.Field)) + { + continue; + } + if (_removeConstFieldPolicy.NeedPreserved(field)) + { + continue; + } + field.DeclaringType = null; + //Debug.Log($"Remove const field {field.FullName} in type {type.FullName} in module {mod.Name}"); + } + } + } + } + } +} diff --git a/Editor/ObfusPasses/RemoveConstField/RemoveConstFieldPass.cs.meta b/Editor/ObfusPasses/RemoveConstField/RemoveConstFieldPass.cs.meta new file mode 100644 index 0000000..d996080 --- /dev/null +++ b/Editor/ObfusPasses/RemoveConstField/RemoveConstFieldPass.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3188de094ab4cdd47b55c2f622251cf5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ObfuscatorBuilder.cs b/Editor/ObfuscatorBuilder.cs index 35e29ee..8c600af 100644 --- a/Editor/ObfuscatorBuilder.cs +++ b/Editor/ObfuscatorBuilder.cs @@ -6,6 +6,7 @@ using Obfuz.ObfusPasses.ControlFlowObfus; using Obfuz.ObfusPasses.EvalStackObfus; using Obfuz.ObfusPasses.ExprObfus; using Obfuz.ObfusPasses.FieldEncrypt; +using Obfuz.ObfusPasses.RemoveConstField; using Obfuz.ObfusPasses.SymbolObfus; using Obfuz.Settings; using Obfuz.Utils; @@ -177,6 +178,10 @@ namespace Obfuz { builder.AddPass(new ConstEncryptPass(settings.constEncryptSettings.ToFacade())); } + if (obfuscationPasses.HasFlag(ObfuscationPassType.RemoveConstField)) + { + builder.AddPass(new RemoveConstFieldPass(settings.removeConstFieldSettings.ToFacade())); + } if (obfuscationPasses.HasFlag(ObfuscationPassType.ExprObfus)) { builder.AddPass(new ExprObfusPass(settings.exprObfusSettings.ToFacade())); diff --git a/Editor/Settings/ObfuzSettings.cs b/Editor/Settings/ObfuzSettings.cs index 19fbe3c..190240a 100644 --- a/Editor/Settings/ObfuzSettings.cs +++ b/Editor/Settings/ObfuzSettings.cs @@ -29,6 +29,9 @@ namespace Obfuz.Settings [Tooltip("const encryption settings")] public ConstEncryptionSettings constEncryptSettings; + [Tooltip("remove const field settings")] + public RemoveConstFieldSettings removeConstFieldSettings; + [Tooltip("eval stack obfuscation settings")] public EvalStackObfuscationSettings evalStackObfusSettings; diff --git a/Editor/Settings/ObfuzSettingsProvider.cs b/Editor/Settings/ObfuzSettingsProvider.cs index 2b0afce..342dc7a 100644 --- a/Editor/Settings/ObfuzSettingsProvider.cs +++ b/Editor/Settings/ObfuzSettingsProvider.cs @@ -33,6 +33,7 @@ namespace Obfuz.Settings private SerializedProperty _symbolObfusSettings; private SerializedProperty _constEncryptSettings; + private SerializedProperty _removeConstFieldSettings; private SerializedProperty _evalStackObfusSettings; private SerializedProperty _fieldEncryptSettings; private SerializedProperty _callObfusSettings; @@ -73,6 +74,7 @@ namespace Obfuz.Settings _symbolObfusSettings = _serializedObject.FindProperty("symbolObfusSettings"); _constEncryptSettings = _serializedObject.FindProperty("constEncryptSettings"); + _removeConstFieldSettings = _serializedObject.FindProperty("removeConstFieldSettings"); _evalStackObfusSettings = _serializedObject.FindProperty("evalStackObfusSettings"); _exprObfusSettings = _serializedObject.FindProperty("exprObfusSettings"); _fieldEncryptSettings = _serializedObject.FindProperty("fieldEncryptSettings"); @@ -103,6 +105,7 @@ namespace Obfuz.Settings EditorGUILayout.PropertyField(_symbolObfusSettings); EditorGUILayout.PropertyField(_constEncryptSettings); + EditorGUILayout.PropertyField(_removeConstFieldSettings); EditorGUILayout.PropertyField(_evalStackObfusSettings); EditorGUILayout.PropertyField(_exprObfusSettings); EditorGUILayout.PropertyField(_fieldEncryptSettings); diff --git a/Editor/Settings/RemoveConstFieldSettings.cs b/Editor/Settings/RemoveConstFieldSettings.cs new file mode 100644 index 0000000..944153d --- /dev/null +++ b/Editor/Settings/RemoveConstFieldSettings.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace Obfuz.Settings +{ + public class RemoveConstFieldSettingsFacade + { + public List ruleFiles; + } + + [Serializable] + public class RemoveConstFieldSettings + { + [Tooltip("rule config xml files")] + public string[] ruleFiles; + + public RemoveConstFieldSettingsFacade ToFacade() + { + return new RemoveConstFieldSettingsFacade + { + ruleFiles = ruleFiles?.ToList() ?? new List(), + }; + } + } +} diff --git a/Editor/Settings/RemoveConstFieldSettings.cs.meta b/Editor/Settings/RemoveConstFieldSettings.cs.meta new file mode 100644 index 0000000..72da563 --- /dev/null +++ b/Editor/Settings/RemoveConstFieldSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8b8eef10eaba5844a0ad39b3c79a51c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: