From b6500147c2aedb3ebef8e89900497dc48e4199d1 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 23 May 2025 12:01:04 +0800 Subject: [PATCH] =?UTF-8?q?CallObfusSettings=E6=96=B0=E5=A2=9EmaxProxyMeth?= =?UTF-8?q?odCountPerDispatchMethod=E5=AD=97=E6=AE=B5=EF=BC=8C=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=AF=8F=E4=B8=AAdispatch=E5=87=BD=E6=95=B0=E4=B8=AD?= =?UTF-8?q?=E6=9C=80=E5=A4=9A=E8=BD=AC=E5=8F=91=E7=9A=84=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E4=B8=AA=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/ObfusPasses/CallObfus/CallObfusPass.cs | 4 +++- .../ObfusPasses/CallObfus/CallProxyAllocator.cs | 15 ++++++++------- .../CallObfus/DefaultCallProxyObfuscator.cs | 4 ++-- .../Editor/Settings/CallObfuscationSettings.cs | 3 +++ 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/CallObfusPass.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/CallObfusPass.cs index 9b32359..aed4f7b 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/CallObfusPass.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/CallObfusPass.cs @@ -17,6 +17,7 @@ namespace Obfuz.ObfusPasses.CallObfus { private readonly List _configFiles; private readonly int _obfuscationLevel; + private readonly int _maxProxyMethodPerDispatchMethod; private IObfuscator _dynamicProxyObfuscator; private IObfuscationPolicy _dynamicProxyPolicy; @@ -26,6 +27,7 @@ namespace Obfuz.ObfusPasses.CallObfus { _configFiles = settings.ruleFiles.ToList(); _obfuscationLevel = settings.obfuscationLevel; + _maxProxyMethodPerDispatchMethod = settings.maxProxyMethodCountPerDispatchMethod; } public override void Stop() @@ -36,7 +38,7 @@ namespace Obfuz.ObfusPasses.CallObfus public override void Start() { var ctx = ObfuscationPassContext.Current; - _dynamicProxyObfuscator = new DefaultCallProxyObfuscator(ctx.encryptionScopeProvider, ctx.constFieldAllocator, ctx.moduleEntityManager, _obfuscationLevel); + _dynamicProxyObfuscator = new DefaultCallProxyObfuscator(ctx.encryptionScopeProvider, ctx.constFieldAllocator, ctx.moduleEntityManager, _obfuscationLevel, _maxProxyMethodPerDispatchMethod); _dynamicProxyPolicy = new ConfigurableObfuscationPolicy(ctx.assembliesToObfuscate, _configFiles); } diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/CallProxyAllocator.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/CallProxyAllocator.cs index 1164db6..919054a 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/CallProxyAllocator.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/CallProxyAllocator.cs @@ -76,9 +76,6 @@ namespace Obfuz.ObfusPasses.CallObfus private readonly Dictionary _methodProxys = new Dictionary(); - - const int maxProxyMethodPerDispatchMethod = 1000; - class CallInfo { public IMethod method; @@ -91,15 +88,17 @@ namespace Obfuz.ObfusPasses.CallObfus public List methods = new List(); } + private readonly int _maxProxyMethodPerDispatchMethod; private readonly Dictionary> _dispatchMethods = new Dictionary>(SignatureEqualityComparer.Instance); private TypeDef _proxyTypeDef; - public ModuleCallProxyAllocator(EncryptionScopeProvider encryptionScopeProvider, int encryptionLevel) + public ModuleCallProxyAllocator(EncryptionScopeProvider encryptionScopeProvider, int encryptionLevel, int maxProxyMethodPerDispatchMethod) { _encryptionScopeProvider = encryptionScopeProvider; _encryptionLevel = encryptionLevel; + _maxProxyMethodPerDispatchMethod = maxProxyMethodPerDispatchMethod; } public void Init(ModuleDef mod) @@ -172,7 +171,7 @@ namespace Obfuz.ObfusPasses.CallObfus dispatchMethods = new List(); _dispatchMethods.Add(methodSig, dispatchMethods); } - if (dispatchMethods.Count == 0 || dispatchMethods.Last().methods.Count >= maxProxyMethodPerDispatchMethod) + if (dispatchMethods.Count == 0 || dispatchMethods.Last().methods.Count >= _maxProxyMethodPerDispatchMethod) { var newDispatchMethodInfo = new DispatchMethodInfo { @@ -263,17 +262,19 @@ namespace Obfuz.ObfusPasses.CallObfus private readonly EncryptionScopeProvider _encryptionScopeProvider; private GroupByModuleEntityManager _moduleEntityManager; private readonly int _encryptionLevel; + private readonly int _maxProxyMethodPerDispatchMethod; - public CallProxyAllocator(EncryptionScopeProvider encryptionScopeProvider, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel) + public CallProxyAllocator(EncryptionScopeProvider encryptionScopeProvider, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel, int maxProxyMethodPerDispatchMethod) { _encryptionScopeProvider = encryptionScopeProvider; _moduleEntityManager = moduleEntityManager; _encryptionLevel = encryptionLevel; + _maxProxyMethodPerDispatchMethod = maxProxyMethodPerDispatchMethod; } private ModuleCallProxyAllocator GetModuleAllocator(ModuleDef mod) { - return _moduleEntityManager.GetEntity(mod, () => new ModuleCallProxyAllocator(_encryptionScopeProvider, _encryptionLevel)); + return _moduleEntityManager.GetEntity(mod, () => new ModuleCallProxyAllocator(_encryptionScopeProvider, _encryptionLevel, _maxProxyMethodPerDispatchMethod)); } public ProxyCallMethodData Allocate(ModuleDef mod, IMethod method, bool callVir) diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/DefaultCallProxyObfuscator.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/DefaultCallProxyObfuscator.cs index e171909..65b15f6 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/DefaultCallProxyObfuscator.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/CallObfus/DefaultCallProxyObfuscator.cs @@ -15,12 +15,12 @@ namespace Obfuz.ObfusPasses.CallObfus private readonly CallProxyAllocator _proxyCallAllocator; private readonly GroupByModuleEntityManager _moduleEntityManager; - public DefaultCallProxyObfuscator(EncryptionScopeProvider encryptionScopeProvider, ConstFieldAllocator constFieldAllocator, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel) + public DefaultCallProxyObfuscator(EncryptionScopeProvider encryptionScopeProvider, ConstFieldAllocator constFieldAllocator, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel, int maxProxyMethodPerDispatchMethod) { _encryptionScopeProvider = encryptionScopeProvider; _constFieldAllocator = constFieldAllocator; _moduleEntityManager = moduleEntityManager; - _proxyCallAllocator = new CallProxyAllocator(encryptionScopeProvider, moduleEntityManager, encryptionLevel); + _proxyCallAllocator = new CallProxyAllocator(encryptionScopeProvider, moduleEntityManager, encryptionLevel, maxProxyMethodPerDispatchMethod); } public override void Done() diff --git a/com.code-philosophy.obfuz/Editor/Settings/CallObfuscationSettings.cs b/com.code-philosophy.obfuz/Editor/Settings/CallObfuscationSettings.cs index 3ea3a1f..9ad91bc 100644 --- a/com.code-philosophy.obfuz/Editor/Settings/CallObfuscationSettings.cs +++ b/com.code-philosophy.obfuz/Editor/Settings/CallObfuscationSettings.cs @@ -14,6 +14,9 @@ namespace Obfuz.Settings [Range(1, 4)] public int obfuscationLevel = 1; + [Tooltip("The maximum number of proxy methods that can be generated per dispatch method. This helps to limit the complexity of the generated code and improve performance.")] + public int maxProxyMethodCountPerDispatchMethod = 100; + [Tooltip("rule config xml files")] public string[] ruleFiles; }