From e12a0e26dcfe9b68e1af601e5c6e2ed5fc1615fa Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 10 Sep 2025 11:15:05 +0800 Subject: [PATCH] =?UTF-8?q?new:=20=E6=96=B0=E5=A2=9ECompatibilitySettings?= =?UTF-8?q?=EF=BC=8C=E5=85=81=E8=AE=B8=E6=8C=87=E5=AE=9A=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=B8=8Emono=E6=88=96il2cpp=E5=85=BC=E5=AE=B9=E7=9A=84?= =?UTF-8?q?=E6=B7=B7=E6=B7=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/ObfusPasses/CallObfus/CallObfusPass.cs | 6 +++--- .../SpecialWhiteListMethodCalculator.cs | 7 +++++-- Editor/ObfuscatorBuilder.cs | 14 +++++++++++++- Editor/Settings/CompatibilitySettings.cs | 17 +++++++++++++++++ Editor/Settings/CompatibilitySettings.cs.meta | 11 +++++++++++ Editor/Settings/ObfuzSettings.cs | 3 +++ Editor/Settings/ObfuzSettingsProvider.cs | 3 +++ 7 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 Editor/Settings/CompatibilitySettings.cs create mode 100644 Editor/Settings/CompatibilitySettings.cs.meta diff --git a/Editor/ObfusPasses/CallObfus/CallObfusPass.cs b/Editor/ObfusPasses/CallObfus/CallObfusPass.cs index 0b9800e..bbabe3a 100644 --- a/Editor/ObfusPasses/CallObfus/CallObfusPass.cs +++ b/Editor/ObfusPasses/CallObfus/CallObfusPass.cs @@ -20,7 +20,7 @@ namespace Obfuz.ObfusPasses.CallObfus public static CallObfuscationSettingsFacade CurrentSettings { get; private set; } private readonly CallObfuscationSettingsFacade _settings; - private readonly SpecialWhiteListMethodCalculator _specialWhiteListMethodCache; + private SpecialWhiteListMethodCalculator _specialWhiteListMethodCache; private IObfuscator _dynamicProxyObfuscator; private IObfuscationPolicy _dynamicProxyPolicy; @@ -31,8 +31,6 @@ namespace Obfuz.ObfusPasses.CallObfus { _settings = settings; CurrentSettings = settings; - - _specialWhiteListMethodCache = new SpecialWhiteListMethodCalculator(settings.obfuscateCallToMethodInMscorlib); } public override void Stop() @@ -43,6 +41,8 @@ namespace Obfuz.ObfusPasses.CallObfus public override void Start() { var ctx = ObfuscationPassContext.Current; + + _specialWhiteListMethodCache = new SpecialWhiteListMethodCalculator(ctx.coreSettings.targetRuntime, _settings.obfuscateCallToMethodInMscorlib); _dynamicProxyObfuscator = CreateObfuscator(ctx, _settings.proxyMode); _dynamicProxyPolicy = new ConfigurableObfuscationPolicy(ctx.coreSettings.assembliesToObfuscate, _settings.ruleFiles); } diff --git a/Editor/ObfusPasses/CallObfus/SpecialWhiteListMethodCalculator.cs b/Editor/ObfusPasses/CallObfus/SpecialWhiteListMethodCalculator.cs index 5f52792..aedd265 100644 --- a/Editor/ObfusPasses/CallObfus/SpecialWhiteListMethodCalculator.cs +++ b/Editor/ObfusPasses/CallObfus/SpecialWhiteListMethodCalculator.cs @@ -1,4 +1,5 @@ using dnlib.DotNet; +using Obfuz.Settings; using Obfuz.Utils; using System.Collections.Generic; @@ -6,11 +7,13 @@ namespace Obfuz.ObfusPasses.CallObfus { class SpecialWhiteListMethodCalculator { + private readonly RuntimeType _targetRuntime; private readonly bool _obfuscateCallToMethodInMscorlib; private readonly CachedDictionary _specialWhiteListMethodCache; - public SpecialWhiteListMethodCalculator(bool obfuscateCallToMethodInMscorlib) + public SpecialWhiteListMethodCalculator(RuntimeType targetRuntime, bool obfuscateCallToMethodInMscorlib) { + _targetRuntime = targetRuntime; _obfuscateCallToMethodInMscorlib = obfuscateCallToMethodInMscorlib; _specialWhiteListMethodCache = new CachedDictionary(MethodEqualityComparer.CompareDeclaringTypes, this.ComputeIsInWhiteList); } @@ -46,7 +49,7 @@ namespace Obfuz.ObfusPasses.CallObfus { MethodDef calledMethodDef = calledMethod.ResolveMethodDef(); // mono has more strict access control, calls non-public method will raise exception. - if (PlatformUtil.IsMonoBackend()) + if (_targetRuntime == RuntimeType.Mono) { if (calledMethodDef != null && (!calledMethodDef.IsPublic || !IsTypeSelfAndParentPublic(calledMethodDef.DeclaringType))) { diff --git a/Editor/ObfuscatorBuilder.cs b/Editor/ObfuscatorBuilder.cs index 31ae7af..023f42d 100644 --- a/Editor/ObfuscatorBuilder.cs +++ b/Editor/ObfuscatorBuilder.cs @@ -1,4 +1,5 @@ -using Obfuz.EncryptionVM; +using dnlib.DotNet.Writer; +using Obfuz.EncryptionVM; using Obfuz.ObfusPasses; using Obfuz.ObfusPasses.CallObfus; using Obfuz.ObfusPasses.ConstEncrypt; @@ -15,6 +16,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; +using UnityEngine; namespace Obfuz { @@ -22,6 +24,7 @@ namespace Obfuz public class CoreSettingsFacade { public BuildTarget buildTarget; + public RuntimeType targetRuntime; public byte[] defaultStaticSecretKey; public byte[] defaultDynamicSecretKey; @@ -152,11 +155,20 @@ namespace Obfuz bool exists = Directory.Exists(path); UnityEngine.Debug.Log($"search path:{path} exists:{exists}"); } + RuntimeType targetRuntime = settings.compatibilitySettings.targetRuntime != RuntimeType.ActivatedScriptingBackend ? + settings.compatibilitySettings.targetRuntime : + (PlatformUtil.IsMonoBackend() ? RuntimeType.Mono : RuntimeType.IL2CPP); + if (searchPathIncludeUnityEditorDll && targetRuntime != RuntimeType.Mono) + { + Debug.LogError($"obfuscate dll for editor, but ObfuzSettings.CompatibilitySettings.targetRuntime isn't RuntimeType.Mono. Use RuntimeType.Mono for targetRuntime automatically."); + targetRuntime = RuntimeType.Mono; + } var builder = new ObfuscatorBuilder { _coreSettingsFacade = new CoreSettingsFacade() { buildTarget = target, + targetRuntime = targetRuntime, defaultStaticSecretKey = KeyGenerator.GenerateKey(settings.secretSettings.defaultStaticSecretKey, VirtualMachine.SecretKeyLength), defaultDynamicSecretKey = KeyGenerator.GenerateKey(settings.secretSettings.defaultDynamicSecretKey, VirtualMachine.SecretKeyLength), assembliesUsingDynamicSecretKeys = settings.secretSettings.assembliesUsingDynamicSecretKeys.ToList(), diff --git a/Editor/Settings/CompatibilitySettings.cs b/Editor/Settings/CompatibilitySettings.cs new file mode 100644 index 0000000..809ff23 --- /dev/null +++ b/Editor/Settings/CompatibilitySettings.cs @@ -0,0 +1,17 @@ +using System; + +namespace Obfuz.Settings +{ + public enum RuntimeType + { + ActivatedScriptingBackend, + IL2CPP, + Mono, + } + + [Serializable] + public class CompatibilitySettings + { + public RuntimeType targetRuntime; + } +} diff --git a/Editor/Settings/CompatibilitySettings.cs.meta b/Editor/Settings/CompatibilitySettings.cs.meta new file mode 100644 index 0000000..c02d1c6 --- /dev/null +++ b/Editor/Settings/CompatibilitySettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a69af5ef930cf749bfc8e9941a0f4e8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Settings/ObfuzSettings.cs b/Editor/Settings/ObfuzSettings.cs index 4f111a3..d6a0c34 100644 --- a/Editor/Settings/ObfuzSettings.cs +++ b/Editor/Settings/ObfuzSettings.cs @@ -11,6 +11,9 @@ namespace Obfuz.Settings [Tooltip("build pipeline settings")] public BuildPipelineSettings buildPipelineSettings; + [Tooltip("compatibility settings")] + public CompatibilitySettings compatibilitySettings; + [Tooltip("assembly settings")] public AssemblySettings assemblySettings; diff --git a/Editor/Settings/ObfuzSettingsProvider.cs b/Editor/Settings/ObfuzSettingsProvider.cs index bea128c..8ccb62e 100644 --- a/Editor/Settings/ObfuzSettingsProvider.cs +++ b/Editor/Settings/ObfuzSettingsProvider.cs @@ -25,6 +25,7 @@ namespace Obfuz.Settings private SerializedObject _serializedObject; private SerializedProperty _buildPipelineSettings; + private SerializedProperty _compatibilitySettings; private SerializedProperty _assemblySettings; private SerializedProperty _obfuscationPassSettings; @@ -66,6 +67,7 @@ namespace Obfuz.Settings _serializedObject?.Dispose(); _serializedObject = new SerializedObject(setting); _buildPipelineSettings = _serializedObject.FindProperty("buildPipelineSettings"); + _compatibilitySettings = _serializedObject.FindProperty("compatibilitySettings"); _assemblySettings = _serializedObject.FindProperty("assemblySettings"); _obfuscationPassSettings = _serializedObject.FindProperty("obfuscationPassSettings"); @@ -98,6 +100,7 @@ namespace Obfuz.Settings EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(_buildPipelineSettings); + EditorGUILayout.PropertyField(_compatibilitySettings); EditorGUILayout.PropertyField(_assemblySettings); EditorGUILayout.PropertyField(_obfuscationPassSettings);