CallObfusSettings新增maxProxyMethodCountPerDispatchMethod字段,设置每个dispatch函数中最多转发的函数个数
parent
3425abceb5
commit
b6500147c2
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue