重构Rename FieldDef
parent
43f3666507
commit
99034725d1
|
@ -40,7 +40,7 @@ namespace Obfuz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TypeDef GetTypeDefOrGenericTypeBase(ITypeDefOrRef type)
|
public static TypeDef GetTypeDefOrGenericTypeBaseThrowException(ITypeDefOrRef type)
|
||||||
{
|
{
|
||||||
if (type.IsTypeDef)
|
if (type.IsTypeDef)
|
||||||
{
|
{
|
||||||
|
@ -58,6 +58,42 @@ namespace Obfuz
|
||||||
throw new NotSupportedException($"{type}");
|
throw new NotSupportedException($"{type}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static TypeDef GetTypeDefOrGenericTypeBaseOrNull(ITypeDefOrRef type)
|
||||||
|
{
|
||||||
|
if (type.IsTypeDef)
|
||||||
|
{
|
||||||
|
return (TypeDef)type;
|
||||||
|
}
|
||||||
|
if (type.IsTypeRef)
|
||||||
|
{
|
||||||
|
return type.ResolveTypeDefThrow();
|
||||||
|
}
|
||||||
|
if (type.IsTypeSpec)
|
||||||
|
{
|
||||||
|
GenericInstSig gis = type.TryGetGenericInstSig();
|
||||||
|
return gis.GenericType.ToTypeDefOrRef().ResolveTypeDefThrow();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TypeDef GetMemberRefTypeDefParentOrNull(IMemberRefParent parent)
|
||||||
|
{
|
||||||
|
if (parent is TypeDef typeDef)
|
||||||
|
{
|
||||||
|
return typeDef;
|
||||||
|
}
|
||||||
|
if (parent is TypeRef typeRef)
|
||||||
|
{
|
||||||
|
return typeRef.ResolveTypeDefThrow();
|
||||||
|
}
|
||||||
|
if (parent is TypeSpec typeSpec)
|
||||||
|
{
|
||||||
|
GenericInstSig genericIns = typeSpec.TypeSig.ToGenericInstSig();
|
||||||
|
return genericIns.GenericType.TypeDefOrRef.ResolveTypeDefThrow();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static bool IsInheritFromUnityObject(TypeDef typeDef)
|
public static bool IsInheritFromUnityObject(TypeDef typeDef)
|
||||||
{
|
{
|
||||||
TypeDef cur = typeDef;
|
TypeDef cur = typeDef;
|
||||||
|
|
|
@ -167,6 +167,18 @@ namespace Obfuz
|
||||||
typeDefMetas.typeRefs.Add(typeRef);
|
typeDefMetas.typeRefs.Add(typeRef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (CustomAttributeInfo cai in _customAttributeArgumentsWithTypeByMods.Values.SelectMany(cas => cas))
|
||||||
|
{
|
||||||
|
CustomAttribute ca = cai.customAttributes[cai.index];
|
||||||
|
TypeDef typeDef = MetaUtil.GetTypeDefOrGenericTypeBaseThrowException(ca.Constructor.DeclaringType);
|
||||||
|
if (!refTypeDefMetasMap.TryGetValue(typeDef, out var typeDefMetas))
|
||||||
|
{
|
||||||
|
typeDefMetas = new RefTypeDefMetas();
|
||||||
|
refTypeDefMetasMap.Add(typeDef, typeDefMetas);
|
||||||
|
}
|
||||||
|
typeDefMetas.customAttributes.Add(ca);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RetargetTypeRefInCustomAttributes()
|
private void RetargetTypeRefInCustomAttributes()
|
||||||
|
@ -206,14 +218,15 @@ namespace Obfuz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly Dictionary<TypeDef, RefTypeDefMetas> _refTypeRefMetasMap = new Dictionary<TypeDef, RefTypeDefMetas>();
|
||||||
|
|
||||||
private void RenameTypes()
|
private void RenameTypes()
|
||||||
{
|
{
|
||||||
Debug.Log("RenameTypes begin");
|
Debug.Log("RenameTypes begin");
|
||||||
|
|
||||||
RetargetTypeRefInCustomAttributes();
|
RetargetTypeRefInCustomAttributes();
|
||||||
|
|
||||||
var refTypeDefMetasMap = new Dictionary<TypeDef, RefTypeDefMetas>();
|
BuildRefTypeDefMetasMap(_refTypeRefMetasMap);
|
||||||
BuildRefTypeDefMetasMap(refTypeDefMetasMap);
|
|
||||||
_ctx.assemblyCache.EnableTypeDefCache = false;
|
_ctx.assemblyCache.EnableTypeDefCache = false;
|
||||||
|
|
||||||
foreach (ObfuzAssemblyInfo ass in _ctx.assemblies)
|
foreach (ObfuzAssemblyInfo ass in _ctx.assemblies)
|
||||||
|
@ -222,7 +235,7 @@ namespace Obfuz
|
||||||
{
|
{
|
||||||
if (_renamePolicy.NeedRename(type))
|
if (_renamePolicy.NeedRename(type))
|
||||||
{
|
{
|
||||||
Rename(type, refTypeDefMetasMap.TryGetValue(type, out var typeDefMetas) ? typeDefMetas : null);
|
Rename(type, _refTypeRefMetasMap.TryGetValue(type, out var typeDefMetas) ? typeDefMetas : null);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -236,9 +249,93 @@ namespace Obfuz
|
||||||
Debug.Log("Rename Types end");
|
Debug.Log("Rename Types end");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class RefFieldMetas
|
||||||
|
{
|
||||||
|
public readonly List<MemberRef> fieldRefs = new List<MemberRef>();
|
||||||
|
public readonly List<CustomAttribute> customAttributes = new List<CustomAttribute>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void BuildHierarchyFields(TypeDef type, List<FieldDef> fields)
|
||||||
|
{
|
||||||
|
while (type != null)
|
||||||
|
{
|
||||||
|
fields.AddRange(type.Fields);
|
||||||
|
type = MetaUtil.GetBaseTypeDef(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BuildRefFieldMetasMap(Dictionary<FieldDef, RefFieldMetas> refFieldMetasMap)
|
||||||
|
{
|
||||||
|
foreach (ObfuzAssemblyInfo ass in _ctx.assemblies)
|
||||||
|
{
|
||||||
|
foreach (MemberRef memberRef in ass.module.GetMemberRefs())
|
||||||
|
{
|
||||||
|
if (!memberRef.IsFieldRef)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMemberRefParent parent = memberRef.Class;
|
||||||
|
TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent);
|
||||||
|
if (parentTypeDef == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foreach (FieldDef field in parentTypeDef.Fields)
|
||||||
|
{
|
||||||
|
if (field.Name == memberRef.Name && TypeEqualityComparer.Instance.Equals(field.FieldSig.Type, memberRef.FieldSig.Type))
|
||||||
|
{
|
||||||
|
if (!refFieldMetasMap.TryGetValue(field, out var fieldMetas))
|
||||||
|
{
|
||||||
|
fieldMetas = new RefFieldMetas();
|
||||||
|
refFieldMetasMap.Add(field, fieldMetas);
|
||||||
|
}
|
||||||
|
fieldMetas.fieldRefs.Add(memberRef);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var e in _refTypeRefMetasMap)
|
||||||
|
{
|
||||||
|
TypeDef typeDef = e.Key;
|
||||||
|
var hierarchyFields = new List<FieldDef>();
|
||||||
|
BuildHierarchyFields(typeDef, hierarchyFields);
|
||||||
|
RefTypeDefMetas typeDefMetas = e.Value;
|
||||||
|
foreach (CustomAttribute ca in typeDefMetas.customAttributes)
|
||||||
|
{
|
||||||
|
foreach (var arg in ca.NamedArguments)
|
||||||
|
{
|
||||||
|
if (arg.IsProperty)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foreach (FieldDef field in hierarchyFields)
|
||||||
|
{
|
||||||
|
if (field.Name == arg.Name)
|
||||||
|
{
|
||||||
|
if (!refFieldMetasMap.TryGetValue(field, out var fieldMetas))
|
||||||
|
{
|
||||||
|
fieldMetas = new RefFieldMetas();
|
||||||
|
refFieldMetasMap.Add(field, fieldMetas);
|
||||||
|
}
|
||||||
|
fieldMetas.customAttributes.Add(ca);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void RenameFields()
|
private void RenameFields()
|
||||||
{
|
{
|
||||||
Debug.Log("Rename fields begin");
|
Debug.Log("Rename fields begin");
|
||||||
|
var refFieldMetasMap = new Dictionary<FieldDef, RefFieldMetas>();
|
||||||
|
BuildRefFieldMetasMap(refFieldMetasMap);
|
||||||
|
|
||||||
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())
|
||||||
|
@ -247,7 +344,7 @@ namespace Obfuz
|
||||||
{
|
{
|
||||||
if (_renamePolicy.NeedRename(field))
|
if (_renamePolicy.NeedRename(field))
|
||||||
{
|
{
|
||||||
Rename(field);
|
Rename(field, refFieldMetasMap.TryGetValue(field, out var fieldMetas) ? fieldMetas : null);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -416,13 +513,6 @@ namespace Obfuz
|
||||||
string oldName = type.Name;
|
string oldName = type.Name;
|
||||||
string newName = _nameMaker.GetNewName(type, oldName);
|
string newName = _nameMaker.GetNewName(type, oldName);
|
||||||
|
|
||||||
ModuleDefMD mod = (ModuleDefMD)type.Module;
|
|
||||||
//RenameTypeRefInCustomAttribute(mod, type, oldFullName, null);
|
|
||||||
//foreach (ObfuzAssemblyInfo ass in GetReferenceMeAssemblies(mod))
|
|
||||||
//{
|
|
||||||
// RenameTypeRefInCustomAttribute(ass.module, mod, type, oldFullName);
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (refTypeDefMeta != null)
|
if (refTypeDefMeta != null)
|
||||||
{
|
{
|
||||||
foreach (TypeRef typeRef in refTypeDefMeta.typeRefs)
|
foreach (TypeRef typeRef in refTypeDefMeta.typeRefs)
|
||||||
|
@ -450,7 +540,7 @@ namespace Obfuz
|
||||||
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)
|
if (MetaUtil.GetTypeDefOrGenericTypeBaseThrowException(oldAttr.Constructor.DeclaringType) != declaringType)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -475,60 +565,27 @@ namespace Obfuz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Rename(FieldDef field)
|
private void Rename(FieldDef field, RefFieldMetas fieldMetas)
|
||||||
{
|
{
|
||||||
string oldName = field.Name;
|
string oldName = field.Name;
|
||||||
string newName = _nameMaker.GetNewName(field, oldName);
|
string newName = _nameMaker.GetNewName(field, oldName);
|
||||||
foreach (ObfuzAssemblyInfo ass in GetReferenceMeAssemblies(field.DeclaringType.Module))
|
if (fieldMetas != null)
|
||||||
{
|
{
|
||||||
foreach (MemberRef memberRef in ass.module.GetMemberRefs())
|
foreach (var memberRef in fieldMetas.fieldRefs)
|
||||||
{
|
{
|
||||||
if (!memberRef.IsFieldRef)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (oldName != memberRef.Name || !TypeEqualityComparer.Instance.Equals(memberRef.FieldSig.Type, field.FieldSig.Type))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
IMemberRefParent parent = memberRef.Class;
|
|
||||||
if (parent is ITypeDefOrRef typeDefOrRef)
|
|
||||||
{
|
|
||||||
if (typeDefOrRef.IsTypeDef)
|
|
||||||
{
|
|
||||||
if (typeDefOrRef != field.DeclaringType)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (typeDefOrRef.IsTypeRef)
|
|
||||||
{
|
|
||||||
if (typeDefOrRef.ResolveTypeDefThrow() != field.DeclaringType)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (typeDefOrRef.IsTypeSpec)
|
|
||||||
{
|
|
||||||
var typeSpec = (TypeSpec)typeDefOrRef;
|
|
||||||
GenericInstSig gis = typeSpec.TryGetGenericInstSig();
|
|
||||||
if (gis == null || gis.GenericType.ToTypeDefOrRef().ResolveTypeDef() != field.DeclaringType)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
string oldFieldFullName = memberRef.ToString();
|
|
||||||
memberRef.Name = newName;
|
memberRef.Name = newName;
|
||||||
|
Debug.Log($"rename assembly:{memberRef.Module.Name} reference {field.FullName} => {memberRef.FullName}");
|
||||||
Debug.Log($"rename assembly:{ass.name} field:{oldFieldFullName} => {memberRef}");
|
}
|
||||||
|
foreach (var ca in fieldMetas.customAttributes)
|
||||||
|
{
|
||||||
|
foreach (var arg in ca.NamedArguments)
|
||||||
|
{
|
||||||
|
if (arg.Name == oldName)
|
||||||
|
{
|
||||||
|
arg.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;
|
||||||
|
|
|
@ -62,12 +62,12 @@ namespace Obfuz.Rename
|
||||||
|
|
||||||
if (typeDef.BaseType != null)
|
if (typeDef.BaseType != null)
|
||||||
{
|
{
|
||||||
TypeDef baseTypeDef = MetaUtil.GetTypeDefOrGenericTypeBase(typeDef.BaseType);
|
TypeDef baseTypeDef = MetaUtil.GetTypeDefOrGenericTypeBaseThrowException(typeDef.BaseType);
|
||||||
CalculateType(baseTypeDef);
|
CalculateType(baseTypeDef);
|
||||||
typeMethods.flatMethods.AddRange(_visitedTypes[baseTypeDef].flatMethods);
|
typeMethods.flatMethods.AddRange(_visitedTypes[baseTypeDef].flatMethods);
|
||||||
foreach (var intfType in typeDef.Interfaces)
|
foreach (var intfType in typeDef.Interfaces)
|
||||||
{
|
{
|
||||||
TypeDef intfTypeDef = MetaUtil.GetTypeDefOrGenericTypeBase(intfType.Interface);
|
TypeDef intfTypeDef = MetaUtil.GetTypeDefOrGenericTypeBaseThrowException(intfType.Interface);
|
||||||
CalculateType(intfTypeDef);
|
CalculateType(intfTypeDef);
|
||||||
typeMethods.flatMethods.AddRange(_visitedTypes[intfTypeDef].flatMethods);
|
typeMethods.flatMethods.AddRange(_visitedTypes[intfTypeDef].flatMethods);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue