CallObfusSettings新增maxProxyMethodCountPerDispatchMethod字段,设置每个dispatch函数中最多转发的函数个数

before-split
walon 2025-05-23 12:01:04 +08:00
parent 3425abceb5
commit b6500147c2
4 changed files with 16 additions and 10 deletions

View File

@ -17,6 +17,7 @@ namespace Obfuz.ObfusPasses.CallObfus
{ {
private readonly List<string> _configFiles; private readonly List<string> _configFiles;
private readonly int _obfuscationLevel; private readonly int _obfuscationLevel;
private readonly int _maxProxyMethodPerDispatchMethod;
private IObfuscator _dynamicProxyObfuscator; private IObfuscator _dynamicProxyObfuscator;
private IObfuscationPolicy _dynamicProxyPolicy; private IObfuscationPolicy _dynamicProxyPolicy;
@ -26,6 +27,7 @@ namespace Obfuz.ObfusPasses.CallObfus
{ {
_configFiles = settings.ruleFiles.ToList(); _configFiles = settings.ruleFiles.ToList();
_obfuscationLevel = settings.obfuscationLevel; _obfuscationLevel = settings.obfuscationLevel;
_maxProxyMethodPerDispatchMethod = settings.maxProxyMethodCountPerDispatchMethod;
} }
public override void Stop() public override void Stop()
@ -36,7 +38,7 @@ namespace Obfuz.ObfusPasses.CallObfus
public override void Start() public override void Start()
{ {
var ctx = ObfuscationPassContext.Current; 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); _dynamicProxyPolicy = new ConfigurableObfuscationPolicy(ctx.assembliesToObfuscate, _configFiles);
} }

View File

@ -76,9 +76,6 @@ namespace Obfuz.ObfusPasses.CallObfus
private readonly Dictionary<MethodKey, MethodProxyInfo> _methodProxys = new Dictionary<MethodKey, MethodProxyInfo>(); private readonly Dictionary<MethodKey, MethodProxyInfo> _methodProxys = new Dictionary<MethodKey, MethodProxyInfo>();
const int maxProxyMethodPerDispatchMethod = 1000;
class CallInfo class CallInfo
{ {
public IMethod method; public IMethod method;
@ -91,15 +88,17 @@ namespace Obfuz.ObfusPasses.CallObfus
public List<CallInfo> methods = new List<CallInfo>(); public List<CallInfo> methods = new List<CallInfo>();
} }
private readonly int _maxProxyMethodPerDispatchMethod;
private readonly Dictionary<MethodSig, List<DispatchMethodInfo>> _dispatchMethods = new Dictionary<MethodSig, List<DispatchMethodInfo>>(SignatureEqualityComparer.Instance); private readonly Dictionary<MethodSig, List<DispatchMethodInfo>> _dispatchMethods = new Dictionary<MethodSig, List<DispatchMethodInfo>>(SignatureEqualityComparer.Instance);
private TypeDef _proxyTypeDef; private TypeDef _proxyTypeDef;
public ModuleCallProxyAllocator(EncryptionScopeProvider encryptionScopeProvider, int encryptionLevel) public ModuleCallProxyAllocator(EncryptionScopeProvider encryptionScopeProvider, int encryptionLevel, int maxProxyMethodPerDispatchMethod)
{ {
_encryptionScopeProvider = encryptionScopeProvider; _encryptionScopeProvider = encryptionScopeProvider;
_encryptionLevel = encryptionLevel; _encryptionLevel = encryptionLevel;
_maxProxyMethodPerDispatchMethod = maxProxyMethodPerDispatchMethod;
} }
public void Init(ModuleDef mod) public void Init(ModuleDef mod)
@ -172,7 +171,7 @@ namespace Obfuz.ObfusPasses.CallObfus
dispatchMethods = new List<DispatchMethodInfo>(); dispatchMethods = new List<DispatchMethodInfo>();
_dispatchMethods.Add(methodSig, dispatchMethods); _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 var newDispatchMethodInfo = new DispatchMethodInfo
{ {
@ -263,17 +262,19 @@ namespace Obfuz.ObfusPasses.CallObfus
private readonly EncryptionScopeProvider _encryptionScopeProvider; private readonly EncryptionScopeProvider _encryptionScopeProvider;
private GroupByModuleEntityManager _moduleEntityManager; private GroupByModuleEntityManager _moduleEntityManager;
private readonly int _encryptionLevel; 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; _encryptionScopeProvider = encryptionScopeProvider;
_moduleEntityManager = moduleEntityManager; _moduleEntityManager = moduleEntityManager;
_encryptionLevel = encryptionLevel; _encryptionLevel = encryptionLevel;
_maxProxyMethodPerDispatchMethod = maxProxyMethodPerDispatchMethod;
} }
private ModuleCallProxyAllocator GetModuleAllocator(ModuleDef mod) private ModuleCallProxyAllocator GetModuleAllocator(ModuleDef mod)
{ {
return _moduleEntityManager.GetEntity<ModuleCallProxyAllocator>(mod, () => new ModuleCallProxyAllocator(_encryptionScopeProvider, _encryptionLevel)); return _moduleEntityManager.GetEntity<ModuleCallProxyAllocator>(mod, () => new ModuleCallProxyAllocator(_encryptionScopeProvider, _encryptionLevel, _maxProxyMethodPerDispatchMethod));
} }
public ProxyCallMethodData Allocate(ModuleDef mod, IMethod method, bool callVir) public ProxyCallMethodData Allocate(ModuleDef mod, IMethod method, bool callVir)

View File

@ -15,12 +15,12 @@ namespace Obfuz.ObfusPasses.CallObfus
private readonly CallProxyAllocator _proxyCallAllocator; private readonly CallProxyAllocator _proxyCallAllocator;
private readonly GroupByModuleEntityManager _moduleEntityManager; 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; _encryptionScopeProvider = encryptionScopeProvider;
_constFieldAllocator = constFieldAllocator; _constFieldAllocator = constFieldAllocator;
_moduleEntityManager = moduleEntityManager; _moduleEntityManager = moduleEntityManager;
_proxyCallAllocator = new CallProxyAllocator(encryptionScopeProvider, moduleEntityManager, encryptionLevel); _proxyCallAllocator = new CallProxyAllocator(encryptionScopeProvider, moduleEntityManager, encryptionLevel, maxProxyMethodPerDispatchMethod);
} }
public override void Done() public override void Done()

View File

@ -14,6 +14,9 @@ namespace Obfuz.Settings
[Range(1, 4)] [Range(1, 4)]
public int obfuscationLevel = 1; 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")] [Tooltip("rule config xml files")]
public string[] ruleFiles; public string[] ruleFiles;
} }