diff --git a/Editor/AssemblyCache.cs b/Editor/AssemblyCache.cs index 91e388d..7a90557 100644 --- a/Editor/AssemblyCache.cs +++ b/Editor/AssemblyCache.cs @@ -13,6 +13,7 @@ namespace Obfuz private readonly IAssemblyResolver _assemblyPathResolver; private readonly ModuleContext _modCtx; private readonly AssemblyResolver _asmResolver; + private bool _enableTypeDefCache; public ModuleContext ModCtx => _modCtx; @@ -21,13 +22,28 @@ namespace Obfuz public AssemblyCache(IAssemblyResolver assemblyResolver) { + _enableTypeDefCache = true; _assemblyPathResolver = assemblyResolver; _modCtx = ModuleDef.CreateModuleContext(); _asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver; - _asmResolver.EnableTypeDefCache = false; + _asmResolver.EnableTypeDefCache = _enableTypeDefCache; _asmResolver.UseGAC = false; } + public bool EnableTypeDefCache + { + get => _enableTypeDefCache; + set + { + _enableTypeDefCache = value; + _asmResolver.EnableTypeDefCache = value; + foreach (var mod in LoadedModules.Values) + { + mod.EnableTypeDefFindCache = value; + } + } + } + public ModuleDefMD TryLoadModule(string moduleName) { @@ -67,7 +83,7 @@ namespace Obfuz { //Debug.Log($"do load module:{dllPath}"); ModuleDefMD mod = ModuleDefMD.Load(File.ReadAllBytes(dllPath), _modCtx); - mod.EnableTypeDefFindCache = false; + mod.EnableTypeDefFindCache = _enableTypeDefCache; _asmResolver.AddToCache(mod); return mod; } diff --git a/Editor/Obfuscator.cs b/Editor/Obfuscator.cs index f73321a..fb2e450 100644 --- a/Editor/Obfuscator.cs +++ b/Editor/Obfuscator.cs @@ -78,6 +78,7 @@ namespace Obfuz { var ctx = new ObfuscatorContext { + assemblyCache = _assemblyCache, assemblies = _obfuzAssemblies, renamePolicy = _renamePolicy, nameMaker = _nameMaker, diff --git a/Editor/ObfuscatorContext.cs b/Editor/ObfuscatorContext.cs index b62a0a0..fa8e2d3 100644 --- a/Editor/ObfuscatorContext.cs +++ b/Editor/ObfuscatorContext.cs @@ -19,6 +19,8 @@ namespace Obfuz public class ObfuscatorContext { + public AssemblyCache assemblyCache; + public List assemblies; public IRenamePolicy renamePolicy; diff --git a/Editor/Rename/SymbolRename.cs b/Editor/Rename/SymbolRename.cs index 336dd50..1f41aeb 100644 --- a/Editor/Rename/SymbolRename.cs +++ b/Editor/Rename/SymbolRename.cs @@ -146,6 +146,7 @@ namespace Obfuz private void RenameTypes() { Debug.Log("RenameTypes begin"); + _ctx.assemblyCache.EnableTypeDefCache = false; foreach (ObfuzAssemblyInfo ass in _ctx.assemblies) { foreach (TypeDef type in ass.module.GetTypes()) @@ -160,6 +161,7 @@ namespace Obfuz } } } + _ctx.assemblyCache.EnableTypeDefCache = true; Debug.Log("Rename Types end"); } @@ -623,12 +625,16 @@ namespace Obfuz } } - private void RenameFieldNameInCustomAttributes(ModuleDefMD referenceMeMod, ModuleDefMD mod, string oldFieldOrPropertyName, string newName) + private void RenameFieldNameInCustomAttributes(ModuleDefMD referenceMeMod, ModuleDefMD mod, TypeDef declaringType, string oldFieldOrPropertyName, string newName) { List customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod]; foreach (CustomAttributeInfo cai in customAttributes) { CustomAttribute oldAttr = cai.customAttributes[cai.index]; + if (MetaUtil.GetTypeDefOrGenericTypeBase(oldAttr.Constructor.DeclaringType) != declaringType) + { + continue; + } bool anyChange = false; if (cai.namedArguments != null) { @@ -703,7 +709,7 @@ namespace Obfuz Debug.Log($"rename assembly:{ass.name} field:{oldFieldFullName} => {memberRef}"); } - RenameFieldNameInCustomAttributes(ass.module, (ModuleDefMD)field.DeclaringType.Module, field.Name, newName); + RenameFieldNameInCustomAttributes(ass.module, (ModuleDefMD)field.DeclaringType.Module, field.DeclaringType, field.Name, newName); } Debug.Log($"rename field. {field} => {newName}"); field.Name = newName; @@ -822,12 +828,12 @@ namespace Obfuz { string oldName = property.Name; string newName = _nameMaker.GetNewName(property, oldName); - property.Name = newName; ModuleDefMD mod = (ModuleDefMD)property.DeclaringType.Module; foreach (ObfuzAssemblyInfo ass in GetReferenceMeAssemblies(mod)) { - RenameFieldNameInCustomAttributes(ass.module, mod, oldName, newName); + RenameFieldNameInCustomAttributes(ass.module, mod, property.DeclaringType, oldName, newName); } + property.Name = newName; _renameRecordMap.AddRenameRecord(property, oldName, newName); } }