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

View File

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

View File

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

View File

@ -11,10 +11,10 @@ namespace Obfuz
{ {
ObfuscationPassType Type { get; } 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); protected abstract bool NeedObfuscateMethod(MethodDef method);
public override void Process(ObfuscationPassContext ctx) public override void Process()
{ {
var ctx = ObfuscationPassContext.Current;
NotObfuscatedMethodWhiteList whiteList = ctx.whiteList; NotObfuscatedMethodWhiteList whiteList = ctx.whiteList;
ConfigurablePassPolicy passPolicy = ctx.passPolicy; ConfigurablePassPolicy passPolicy = ctx.passPolicy;
foreach (ModuleDef mod in ctx.toObfuscatedModules) foreach (ModuleDef mod in ctx.toObfuscatedModules)

View File

@ -30,16 +30,17 @@ namespace Obfuz.ObfusPasses.CallObfus
_obfuscationLevel = settings.callObfuscationLevel; _obfuscationLevel = settings.callObfuscationLevel;
} }
public override void Stop(ObfuscationPassContext ctx) public override void Stop()
{ {
_dynamicProxyObfuscator.Done(); _dynamicProxyObfuscator.Done();
} }
public override void Start(ObfuscationPassContext ctx) public override void Start()
{ {
var ctx = ObfuscationPassContext.Current;
_random = ctx.random; _random = ctx.random;
_encryptor = ctx.encryptor; _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); _dynamicProxyPolicy = new ConfigurableObfuscationPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
} }

View File

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

View File

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

View File

@ -12,17 +12,18 @@ namespace Obfuz.ObfusPasses.CleanUp
{ {
public override ObfuscationPassType Type => ObfuscationPassType.None; 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 (ModuleDef mod in ctx.toObfuscatedModules)
{ {
foreach (TypeDef type in mod.GetTypes()) foreach (TypeDef type in mod.GetTypes())

View File

@ -27,13 +27,14 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
_encryptionLevel = settings.encryptionLevel; _encryptionLevel = settings.encryptionLevel;
} }
public override void Start(ObfuscationPassContext ctx) public override void Start()
{ {
var ctx = ObfuscationPassContext.Current;
_dataObfuscatorPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles); _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(); _dataObfuscator.Done();
} }
@ -43,8 +44,6 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
return _dataObfuscatorPolicy.NeedObfuscateMethod(method); 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, protected override bool TryObfuscateInstruction(MethodDef method, Instruction inst, BasicBlock block, int instructionIndex, IList<Instruction> globalInstructions,
List<Instruction> outputInstructions, List<Instruction> totalFinalInstructions) List<Instruction> outputInstructions, List<Instruction> totalFinalInstructions)
{ {

View File

@ -16,14 +16,16 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
private readonly RvaDataAllocator _rvaDataAllocator; private readonly RvaDataAllocator _rvaDataAllocator;
private readonly ConstFieldAllocator _constFieldAllocator; private readonly ConstFieldAllocator _constFieldAllocator;
private readonly IEncryptor _encryptor; private readonly IEncryptor _encryptor;
private readonly GroupByModuleEntityManager _moduleEntityManager;
private readonly int _encryptionLevel; 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; _random = random;
_encryptor = encryptor; _encryptor = encryptor;
_rvaDataAllocator = rvaDataAllocator; _rvaDataAllocator = rvaDataAllocator;
_constFieldAllocator = constFieldAllocator; _constFieldAllocator = constFieldAllocator;
_moduleEntityManager = moduleEntityManager;
_encryptionLevel = encryptionLevel; _encryptionLevel = encryptionLevel;
} }
@ -39,7 +41,7 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
private DefaultMetadataImporter GetModuleMetadataImporter(MethodDef method) 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) 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 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 IRandom _random;
private readonly IEncryptor _encryptor; private readonly IEncryptor _encryptor;
private readonly GroupByModuleEntityManager _moduleEntityManager;
private readonly int _encryptionLevel; private readonly int _encryptionLevel;
public DefaultFieldEncryptor(IRandom random, IEncryptor encryptor, int encryptionLevel) public DefaultFieldEncryptor(IRandom random, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
{ {
_random = random; _random = random;
_encryptor = encryptor; _encryptor = encryptor;
_moduleEntityManager = moduleEntityManager;
_encryptionLevel = encryptionLevel; _encryptionLevel = encryptionLevel;
} }
private DefaultMetadataImporter GetMetadataImporter(MethodDef method) private DefaultMetadataImporter GetMetadataImporter(MethodDef method)
{ {
return GroupByModuleEntityManager.Ins.GetDefaultModuleMetadataImporter(method.Module); return _moduleEntityManager.GetDefaultModuleMetadataImporter(method.Module);
} }
class FieldEncryptInfo class FieldEncryptInfo

View File

@ -27,13 +27,14 @@ namespace Obfuz.ObfusPasses.FieldEncrypt
protected override bool NeedProcessNotObfuscatedAssembly => true; 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); _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); 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; var modules = NeedProcessNotObfuscatedAssembly ? ctx.obfuscatedAndNotObfuscatedModules : ctx.toObfuscatedModules;
NotObfuscatedMethodWhiteList whiteList = ctx.whiteList; NotObfuscatedMethodWhiteList whiteList = ctx.whiteList;
ConfigurablePassPolicy passPolicy = ctx.passPolicy; ConfigurablePassPolicy passPolicy = ctx.passPolicy;

View File

@ -11,10 +11,10 @@ namespace Obfuz.ObfusPasses
return passType.HasFlag(Type); 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); _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(); _symbolRename.Save();
} }
public override void Process(ObfuscationPassContext ctx) public override void Process()
{ {
_symbolRename.Process(); _symbolRename.Process();
} }

View File

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

View File

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

View File

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

View File

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