- 修复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 IAssemblyResolver _assemblyPathResolver;
private readonly ModuleContext _modCtx; private readonly ModuleContext _modCtx;
private readonly AssemblyResolver _asmResolver; private readonly AssemblyResolver _asmResolver;
private bool _enableTypeDefCache;
public ModuleContext ModCtx => _modCtx; public ModuleContext ModCtx => _modCtx;
@ -21,13 +22,28 @@ namespace Obfuz
public AssemblyCache(IAssemblyResolver assemblyResolver) public AssemblyCache(IAssemblyResolver assemblyResolver)
{ {
_enableTypeDefCache = true;
_assemblyPathResolver = assemblyResolver; _assemblyPathResolver = assemblyResolver;
_modCtx = ModuleDef.CreateModuleContext(); _modCtx = ModuleDef.CreateModuleContext();
_asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver; _asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver;
_asmResolver.EnableTypeDefCache = false; _asmResolver.EnableTypeDefCache = _enableTypeDefCache;
_asmResolver.UseGAC = false; _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) public ModuleDefMD TryLoadModule(string moduleName)
{ {
@ -67,7 +83,7 @@ namespace Obfuz
{ {
//Debug.Log($"do load module:{dllPath}"); //Debug.Log($"do load module:{dllPath}");
ModuleDefMD mod = ModuleDefMD.Load(File.ReadAllBytes(dllPath), _modCtx); ModuleDefMD mod = ModuleDefMD.Load(File.ReadAllBytes(dllPath), _modCtx);
mod.EnableTypeDefFindCache = false; mod.EnableTypeDefFindCache = _enableTypeDefCache;
_asmResolver.AddToCache(mod); _asmResolver.AddToCache(mod);
return mod; return mod;
} }

View File

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

View File

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

View File

@ -146,6 +146,7 @@ namespace Obfuz
private void RenameTypes() private void RenameTypes()
{ {
Debug.Log("RenameTypes begin"); Debug.Log("RenameTypes begin");
_ctx.assemblyCache.EnableTypeDefCache = false;
foreach (ObfuzAssemblyInfo ass in _ctx.assemblies) foreach (ObfuzAssemblyInfo ass in _ctx.assemblies)
{ {
foreach (TypeDef type in ass.module.GetTypes()) foreach (TypeDef type in ass.module.GetTypes())
@ -160,6 +161,7 @@ namespace Obfuz
} }
} }
} }
_ctx.assemblyCache.EnableTypeDefCache = true;
Debug.Log("Rename Types end"); 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]; List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
foreach (CustomAttributeInfo cai in customAttributes) foreach (CustomAttributeInfo cai in customAttributes)
{ {
CustomAttribute oldAttr = cai.customAttributes[cai.index]; CustomAttribute oldAttr = cai.customAttributes[cai.index];
if (MetaUtil.GetTypeDefOrGenericTypeBase(oldAttr.Constructor.DeclaringType) != declaringType)
{
continue;
}
bool anyChange = false; bool anyChange = false;
if (cai.namedArguments != null) if (cai.namedArguments != null)
{ {
@ -703,7 +709,7 @@ namespace Obfuz
Debug.Log($"rename assembly:{ass.name} field:{oldFieldFullName} => {memberRef}"); 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}"); Debug.Log($"rename field. {field} => {newName}");
field.Name = newName; field.Name = newName;
@ -822,12 +828,12 @@ namespace Obfuz
{ {
string oldName = property.Name; string oldName = property.Name;
string newName = _nameMaker.GetNewName(property, oldName); string newName = _nameMaker.GetNewName(property, oldName);
property.Name = newName;
ModuleDefMD mod = (ModuleDefMD)property.DeclaringType.Module; ModuleDefMD mod = (ModuleDefMD)property.DeclaringType.Module;
foreach (ObfuzAssemblyInfo ass in GetReferenceMeAssemblies(mod)) 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); _renameRecordMap.AddRenameRecord(property, oldName, newName);
} }
} }