修复rename Custom中枚举类型的bug

backup
walon 2025-04-13 10:31:55 +08:00
parent b3ccb26003
commit 8b082a0905
3 changed files with 63 additions and 6 deletions

View File

@ -24,7 +24,7 @@ namespace Obfuz
_assemblyPathResolver = assemblyResolver; _assemblyPathResolver = assemblyResolver;
_modCtx = ModuleDef.CreateModuleContext(); _modCtx = ModuleDef.CreateModuleContext();
_asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver; _asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver;
_asmResolver.EnableTypeDefCache = true; _asmResolver.EnableTypeDefCache = false;
_asmResolver.UseGAC = false; _asmResolver.UseGAC = false;
} }
@ -67,7 +67,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 = true; mod.EnableTypeDefFindCache = false;
_asmResolver.AddToCache(mod); _asmResolver.AddToCache(mod);
return mod; return mod;
} }

View File

@ -1,7 +1,9 @@
{ {
"name": "Obfuz.Editor", "name": "Obfuz.Editor",
"rootNamespace": "", "rootNamespace": "",
"references": [], "references": [
"GUID:167b4b7f91c16bb4183f7298af665076"
],
"includePlatforms": [ "includePlatforms": [
"Editor" "Editor"
], ],

View File

@ -380,6 +380,7 @@ namespace Obfuz
{ {
return null; return null;
} }
string typeName = oldValue.GetType().FullName;
if (oldValue.GetType().IsPrimitive) if (oldValue.GetType().IsPrimitive)
{ {
return oldValue; return oldValue;
@ -436,6 +437,23 @@ namespace Obfuz
return false; return false;
} }
private bool TryRenameArgument(ModuleDefMD mod, string oldFullName, CANamedArgument oldArg)
{
bool anyChange = false;
TypeSig newType = RenameTypeSig(oldArg.Type, mod, oldFullName);
if (newType != oldArg.Type)
{
anyChange = true;
oldArg.Type = newType;
}
if (TryRenameArgument(mod, oldFullName, oldArg.Argument, out var newArg))
{
oldArg.Argument = newArg;
anyChange = true;
}
return anyChange;
}
private void RenameTypeRefInCustomAttribute(ModuleDefMD referenceMeMod, ModuleDefMD mod, TypeDef typeDef, string oldFullName) private void RenameTypeRefInCustomAttribute(ModuleDefMD referenceMeMod, ModuleDefMD mod, TypeDef typeDef, string oldFullName)
{ {
List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod]; List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
@ -460,10 +478,36 @@ namespace Obfuz
for (int i = 0; i < cai.namedArguments.Count; i++) for (int i = 0; i < cai.namedArguments.Count; i++)
{ {
CANamedArgument oldArg = cai.namedArguments[i]; CANamedArgument oldArg = cai.namedArguments[i];
if (TryRenameArgument(mod, oldFullName, oldArg.Argument, out var newArg)) if (TryRenameArgument(mod, oldFullName, oldArg))
{ {
anyChange = true; anyChange = true;
oldArg.Argument = newArg; }
}
}
if (anyChange)
{
cai.customAttributes[cai.index] = new CustomAttribute(oldAttr.Constructor,
cai.arguments != null ? cai.arguments : oldAttr.ConstructorArguments,
cai.namedArguments != null ? cai.namedArguments : oldAttr.NamedArguments);
}
}
}
private void RenameFieldNameInCustomAttributes(ModuleDefMD referenceMeMod, ModuleDefMD mod, string oldFieldOrPropertyName, string newName)
{
List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
foreach (CustomAttributeInfo cai in customAttributes)
{
CustomAttribute oldAttr = cai.customAttributes[cai.index];
bool anyChange = false;
if (cai.namedArguments != null)
{
foreach (CANamedArgument arg in cai.namedArguments)
{
if (arg.Name == oldFieldOrPropertyName)
{
anyChange = true;
arg.Name = newName;
} }
} }
} }
@ -528,8 +572,12 @@ 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);
} }
field.Name = newName; field.Name = newName;
Debug.Log($"rename field. {field} => {newName}"); Debug.Log($"rename field. {field} => {newName}");
} }
@ -549,7 +597,14 @@ namespace Obfuz
private void Rename(PropertyDef property) private void Rename(PropertyDef property)
{ {
property.Name = _nameMaker.GetNewName(property, property.Name); 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);
}
} }
} }
} }