From 33a4f1bf2ffc4cb85d5c985076c0adaca0f0a101 Mon Sep 17 00:00:00 2001 From: walon Date: Mon, 21 Apr 2025 09:57:34 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=BAPipeline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/BuildProcess/ObfuzProcess.cs | 13 +++- Editor/IObfuscationPass.cs | 17 +++++ Editor/ObfuscateRuleConfig.cs | 13 +++- Editor/ObfuscationPassBase.cs | 14 ++++ Editor/Obfuscator.cs | 75 +++++++++++-------- Editor/ObfuscatorContext.cs | 6 +- Editor/ObfuzPipeline.cs | 35 ++++++++- Editor/Rename/RenameSymbolPass.cs | 28 +++++++ Editor/Rename/SymbolRename.cs | 7 +- Editor/Settings/ObfuzSettingProvider.cs | 3 + Editor/Settings/ObfuzSettings.cs | 4 + .../Virtualization/DataVirtualizationPass.cs | 16 ++++ 12 files changed, 186 insertions(+), 45 deletions(-) create mode 100644 Editor/IObfuscationPass.cs create mode 100644 Editor/ObfuscationPassBase.cs create mode 100644 Editor/Rename/RenameSymbolPass.cs create mode 100644 Editor/Virtualization/DataVirtualizationPass.cs diff --git a/Editor/BuildProcess/ObfuzProcess.cs b/Editor/BuildProcess/ObfuzProcess.cs index 5e31a2a..f84c4c4 100644 --- a/Editor/BuildProcess/ObfuzProcess.cs +++ b/Editor/BuildProcess/ObfuzProcess.cs @@ -81,7 +81,8 @@ namespace Obfuz var opt = new Obfuscator.Options { - AssemblySearchDirs = new List + obfuscationAssemblyNames = settings.obfuscationAssemblyNames.ToList(), + assemblySearchDirs = new List { #if UNITY_2021_1_OR_NEWER Path.Combine(applicationContentsPath, "UnityReferenceAssemblies/unity-4.8-api/Facades"), @@ -95,17 +96,23 @@ namespace Obfuz Path.Combine(applicationContentsPath, "Managed/UnityEngine"), backupPlayerScriptAssembliesPath, }.Concat(settings.extraAssemblySearchDirs).ToList(), - ObfuscationRuleFiles = settings.ruleFiles.ToList(), + obfuscationRuleFiles = settings.ruleFiles.ToList(), mappingXmlPath = settings.mappingFile, outputDir = ObfuzSettings.Instance.GetObfuscatedAssemblyOutputDir(buildTarget), }; var obfuz = new Obfuscator(opt); obfuz.Run(); - foreach (var dllName in obfuz.ObfuscatedAssemblyNames) + foreach (var dllName in settings.obfuscationAssemblyNames) { string src = $"{opt.outputDir}/{dllName}.dll"; string dst = $"{scriptAssembliesPath}/{dllName}.dll"; + + if (!File.Exists(src)) + { + Debug.LogWarning($"obfuscation assembly not found! skip copy. path:{src}"); + continue; + } File.Copy(src, dst, true); Debug.Log($"obfuscate dll:{dst}"); } diff --git a/Editor/IObfuscationPass.cs b/Editor/IObfuscationPass.cs new file mode 100644 index 0000000..929573b --- /dev/null +++ b/Editor/IObfuscationPass.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Obfuz +{ + public interface IObfuscationPass + { + void Start(ObfuscatorContext ctx); + + void Stop(ObfuscatorContext ctx); + + void Process(ObfuscatorContext ctx); + } +} diff --git a/Editor/ObfuscateRuleConfig.cs b/Editor/ObfuscateRuleConfig.cs index 778c0ea..01e3a98 100644 --- a/Editor/ObfuscateRuleConfig.cs +++ b/Editor/ObfuscateRuleConfig.cs @@ -160,8 +160,6 @@ namespace Obfuz private readonly Dictionary _assemblyRuleSpecs = new Dictionary(); - public List ObfuscatedAssemblyNames => _assemblyRuleSpecs.Keys.ToList(); - private static readonly MethodRule s_noneMethodRule = new MethodRule { @@ -520,6 +518,10 @@ namespace Obfuz { throw new Exception($"Invalid xml file, assembly name is empty"); } + if (!_obfuscationAssemblyNames.Contains(assemblyName)) + { + throw new Exception($"unknown assembly name:{assemblyName}, not in ObfuzSettings.obfuscationAssemblyNames"); + } if (_assemblyRuleSpecs.ContainsKey(assemblyName)) { throw new Exception($"Invalid xml file, duplicate assembly name {assemblyName}"); @@ -703,6 +705,13 @@ namespace Obfuz private readonly Dictionary _typeRenameCache = new Dictionary(); + private readonly HashSet _obfuscationAssemblyNames; + + public ObfuscateRuleConfig(List obfuscationAssemblyNames) + { + this._obfuscationAssemblyNames = obfuscationAssemblyNames.ToHashSet(); + } + private TypeDefComputeCache GetOrCreateTypeDefRenameComputeCache(TypeDef typeDef) { if (_typeRenameCache.TryGetValue(typeDef, out var cache)) diff --git a/Editor/ObfuscationPassBase.cs b/Editor/ObfuscationPassBase.cs new file mode 100644 index 0000000..a308db9 --- /dev/null +++ b/Editor/ObfuscationPassBase.cs @@ -0,0 +1,14 @@ +namespace Obfuz +{ + public abstract class ObfuscationPassBase : IObfuscationPass + { + public virtual void Start(ObfuscatorContext ctx) + { + } + + public virtual void Stop(ObfuscatorContext ctx) + { + } + public abstract void Process(ObfuscatorContext ctx); + } +} diff --git a/Editor/Obfuscator.cs b/Editor/Obfuscator.cs index 46be780..d779bec 100644 --- a/Editor/Obfuscator.cs +++ b/Editor/Obfuscator.cs @@ -1,5 +1,6 @@ using dnlib.DotNet; using Obfuz.Rename; +using Obfuz.Virtualization; using System; using System.Collections.Generic; using System.IO; @@ -16,46 +17,60 @@ namespace Obfuz { public class Options { - public List AssemblySearchDirs; - public List ObfuscationRuleFiles; + public List obfuscationAssemblyNames; + public List assemblySearchDirs; + public List obfuscationRuleFiles; public string mappingXmlPath; public string outputDir; } private readonly Options _options; private readonly AssemblyCache _assemblyCache; - private readonly ObfuscateRuleConfig _obfuscateRuleConfig; private readonly List _obfuzAssemblies = new List(); - private readonly IRenamePolicy _renamePolicy; - private readonly INameMaker _nameMaker; - private SymbolRename _symbolRename; - public IList ObfuscatedAssemblyNames => _obfuzAssemblies.Select(x => x.name).ToList(); + private readonly List _obfuscationAssemblyNames; + + public IList ObfuscationAssemblyNames => _obfuscationAssemblyNames; + + private readonly ObfuzPipeline _pipeline = new ObfuzPipeline(); + + private readonly ObfuscatorContext _ctx; public Obfuscator(Options options) { _options = options; - _assemblyCache = new AssemblyCache(new PathAssemblyResolver(options.AssemblySearchDirs.ToArray())); - _obfuscateRuleConfig = new ObfuscateRuleConfig(); - _obfuscateRuleConfig.LoadXmls(options.ObfuscationRuleFiles); - _renamePolicy = new CacheRenamePolicy(new CombineRenamePolicy(new SystemRenamePolicy(), new UnityRenamePolicy(), _obfuscateRuleConfig)); - //_nameMaker = new TestNameMaker(); - _nameMaker = NameMakerFactory.CreateNameMakerBaseASCIICharSet(); + _obfuscationAssemblyNames = options.obfuscationAssemblyNames; + _assemblyCache = new AssemblyCache(new PathAssemblyResolver(options.assemblySearchDirs.ToArray())); + + _pipeline.AddPass(new DataVirtualizationPass()); + _pipeline.AddPass(new RenameSymbolPass()); + + + _ctx = new ObfuscatorContext + { + assemblyCache = _assemblyCache, + assemblies = _obfuzAssemblies, + obfuscationAssemblyNames = _obfuscationAssemblyNames, + obfuscationRuleFiles = options.obfuscationRuleFiles, + mappingXmlPath = _options.mappingXmlPath, + outputDir = options.outputDir, + }; } public void Run() { LoadAssemblies(); - Rename(); - Save(); + _pipeline.Start(_ctx); + DoObfuscation(); + OnObfuscationFinished(); } private void LoadAssemblies() { - foreach (string assName in _obfuscateRuleConfig.ObfuscatedAssemblyNames) + foreach (string assName in _obfuscationAssemblyNames) { ModuleDefMD mod = _assemblyCache.TryLoadModule(assName); if (mod == null) @@ -88,26 +103,20 @@ namespace Obfuz } } - private void Rename() - { - var ctx = new ObfuscatorContext - { - assemblyCache = _assemblyCache, - assemblies = _obfuzAssemblies, - renamePolicy = _renamePolicy, - nameMaker = _nameMaker, - mappingXmlPath = _options.mappingXmlPath, - outputDir = _options.outputDir, - }; - _symbolRename = new SymbolRename(ctx); - _symbolRename.Process(); - } - - private void Save() + private void DoObfuscation() { string outputDir = _options.outputDir; FileUtil.RecreateDir(outputDir); - _symbolRename.Save(); + + _pipeline.Run(_ctx); + } + + private void OnObfuscationFinished() + { + string outputDir = _options.outputDir; + + _pipeline.Stop(_ctx); + foreach (var ass in _obfuzAssemblies) { string outputFile = $"{outputDir}/{ass.module.Name}"; diff --git a/Editor/ObfuscatorContext.cs b/Editor/ObfuscatorContext.cs index 8923c60..ba15284 100644 --- a/Editor/ObfuscatorContext.cs +++ b/Editor/ObfuscatorContext.cs @@ -23,10 +23,8 @@ namespace Obfuz public List assemblies; - public IRenamePolicy renamePolicy; - - public INameMaker nameMaker; - + public List obfuscationAssemblyNames; + public List obfuscationRuleFiles; public string mappingXmlPath; public string outputDir; diff --git a/Editor/ObfuzPipeline.cs b/Editor/ObfuzPipeline.cs index 2f36d57..b87acb1 100644 --- a/Editor/ObfuzPipeline.cs +++ b/Editor/ObfuzPipeline.cs @@ -1,7 +1,40 @@ -namespace Obfuz +using System.Collections.Generic; + +namespace Obfuz { public class ObfuzPipeline { + private readonly List _passes = new List(); + public ObfuzPipeline AddPass(IObfuscationPass pass) + { + _passes.Add(pass); + return this; + } + + public void Start(ObfuscatorContext ctx) + { + foreach (var pass in _passes) + { + pass.Start(ctx); + } + } + + public void Stop(ObfuscatorContext ctx) + { + + foreach (var pass in _passes) + { + pass.Stop(ctx); + } + } + + public void Run(ObfuscatorContext ctx) + { + foreach (var pass in _passes) + { + pass.Process(ctx); + } + } } } diff --git a/Editor/Rename/RenameSymbolPass.cs b/Editor/Rename/RenameSymbolPass.cs new file mode 100644 index 0000000..d4034ee --- /dev/null +++ b/Editor/Rename/RenameSymbolPass.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Obfuz.Rename +{ + public class RenameSymbolPass : ObfuscationPassBase + { + private SymbolRename _symbolRename; + + public override void Start(ObfuscatorContext ctx) + { + _symbolRename = new SymbolRename(ctx); + } + + public override void Stop(ObfuscatorContext ctx) + { + _symbolRename.Save(); + } + + public override void Process(ObfuscatorContext ctx) + { + _symbolRename.Process(); + } + } +} diff --git a/Editor/Rename/SymbolRename.cs b/Editor/Rename/SymbolRename.cs index fcbca67..0c3f1e8 100644 --- a/Editor/Rename/SymbolRename.cs +++ b/Editor/Rename/SymbolRename.cs @@ -21,6 +21,7 @@ namespace Obfuz private readonly AssemblyCache _assemblyCache; private readonly List _obfuzAssemblies; private readonly HashSet _obfuscatedModules = new HashSet(); + private readonly ObfuscateRuleConfig _obfuscateRuleConfig; private readonly IRenamePolicy _renamePolicy; private readonly INameMaker _nameMaker; private readonly Dictionary> _customAttributeArgumentsWithTypeByMods = new Dictionary>(); @@ -40,8 +41,10 @@ namespace Obfuz _mappingXmlPath = ctx.mappingXmlPath; _assemblyCache = ctx.assemblyCache; _obfuzAssemblies = ctx.assemblies; - _renamePolicy = ctx.renamePolicy; - _nameMaker = ctx.nameMaker; + _obfuscateRuleConfig = new ObfuscateRuleConfig(ctx.obfuscationAssemblyNames); + _obfuscateRuleConfig.LoadXmls(ctx.obfuscationRuleFiles); + _renamePolicy = new CacheRenamePolicy(new CombineRenamePolicy(new SystemRenamePolicy(), new UnityRenamePolicy(), _obfuscateRuleConfig)); + _nameMaker = NameMakerFactory.CreateNameMakerBaseASCIICharSet(); foreach (var mod in ctx.assemblies) { diff --git a/Editor/Settings/ObfuzSettingProvider.cs b/Editor/Settings/ObfuzSettingProvider.cs index e551aca..480ece3 100644 --- a/Editor/Settings/ObfuzSettingProvider.cs +++ b/Editor/Settings/ObfuzSettingProvider.cs @@ -29,6 +29,7 @@ namespace Obfuz private SerializedObject _serializedObject; private SerializedProperty _enable; + private SerializedProperty _obfuscationAssemblyNames; private SerializedProperty _mappingFile; private SerializedProperty _ruleFiles; private SerializedProperty _extraAssemblySearchDirs; @@ -49,6 +50,7 @@ namespace Obfuz _serializedObject?.Dispose(); _serializedObject = new SerializedObject(setting); _enable = _serializedObject.FindProperty("enable"); + _obfuscationAssemblyNames = _serializedObject.FindProperty("obfuscationAssemblyNames"); _mappingFile = _serializedObject.FindProperty("mappingFile"); _ruleFiles = _serializedObject.FindProperty("ruleFiles"); _extraAssemblySearchDirs = _serializedObject.FindProperty("extraAssemblySearchDirs"); @@ -72,6 +74,7 @@ namespace Obfuz EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(_enable); + EditorGUILayout.PropertyField(_obfuscationAssemblyNames); EditorGUILayout.PropertyField(_mappingFile); EditorGUILayout.PropertyField(_ruleFiles); EditorGUILayout.PropertyField(_extraAssemblySearchDirs); diff --git a/Editor/Settings/ObfuzSettings.cs b/Editor/Settings/ObfuzSettings.cs index 2dc8298..b37f5b0 100644 --- a/Editor/Settings/ObfuzSettings.cs +++ b/Editor/Settings/ObfuzSettings.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.IO; using System.Runtime.Remoting.Messaging; using UnityEditor; @@ -12,6 +13,9 @@ namespace Obfuz [Tooltip("enable Obfuz")] public bool enable = true; + [Tooltip("obfuscation assembly names")] + public string[] obfuscationAssemblyNames; + [Tooltip("path of mapping.xml")] public string mappingFile = "Assets/Obfuz/mapping.xml"; diff --git a/Editor/Virtualization/DataVirtualizationPass.cs b/Editor/Virtualization/DataVirtualizationPass.cs new file mode 100644 index 0000000..36b6f18 --- /dev/null +++ b/Editor/Virtualization/DataVirtualizationPass.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Obfuz.Virtualization +{ + public class DataVirtualizationPass : ObfuscationPassBase + { + public override void Process(ObfuscatorContext ctx) + { + + } + } +}