重构 ObfuscationPassContext,新增单例,不再传参

backup
walon 2025-05-13 08:49:57 +08:00
parent 645621900a
commit b4a0414f25
21 changed files with 94 additions and 74 deletions

View File

@ -18,6 +18,7 @@ namespace Obfuz.Data
private readonly IRandom _random;
private readonly IEncryptor _encryptor;
private readonly RvaDataAllocator _rvaDataAllocator;
private readonly GroupByModuleEntityManager _moduleEntityManager;
private TypeDef _holderTypeDef;
@ -32,11 +33,12 @@ namespace Obfuz.Data
private readonly List<TypeDef> _holderTypeDefs = new List<TypeDef>();
public ModuleConstFieldAllocator(IEncryptor encryptor, IRandom random, RvaDataAllocator rvaDataAllocator)
public ModuleConstFieldAllocator(IEncryptor encryptor, IRandom random, RvaDataAllocator rvaDataAllocator, GroupByModuleEntityManager moduleEntityManager)
{
_encryptor = encryptor;
_random = random;
_rvaDataAllocator = rvaDataAllocator;
_moduleEntityManager = moduleEntityManager;
}
public void Init(ModuleDef mod)
@ -138,7 +140,7 @@ namespace Obfuz.Data
private DefaultMetadataImporter GetModuleMetadataImporter()
{
return GroupByModuleEntityManager.Ins.GetDefaultModuleMetadataImporter(_module);
return _moduleEntityManager.GetDefaultModuleMetadataImporter(_module);
}
private void CreateCCtorOfRvaTypeDef(TypeDef type)
@ -258,17 +260,19 @@ namespace Obfuz.Data
private readonly IEncryptor _encryptor;
private readonly IRandom _random;
private readonly RvaDataAllocator _rvaDataAllocator;
private readonly GroupByModuleEntityManager _moduleEntityManager;
public ConstFieldAllocator(IEncryptor encryptor, IRandom random, RvaDataAllocator rvaDataAllocator)
public ConstFieldAllocator(IEncryptor encryptor, IRandom random, RvaDataAllocator rvaDataAllocator, GroupByModuleEntityManager moduleEntityManager)
{
_encryptor = encryptor;
_random = random;
_rvaDataAllocator = rvaDataAllocator;
_moduleEntityManager = moduleEntityManager;
}
private ModuleConstFieldAllocator GetModuleAllocator(ModuleDef mod)
{
return GroupByModuleEntityManager.Ins.GetEntity<ModuleConstFieldAllocator>(mod, () => new ModuleConstFieldAllocator(_encryptor, _random, _rvaDataAllocator));
return _moduleEntityManager.GetEntity<ModuleConstFieldAllocator>(mod, () => new ModuleConstFieldAllocator(_encryptor, _random, _rvaDataAllocator, _moduleEntityManager));
}
public FieldDef Allocate(ModuleDef mod, int value)
@ -303,7 +307,7 @@ namespace Obfuz.Data
public void Done()
{
foreach (var moduleAllocator in GroupByModuleEntityManager.Ins.GetEntities<ModuleConstFieldAllocator>())
foreach (var moduleAllocator in _moduleEntityManager.GetEntities<ModuleConstFieldAllocator>())
{
moduleAllocator.Done();
}

View File

@ -33,6 +33,7 @@ namespace Obfuz.Data
private ModuleDef _module;
private readonly IRandom _random;
private readonly IEncryptor _encryptor;
private readonly GroupByModuleEntityManager _moduleEntityManager;
class RvaField
{
@ -69,10 +70,11 @@ namespace Obfuz.Data
private readonly Dictionary<int, TypeDef> _dataHolderTypeBySizes = new Dictionary<int, TypeDef>();
public ModuleRvaDataAllocator(IRandom random, IEncryptor encryptor)
public ModuleRvaDataAllocator(IRandom random, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager)
{
_random = random;
_encryptor = encryptor;
_moduleEntityManager = moduleEntityManager;
}
public override void Init(ModuleDef mod)
@ -234,7 +236,7 @@ namespace Obfuz.Data
cctorMethod.Body = body;
var ins = body.Instructions;
DefaultMetadataImporter importer = GroupByModuleEntityManager.Ins.GetDefaultModuleMetadataImporter(mod);
DefaultMetadataImporter importer = _moduleEntityManager.GetDefaultModuleMetadataImporter(mod);
foreach (var field in _rvaFields)
{
// ldc
@ -287,16 +289,18 @@ namespace Obfuz.Data
private readonly IRandom _random;
private readonly IEncryptor _encryptor;
private readonly GroupByModuleEntityManager _moduleEntityManager;
public RvaDataAllocator(IRandom random, IEncryptor encryptor)
public RvaDataAllocator(IRandom random, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager)
{
_random = random;
_encryptor = encryptor;
_moduleEntityManager = moduleEntityManager;
}
private ModuleRvaDataAllocator GetModuleRvaDataAllocator(ModuleDef mod)
{
return GroupByModuleEntityManager.Ins.GetEntity<ModuleRvaDataAllocator>(mod, () => new ModuleRvaDataAllocator(_random, _encryptor));
return _moduleEntityManager.GetEntity<ModuleRvaDataAllocator>(mod, () => new ModuleRvaDataAllocator(_random, _encryptor, _moduleEntityManager));
}
public RvaData Allocate(ModuleDef mod, int value)
@ -331,7 +335,7 @@ namespace Obfuz.Data
public void Done()
{
foreach (var allocator in GroupByModuleEntityManager.Ins.GetEntities<ModuleRvaDataAllocator>())
foreach (var allocator in _moduleEntityManager.GetEntities<ModuleRvaDataAllocator>())
{
allocator.Done();
}

View File

@ -19,20 +19,12 @@ namespace Obfuz.Emit
public class GroupByModuleEntityManager
{
public static GroupByModuleEntityManager Ins { get; private set; }
private readonly Dictionary<(ModuleDef, Type), IGroupByModuleEntity> _moduleEmitManagers = new Dictionary<(ModuleDef, Type), IGroupByModuleEntity>();
public static void Reset()
{
Ins = new GroupByModuleEntityManager();
}
private readonly Dictionary<(ModuleDef, Type), IGroupByModuleEntity> _moduleEntityManagers = new Dictionary<(ModuleDef, Type), IGroupByModuleEntity>();
public T GetEntity<T>(ModuleDef mod, Func<T> creator = null) where T : IGroupByModuleEntity
{
var key = (mod, typeof(T));
if (_moduleEmitManagers.TryGetValue(key, out var emitManager))
if (_moduleEntityManagers.TryGetValue(key, out var emitManager))
{
return (T)emitManager;
}
@ -48,7 +40,7 @@ namespace Obfuz.Emit
newEmitManager = (T)Activator.CreateInstance(typeof(T));
}
newEmitManager.Init(mod);
_moduleEmitManagers[key] = newEmitManager;
_moduleEntityManagers[key] = newEmitManager;
return newEmitManager;
}
}
@ -56,7 +48,7 @@ namespace Obfuz.Emit
public List<T> GetEntities<T>() where T: IGroupByModuleEntity
{
var managers = new List<T>();
foreach (var kv in _moduleEmitManagers)
foreach (var kv in _moduleEntityManagers)
{
if (kv.Key.Item2 == typeof(T))
{

View File

@ -11,10 +11,10 @@ namespace Obfuz
{
ObfuscationPassType Type { get; }
void Start(ObfuscationPassContext ctx);
void Start();
void Stop(ObfuscationPassContext ctx);
void Stop();
void Process(ObfuscationPassContext ctx);
void Process();
}
}

View File

@ -10,8 +10,9 @@ namespace Obfuz.ObfusPasses
{
protected abstract bool NeedObfuscateMethod(MethodDef method);
public override void Process(ObfuscationPassContext ctx)
public override void Process()
{
var ctx = ObfuscationPassContext.Current;
NotObfuscatedMethodWhiteList whiteList = ctx.whiteList;
ConfigurablePassPolicy passPolicy = ctx.passPolicy;
foreach (ModuleDef mod in ctx.toObfuscatedModules)

View File

@ -30,16 +30,17 @@ namespace Obfuz.ObfusPasses.CallObfus
_obfuscationLevel = settings.callObfuscationLevel;
}
public override void Stop(ObfuscationPassContext ctx)
public override void Stop()
{
_dynamicProxyObfuscator.Done();
}
public override void Start(ObfuscationPassContext ctx)
public override void Start()
{
var ctx = ObfuscationPassContext.Current;
_random = ctx.random;
_encryptor = ctx.encryptor;
_dynamicProxyObfuscator = new DefaultCallProxyObfuscator(_random, _encryptor, ctx.constFieldAllocator, _obfuscationLevel);
_dynamicProxyObfuscator = new DefaultCallProxyObfuscator(_random, _encryptor, ctx.constFieldAllocator, ctx.moduleEntityManager, _obfuscationLevel);
_dynamicProxyPolicy = new ConfigurableObfuscationPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
}

View File

@ -242,18 +242,20 @@ namespace Obfuz.ObfusPasses.CallObfus
{
private readonly IRandom _random;
private readonly IEncryptor _encryptor;
private GroupByModuleEntityManager _moduleEntityManager;
private readonly int _encryptionLevel;
public CallProxyAllocator(IRandom random, IEncryptor encryptor, int encryptionLevel)
public CallProxyAllocator(IRandom random, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
{
_random = random;
_encryptor = encryptor;
_moduleEntityManager = moduleEntityManager;
_encryptionLevel = encryptionLevel;
}
private ModuleCallProxyAllocator GetModuleAllocator(ModuleDef mod)
{
return GroupByModuleEntityManager.Ins.GetEntity<ModuleCallProxyAllocator>(mod, () => new ModuleCallProxyAllocator(_random, _encryptor, _encryptionLevel));
return _moduleEntityManager.GetEntity<ModuleCallProxyAllocator>(mod, () => new ModuleCallProxyAllocator(_random, _encryptor, _encryptionLevel));
}
public ProxyCallMethodData Allocate(ModuleDef mod, IMethod method, bool callVir)
@ -264,7 +266,7 @@ namespace Obfuz.ObfusPasses.CallObfus
public void Done()
{
foreach (var allocator in GroupByModuleEntityManager.Ins.GetEntities<ModuleCallProxyAllocator>())
foreach (var allocator in _moduleEntityManager.GetEntities<ModuleCallProxyAllocator>())
{
allocator.Done();
}

View File

@ -13,12 +13,14 @@ namespace Obfuz.ObfusPasses.CallObfus
private readonly IEncryptor _encryptor;
private readonly ConstFieldAllocator _constFieldAllocator;
private readonly CallProxyAllocator _proxyCallAllocator;
private readonly GroupByModuleEntityManager _moduleEntityManager;
public DefaultCallProxyObfuscator(IRandom random, IEncryptor encryptor, ConstFieldAllocator constFieldAllocator, int encryptionLevel)
public DefaultCallProxyObfuscator(IRandom random, IEncryptor encryptor, ConstFieldAllocator constFieldAllocator, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
{
_encryptor = encryptor;
_constFieldAllocator = constFieldAllocator;
_proxyCallAllocator = new CallProxyAllocator(random, _encryptor, encryptionLevel);
_moduleEntityManager = moduleEntityManager;
_proxyCallAllocator = new CallProxyAllocator(random, _encryptor, moduleEntityManager, encryptionLevel);
}
public override void Done()
@ -31,7 +33,7 @@ namespace Obfuz.ObfusPasses.CallObfus
MethodSig sharedMethodSig = MetaUtil.ToSharedMethodSig(calledMethod.Module.CorLibTypes, MetaUtil.GetInflatedMethodSig(calledMethod));
ProxyCallMethodData proxyCallMethodData = _proxyCallAllocator.Allocate(callerMethod.Module, calledMethod, callVir);
DefaultMetadataImporter importer = GroupByModuleEntityManager.Ins.GetDefaultModuleMetadataImporter(callerMethod.Module);
DefaultMetadataImporter importer = _moduleEntityManager.GetDefaultModuleMetadataImporter(callerMethod.Module);
if (needCacheCall)
{

View File

@ -12,17 +12,18 @@ namespace Obfuz.ObfusPasses.CleanUp
{
public override ObfuscationPassType Type => ObfuscationPassType.None;
public override void Start(ObfuscationPassContext ctx)
public override void Start()
{
}
public override void Stop(ObfuscationPassContext ctx)
public override void Stop()
{
}
public override void Process(ObfuscationPassContext ctx)
public override void Process()
{
var ctx = ObfuscationPassContext.Current;
foreach (ModuleDef mod in ctx.toObfuscatedModules)
{
foreach (TypeDef type in mod.GetTypes())

View File

@ -27,13 +27,14 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
_encryptionLevel = settings.encryptionLevel;
}
public override void Start(ObfuscationPassContext ctx)
public override void Start()
{
var ctx = ObfuscationPassContext.Current;
_dataObfuscatorPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
_dataObfuscator = new DefaultConstEncryptor(ctx.random, ctx.encryptor, ctx.rvaDataAllocator, ctx.constFieldAllocator, _encryptionLevel);
_dataObfuscator = new DefaultConstEncryptor(ctx.random, ctx.encryptor, ctx.rvaDataAllocator, ctx.constFieldAllocator, ctx.moduleEntityManager, _encryptionLevel);
}
public override void Stop(ObfuscationPassContext ctx)
public override void Stop()
{
_dataObfuscator.Done();
}
@ -43,8 +44,6 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
return _dataObfuscatorPolicy.NeedObfuscateMethod(method);
}
private readonly HashSet<FieldDef> _encryptedRvaFields = new HashSet<FieldDef>();
protected override bool TryObfuscateInstruction(MethodDef method, Instruction inst, BasicBlock block, int instructionIndex, IList<Instruction> globalInstructions,
List<Instruction> outputInstructions, List<Instruction> totalFinalInstructions)
{

View File

@ -16,14 +16,16 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
private readonly RvaDataAllocator _rvaDataAllocator;
private readonly ConstFieldAllocator _constFieldAllocator;
private readonly IEncryptor _encryptor;
private readonly GroupByModuleEntityManager _moduleEntityManager;
private readonly int _encryptionLevel;
public DefaultConstEncryptor(IRandom random, IEncryptor encryptor, RvaDataAllocator rvaDataAllocator, ConstFieldAllocator constFieldAllocator, int encryptionLevel)
public DefaultConstEncryptor(IRandom random, IEncryptor encryptor, RvaDataAllocator rvaDataAllocator, ConstFieldAllocator constFieldAllocator, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
{
_random = random;
_encryptor = encryptor;
_rvaDataAllocator = rvaDataAllocator;
_constFieldAllocator = constFieldAllocator;
_moduleEntityManager = moduleEntityManager;
_encryptionLevel = encryptionLevel;
}
@ -39,7 +41,7 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
private DefaultMetadataImporter GetModuleMetadataImporter(MethodDef method)
{
return GroupByModuleEntityManager.Ins.GetDefaultModuleMetadataImporter(method.Module);
return _moduleEntityManager.GetDefaultModuleMetadataImporter(method.Module);
}
public void ObfuscateInt(MethodDef method, bool needCacheValue, int value, List<Instruction> obfuscatedInstructions)

View File

@ -12,12 +12,12 @@ namespace Obfuz.ObfusPasses.ExprObfus
{
public override ObfuscationPassType Type => ObfuscationPassType.ExprObfus;
public override void Start(ObfuscationPassContext ctx)
public override void Start()
{
}
public override void Stop(ObfuscationPassContext ctx)
public override void Stop()
{
}

View File

@ -14,18 +14,20 @@ namespace Obfuz.ObfusPasses.FieldEncrypt
{
private readonly IRandom _random;
private readonly IEncryptor _encryptor;
private readonly GroupByModuleEntityManager _moduleEntityManager;
private readonly int _encryptionLevel;
public DefaultFieldEncryptor(IRandom random, IEncryptor encryptor, int encryptionLevel)
public DefaultFieldEncryptor(IRandom random, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
{
_random = random;
_encryptor = encryptor;
_moduleEntityManager = moduleEntityManager;
_encryptionLevel = encryptionLevel;
}
private DefaultMetadataImporter GetMetadataImporter(MethodDef method)
{
return GroupByModuleEntityManager.Ins.GetDefaultModuleMetadataImporter(method.Module);
return _moduleEntityManager.GetDefaultModuleMetadataImporter(method.Module);
}
class FieldEncryptInfo

View File

@ -27,13 +27,14 @@ namespace Obfuz.ObfusPasses.FieldEncrypt
protected override bool NeedProcessNotObfuscatedAssembly => true;
public override void Start(ObfuscationPassContext ctx)
public override void Start()
{
_memoryEncryptor = new DefaultFieldEncryptor(ctx.random, ctx.encryptor, _encryptionLevel);
var ctx = ObfuscationPassContext.Current;
_memoryEncryptor = new DefaultFieldEncryptor(ctx.random, ctx.encryptor, ctx.moduleEntityManager, _encryptionLevel);
_encryptionPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
}
public override void Stop(ObfuscationPassContext ctx)
public override void Stop()
{
}

View File

@ -11,8 +11,9 @@ namespace Obfuz.ObfusPasses
protected abstract bool NeedObfuscateMethod(MethodDef method);
public override void Process(ObfuscationPassContext ctx)
public override void Process()
{
var ctx = ObfuscationPassContext.Current;
var modules = NeedProcessNotObfuscatedAssembly ? ctx.obfuscatedAndNotObfuscatedModules : ctx.toObfuscatedModules;
NotObfuscatedMethodWhiteList whiteList = ctx.whiteList;
ConfigurablePassPolicy passPolicy = ctx.passPolicy;

View File

@ -11,10 +11,10 @@ namespace Obfuz.ObfusPasses
return passType.HasFlag(Type);
}
public abstract void Start(ObfuscationPassContext ctx);
public abstract void Start();
public abstract void Stop(ObfuscationPassContext ctx);
public abstract void Stop();
public abstract void Process(ObfuscationPassContext ctx);
public abstract void Process();
}
}

View File

@ -18,17 +18,17 @@ namespace Obfuz.ObfusPasses.SymbolObfus
_symbolRename = new SymbolRename(settings);
}
public override void Start(ObfuscationPassContext ctx)
public override void Start()
{
_symbolRename.Init(ctx);
_symbolRename.Init();
}
public override void Stop(ObfuscationPassContext ctx)
public override void Stop()
{
_symbolRename.Save();
}
public override void Process(ObfuscationPassContext ctx)
public override void Process()
{
_symbolRename.Process();
}

View File

@ -63,8 +63,9 @@ namespace Obfuz.ObfusPasses.SymbolObfus
_nameMaker = settings.debug ? NameMakerFactory.CreateDebugNameMaker() : NameMakerFactory.CreateNameMakerBaseASCIICharSet(settings.obfuscatedNamePrefix);
}
public void Init(ObfuscationPassContext ctx)
public void Init()
{
var ctx = ObfuscationPassContext.Current;
_assemblyCache = ctx.assemblyCache;
_toObfuscatedModules = ctx.toObfuscatedModules;
_obfuscatedAndNotObfuscatedModules = ctx.obfuscatedAndNotObfuscatedModules;

View File

@ -1,5 +1,6 @@
using dnlib.DotNet;
using Obfuz.Data;
using Obfuz.Emit;
using Obfuz.ObfusPasses;
using Obfuz.ObfusPasses.SymbolObfus;
using Obfuz.Utils;
@ -14,6 +15,11 @@ namespace Obfuz
public class ObfuscationPassContext
{
public static ObfuscationPassContext Current { get; set; }
public GroupByModuleEntityManager moduleEntityManager;
public AssemblyCache assemblyCache;
public List<ModuleDef> toObfuscatedModules;

View File

@ -158,14 +158,14 @@ namespace Obfuz
List<ModuleDef> toObfuscatedModules = new List<ModuleDef>();
List<ModuleDef> obfuscatedAndNotObfuscatedModules = new List<ModuleDef>();
GroupByModuleEntityManager.Reset();
LoadAssemblies(assemblyCache, toObfuscatedModules, obfuscatedAndNotObfuscatedModules);
var random = new RandomWithKey(_secret, _randomSeed);
var encryptor = CreateEncryptionVirtualMachine();
var rvaDataAllocator = new RvaDataAllocator(random, encryptor);
var constFieldAllocator = new ConstFieldAllocator(encryptor, random, rvaDataAllocator);
var moduleEntityManager = new GroupByModuleEntityManager();
var rvaDataAllocator = new RvaDataAllocator(random, encryptor, moduleEntityManager);
var constFieldAllocator = new ConstFieldAllocator(encryptor, random, rvaDataAllocator, moduleEntityManager);
_ctx = new ObfuscationPassContext
{
assemblyCache = assemblyCache,
@ -174,6 +174,7 @@ namespace Obfuz
toObfuscatedAssemblyNames = _toObfuscatedAssemblyNames,
notObfuscatedAssemblyNamesReferencingObfuscated = _notObfuscatedAssemblyNamesReferencingObfuscated,
obfuscatedAssemblyOutputDir = _obfuscatedAssemblyOutputDir,
moduleEntityManager = moduleEntityManager,
random = random,
encryptor = encryptor,
@ -182,7 +183,8 @@ namespace Obfuz
whiteList = new NotObfuscatedMethodWhiteList(),
passPolicy = _passPolicy,
};
pipeline.Start(_ctx);
ObfuscationPassContext.Current = _ctx;
pipeline.Start();
}
private void LoadAssemblies(AssemblyCache assemblyCache, List<ModuleDef> toObfuscatedModules, List<ModuleDef> obfuscatedAndNotObfuscatedModules)
@ -216,13 +218,12 @@ namespace Obfuz
private void DoObfuscation(Pipeline pipeline)
{
pipeline.Run(_ctx);
pipeline.Run();
}
private void OnPostObfuscation(Pipeline pipeline)
{
pipeline.Stop(_ctx);
pipeline.Stop();
WriteAssemblies();
}
}

View File

@ -15,28 +15,28 @@ namespace Obfuz
return this;
}
public void Start(ObfuscationPassContext ctx)
public void Start()
{
foreach (var pass in _passes)
{
pass.Start(ctx);
pass.Start();
}
}
public void Stop(ObfuscationPassContext ctx)
public void Stop()
{
foreach (var pass in _passes)
{
pass.Stop(ctx);
pass.Stop();
}
}
public void Run(ObfuscationPassContext ctx)
public void Run()
{
foreach (var pass in _passes)
{
pass.Process(ctx);
pass.Process();
}
}
}