diff --git a/Editor/BuildProcess/ObfuzProcess.cs b/Editor/BuildProcess/ObfuzProcess.cs index 7fd28b4..b49e717 100644 --- a/Editor/BuildProcess/ObfuzProcess.cs +++ b/Editor/BuildProcess/ObfuzProcess.cs @@ -100,10 +100,9 @@ namespace Obfuz string applicationContentsPath = EditorApplication.applicationContentsPath; - var opt = new Obfuscator.Options - { - obfuscationAssemblyNames = settings.obfuscationAssemblyNames.ToList(), - assemblySearchDirs = new List + var obfuscatorBuilder = ObfuscatorBuilder.FromObfuzSettings(settings, buildTarget); + + var assemblySearchDirs = new List { #if UNITY_2021_1_OR_NEWER Path.Combine(applicationContentsPath, "UnityReferenceAssemblies/unity-4.8-api/Facades"), @@ -116,17 +115,15 @@ namespace Obfuz #endif Path.Combine(applicationContentsPath, "Managed/UnityEngine"), backupPlayerScriptAssembliesPath, - }.Concat(settings.extraAssemblySearchDirs).ToList(), - obfuscationRuleFiles = settings.ruleFiles.ToList(), - mappingXmlPath = settings.mappingFile, - outputDir = obfuscatedAssemblyOutputDir, - }; - var obfuz = new Obfuscator(opt); + }; + obfuscatorBuilder.InsertTopPriorityAssemblySearchDirs(assemblySearchDirs); + + Obfuscator obfuz = obfuscatorBuilder.Build(); obfuz.Run(); - foreach (var dllName in settings.obfuscationAssemblyNames) + foreach (var dllName in settings.toObfuscatedAssemblyNames) { - string src = $"{opt.outputDir}/{dllName}.dll"; + string src = $"{obfuscatorBuilder.ObfuscatedAssemblyOutputDir}/{dllName}.dll"; string dst = $"{scriptAssembliesPath}/{dllName}.dll"; if (!File.Exists(src)) diff --git a/Editor/Obfuscator.cs b/Editor/Obfuscator.cs index 26ed048..da5a50a 100644 --- a/Editor/Obfuscator.cs +++ b/Editor/Obfuscator.cs @@ -1,8 +1,4 @@ using dnlib.DotNet; -using Obfuz.DynamicProxy; -using Obfuz.ExprObfuscation; -using Obfuz.MemEncrypt; -using Obfuz.Rename; using Obfuz.Emit; using System; using System.Collections.Generic; @@ -11,49 +7,47 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; -using Obfuz.Virtualization; namespace Obfuz { - public class Obfuscator { - public class Options - { - public List obfuscationAssemblyNames; - public List assemblySearchDirs; - public List obfuscationRuleFiles; - public string mappingXmlPath; - public string outputDir; - } - - private readonly Options _options; + private readonly string _obfuscatedAssemblyOutputDir; private readonly AssemblyCache _assemblyCache; private readonly List _obfuzAssemblies = new List(); - private readonly List _obfuscationAssemblyNames; - - public IList ObfuscationAssemblyNames => _obfuscationAssemblyNames; + private readonly List _toObfuscatedAssemblyNames; + private readonly List _notObfuscatedAssemblyNamesReferencingObfuscated; private readonly ObfuzPipeline _pipeline = new ObfuzPipeline(); private readonly ObfuscatorContext _ctx; - public Obfuscator(Options options) + public Obfuscator(List toObfuscatedAssemblyNames, + List notObfuscatedAssemblyNamesReferencingObfuscated, + List assemblySearchDirs, + string obfuscatedAssemblyOutputDir, + List obfuscationPasses) { - _options = options; - _obfuscationAssemblyNames = options.obfuscationAssemblyNames; - MetadataImporter.Reset(); - _assemblyCache = new AssemblyCache(new PathAssemblyResolver(options.assemblySearchDirs.ToArray())); + _toObfuscatedAssemblyNames = toObfuscatedAssemblyNames; + _notObfuscatedAssemblyNamesReferencingObfuscated = notObfuscatedAssemblyNamesReferencingObfuscated; + _obfuscatedAssemblyOutputDir = obfuscatedAssemblyOutputDir; - _pipeline.AddPass(new MemoryEncryptionPass()); - //_pipeline.AddPass(new ProxyCallPass()); - _pipeline.AddPass(new ExprObfuscationPass()); - _pipeline.AddPass(new DataVirtualizationPass()); - _pipeline.AddPass(new RenameSymbolPass()); + MetadataImporter.Reset(); + _assemblyCache = new AssemblyCache(new PathAssemblyResolver(assemblySearchDirs.ToArray())); + foreach (var pass in obfuscationPasses) + { + _pipeline.AddPass(pass); + } + + //_pipeline.AddPass(new MemoryEncryptionPass()); + ////_pipeline.AddPass(new ProxyCallPass()); + //_pipeline.AddPass(new ExprObfuscationPass()); + //_pipeline.AddPass(new DataVirtualizationPass()); + //_pipeline.AddPass(new RenameSymbolPass()); _pipeline.AddPass(new CleanUpInstructionPass()); @@ -61,25 +55,29 @@ namespace Obfuz { assemblyCache = _assemblyCache, assemblies = _obfuzAssemblies, - obfuscationAssemblyNames = _obfuscationAssemblyNames, - obfuscationRuleFiles = options.obfuscationRuleFiles, - mappingXmlPath = _options.mappingXmlPath, - outputDir = options.outputDir, + toObfuscatedAssemblyNames = _toObfuscatedAssemblyNames, + notObfuscatedAssemblyNamesReferencingObfuscated = _notObfuscatedAssemblyNamesReferencingObfuscated, + obfuscatedAssemblyOutputDir = _obfuscatedAssemblyOutputDir, }; } public void Run() + { + OnPreObfuscation(); + DoObfuscation(); + OnPostObfuscation(); + } + + private void OnPreObfuscation() { LoadAssemblies(); _pipeline.Start(_ctx); - DoObfuscation(); - OnObfuscationFinished(); } private void LoadAssemblies() { - foreach (string assName in _obfuscationAssemblyNames) + foreach (string assName in _toObfuscatedAssemblyNames) { ModuleDefMD mod = _assemblyCache.TryLoadModule(assName); if (mod == null) @@ -114,21 +112,18 @@ namespace Obfuz private void DoObfuscation() { - string outputDir = _options.outputDir; - FileUtil.RecreateDir(outputDir); + FileUtil.RecreateDir(_obfuscatedAssemblyOutputDir); _pipeline.Run(_ctx); } - private void OnObfuscationFinished() + private void OnPostObfuscation() { - string outputDir = _options.outputDir; - _pipeline.Stop(_ctx); foreach (var ass in _obfuzAssemblies) { - string outputFile = $"{outputDir}/{ass.module.Name}"; + string outputFile = $"{_obfuscatedAssemblyOutputDir}/{ass.module.Name}"; ass.module.Write(outputFile); Debug.Log($"save module. oldName:{ass.name} newName:{ass.module.Name} output:{outputFile}"); } diff --git a/Editor/ObfuscatorBuilder.cs b/Editor/ObfuscatorBuilder.cs new file mode 100644 index 0000000..db58b7d --- /dev/null +++ b/Editor/ObfuscatorBuilder.cs @@ -0,0 +1,82 @@ +using Obfuz.DynamicProxy; +using Obfuz.ExprObfuscation; +using Obfuz.MemEncrypt; +using Obfuz.Rename; +using System.Collections.Generic; +using System.Linq; +using Obfuz.Virtualization; +using UnityEditor; + +namespace Obfuz +{ + public class ObfuscatorBuilder + { + private List _toObfuscatedAssemblyNames = new List(); + private List _notObfuscatedAssemblyNamesReferencingObfuscated = new List(); + private List _assemblySearchDirs = new List(); + + private string _obfuscatedAssemblyOutputDir; + private List _obfuscationPasses = new List(); + + public List ToObfuscatedAssemblyNames + { + get => _toObfuscatedAssemblyNames; + set => _toObfuscatedAssemblyNames = value; + } + + public List NotObfuscatedAssemblyNamesReferencingObfuscated + { + get => _notObfuscatedAssemblyNamesReferencingObfuscated; + set => _notObfuscatedAssemblyNamesReferencingObfuscated = value; + } + + public List AssemblySearchDirs + { + get => _assemblySearchDirs; + set => _assemblySearchDirs = value; + } + + public string ObfuscatedAssemblyOutputDir + { + get => _obfuscatedAssemblyOutputDir; + set => _obfuscatedAssemblyOutputDir = value; + } + + public void InsertTopPriorityAssemblySearchDirs(List assemblySearchDirs) + { + _assemblySearchDirs.InsertRange(0, assemblySearchDirs); + } + + public ObfuscatorBuilder AddPass(IObfuscationPass pass) + { + _obfuscationPasses.Add(pass); + return this; + } + + public Obfuscator Build() + { + return new Obfuscator(_toObfuscatedAssemblyNames, + _notObfuscatedAssemblyNamesReferencingObfuscated, + _assemblySearchDirs, + _obfuscatedAssemblyOutputDir, + _obfuscationPasses); + } + + public static ObfuscatorBuilder FromObfuzSettings(ObfuzSettings settings, BuildTarget target) + { + var builder = new ObfuscatorBuilder + { + _toObfuscatedAssemblyNames = settings.toObfuscatedAssemblyNames.ToList(), + _notObfuscatedAssemblyNamesReferencingObfuscated = settings.notObfuscatedAssemblyNamesReferencingObfuscated.ToList(), + _assemblySearchDirs = settings.extraAssemblySearchDirs.ToList(), + _obfuscatedAssemblyOutputDir = settings.GetObfuscatedAssemblyOutputDir(target), + }; + builder.AddPass(new MemoryEncryptionPass()); + builder.AddPass(new ProxyCallPass()); + builder.AddPass(new ExprObfuscationPass()); + builder.AddPass(new DataVirtualizationPass()); + builder.AddPass(new RenameSymbolPass(settings.ruleFiles.ToList(), settings.mappingFile)); + return builder; + } + } +} diff --git a/Editor/ObfuscatorContext.cs b/Editor/ObfuscatorContext.cs index ba15284..a03c088 100644 --- a/Editor/ObfuscatorContext.cs +++ b/Editor/ObfuscatorContext.cs @@ -1,5 +1,4 @@ -using dnlib.DotNet; -using Obfuz.Rename; +using Obfuz.Rename; using System; using System.Collections.Generic; using System.Linq; @@ -8,14 +7,6 @@ using System.Threading.Tasks; namespace Obfuz { - public class ObfuzAssemblyInfo - { - public string name; - - public ModuleDefMD module; - - public List referenceMeAssemblies; - } public class ObfuscatorContext { @@ -23,10 +14,10 @@ namespace Obfuz public List assemblies; - public List obfuscationAssemblyNames; - public List obfuscationRuleFiles; - public string mappingXmlPath; + public List toObfuscatedAssemblyNames; - public string outputDir; + public List notObfuscatedAssemblyNamesReferencingObfuscated; + + public string obfuscatedAssemblyOutputDir; } } diff --git a/Editor/ObfuzAssemblyInfo.cs b/Editor/ObfuzAssemblyInfo.cs new file mode 100644 index 0000000..8a18030 --- /dev/null +++ b/Editor/ObfuzAssemblyInfo.cs @@ -0,0 +1,14 @@ +using dnlib.DotNet; +using System.Collections.Generic; + +namespace Obfuz +{ + public class ObfuzAssemblyInfo + { + public string name; + + public ModuleDefMD module; + + public List referenceMeAssemblies; + } +} diff --git a/Editor/Rename/RenameSymbolPass.cs b/Editor/Rename/RenameSymbolPass.cs index d4034ee..b9d6e7f 100644 --- a/Editor/Rename/RenameSymbolPass.cs +++ b/Editor/Rename/RenameSymbolPass.cs @@ -10,9 +10,14 @@ namespace Obfuz.Rename { private SymbolRename _symbolRename; + public RenameSymbolPass(List obfuscationRuleFiles, string mappingXmlPath) + { + _symbolRename = new SymbolRename(mappingXmlPath, obfuscationRuleFiles); + } + public override void Start(ObfuscatorContext ctx) { - _symbolRename = new SymbolRename(ctx); + _symbolRename.Init(ctx); } public override void Stop(ObfuscatorContext ctx) diff --git a/Editor/Rename/SymbolRename.cs b/Editor/Rename/SymbolRename.cs index aab622c..05774c4 100644 --- a/Editor/Rename/SymbolRename.cs +++ b/Editor/Rename/SymbolRename.cs @@ -18,16 +18,18 @@ namespace Obfuz public class SymbolRename { + private readonly List _obfuscationRuleFiles; private readonly string _mappingXmlPath; - 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 AssemblyCache _assemblyCache; + private List _obfuzAssemblies; + private HashSet _obfuscatedModules = new HashSet(); + private ObfuscateRuleConfig _obfuscateRuleConfig; + private IRenamePolicy _renamePolicy; + private INameMaker _nameMaker; private readonly Dictionary> _customAttributeArgumentsWithTypeByMods = new Dictionary>(); private readonly RenameRecordMap _renameRecordMap; - private readonly VirtualMethodGroupCalculator _virtualMethodGroupCalculator = new VirtualMethodGroupCalculator(); + private readonly VirtualMethodGroupCalculator _virtualMethodGroupCalculator; class CustomAttributeInfo { @@ -37,13 +39,20 @@ namespace Obfuz public List namedArguments; } - public SymbolRename(ObfuscatorContext ctx) + public SymbolRename(string mappingXmlPath, List obfuscationRuleFiles) + { + _mappingXmlPath = mappingXmlPath; + _obfuscationRuleFiles = obfuscationRuleFiles; + _renameRecordMap = new RenameRecordMap(mappingXmlPath); + _virtualMethodGroupCalculator = new VirtualMethodGroupCalculator(); + } + + public void Init(ObfuscatorContext ctx) { - _mappingXmlPath = ctx.mappingXmlPath; _assemblyCache = ctx.assemblyCache; _obfuzAssemblies = ctx.assemblies; - _obfuscateRuleConfig = new ObfuscateRuleConfig(ctx.obfuscationAssemblyNames); - _obfuscateRuleConfig.LoadXmls(ctx.obfuscationRuleFiles); + _obfuscateRuleConfig = new ObfuscateRuleConfig(ctx.toObfuscatedAssemblyNames); + _obfuscateRuleConfig.LoadXmls(_obfuscationRuleFiles); _renamePolicy = new CacheRenamePolicy(new CombineRenamePolicy(new SystemRenamePolicy(), new UnityRenamePolicy(), _obfuscateRuleConfig)); _nameMaker = NameMakerFactory.CreateNameMakerBaseASCIICharSet(); @@ -52,8 +61,6 @@ namespace Obfuz _obfuscatedModules.Add(mod.module); } BuildCustomAttributeArguments(); - - _renameRecordMap = new RenameRecordMap(ctx.mappingXmlPath); } private void CollectCArgumentWithTypeOf(IHasCustomAttribute meta, List customAttributes) diff --git a/Editor/Settings/ObfuzSettingProvider.cs b/Editor/Settings/ObfuzSettingProvider.cs index 480ece3..bed7976 100644 --- a/Editor/Settings/ObfuzSettingProvider.cs +++ b/Editor/Settings/ObfuzSettingProvider.cs @@ -29,7 +29,8 @@ namespace Obfuz private SerializedObject _serializedObject; private SerializedProperty _enable; - private SerializedProperty _obfuscationAssemblyNames; + private SerializedProperty _toObfuscatedAssemblyNames; + private SerializedProperty _notObfuscatedAssemblyNamesReferencingObfuscated; private SerializedProperty _mappingFile; private SerializedProperty _ruleFiles; private SerializedProperty _extraAssemblySearchDirs; @@ -50,7 +51,8 @@ namespace Obfuz _serializedObject?.Dispose(); _serializedObject = new SerializedObject(setting); _enable = _serializedObject.FindProperty("enable"); - _obfuscationAssemblyNames = _serializedObject.FindProperty("obfuscationAssemblyNames"); + _toObfuscatedAssemblyNames = _serializedObject.FindProperty("toObfuscatedAssemblyNames"); + _notObfuscatedAssemblyNamesReferencingObfuscated = _serializedObject.FindProperty("notObfuscatedAssemblyNamesReferencingObfuscated"); _mappingFile = _serializedObject.FindProperty("mappingFile"); _ruleFiles = _serializedObject.FindProperty("ruleFiles"); _extraAssemblySearchDirs = _serializedObject.FindProperty("extraAssemblySearchDirs"); @@ -74,7 +76,8 @@ namespace Obfuz EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(_enable); - EditorGUILayout.PropertyField(_obfuscationAssemblyNames); + EditorGUILayout.PropertyField(_toObfuscatedAssemblyNames); + EditorGUILayout.PropertyField(_notObfuscatedAssemblyNamesReferencingObfuscated); EditorGUILayout.PropertyField(_mappingFile); EditorGUILayout.PropertyField(_ruleFiles); EditorGUILayout.PropertyField(_extraAssemblySearchDirs); diff --git a/Editor/Settings/ObfuzSettings.cs b/Editor/Settings/ObfuzSettings.cs index b37f5b0..27954bf 100644 --- a/Editor/Settings/ObfuzSettings.cs +++ b/Editor/Settings/ObfuzSettings.cs @@ -13,8 +13,11 @@ namespace Obfuz [Tooltip("enable Obfuz")] public bool enable = true; - [Tooltip("obfuscation assembly names")] - public string[] obfuscationAssemblyNames; + [Tooltip("name of assemblies to obfuscated")] + public string[] toObfuscatedAssemblyNames; + + [Tooltip("name of assemblies not obfuscated but reference assemblies to obfuscated ")] + public string[] notObfuscatedAssemblyNamesReferencingObfuscated; [Tooltip("path of mapping.xml")] public string mappingFile = "Assets/Obfuz/mapping.xml";