- 修复Rename field或property时没有检查CustomAttribute的constructor的declaring type是否匹配的bug

- Rename TypeDef之后开启TypeDefCache
backup
walon 2025-04-15 10:46:03 +08:00
parent 12a290a0c7
commit 6d150ac278
4 changed files with 31 additions and 6 deletions

View File

@ -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;
}

View File

@ -78,6 +78,7 @@ namespace Obfuz
{
var ctx = new ObfuscatorContext
{
assemblyCache = _assemblyCache,
assemblies = _obfuzAssemblies,
renamePolicy = _renamePolicy,
nameMaker = _nameMaker,

View File

@ -19,6 +19,8 @@ namespace Obfuz
public class ObfuscatorContext
{
public AssemblyCache assemblyCache;
public List<ObfuzAssemblyInfo> assemblies;
public IRenamePolicy renamePolicy;

View File

@ -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<CustomAttributeInfo> 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);
}
}