提交RenameRecordMap

backup
walon 2025-04-13 21:20:58 +08:00
parent 13b032fde8
commit 225c613763
3 changed files with 193 additions and 21 deletions

View File

@ -164,5 +164,10 @@ namespace Obfuz
}
return false;
}
public static bool MayRenameCustomDataType(ElementType type)
{
return type == ElementType.Class || type == ElementType.ValueType || type == ElementType.Object || type == ElementType.SZArray;
}
}
}

View File

@ -0,0 +1,150 @@
using dnlib.DotNet;
using System.Collections.Generic;
namespace Obfuz
{
public class RenameRecordMap
{
private enum RenameStatus
{
NotRenamed,
Renamed,
}
private class RenameRecord
{
public RenameStatus status;
public string oldName;
public string newName;
}
private readonly Dictionary<ModuleDefMD, RenameRecord> _modRenames = new Dictionary<ModuleDefMD, RenameRecord>();
private readonly Dictionary<TypeDef, RenameRecord> _typeRenames = new Dictionary<TypeDef, RenameRecord>();
private readonly Dictionary<MethodDef, RenameRecord> _methodRenames = new Dictionary<MethodDef, RenameRecord>();
private readonly Dictionary<FieldDef, RenameRecord> _fieldRenames = new Dictionary<FieldDef, RenameRecord>();
private readonly Dictionary<PropertyDef, RenameRecord> _propertyRenames = new Dictionary<PropertyDef, RenameRecord>();
private readonly Dictionary<EventDef, RenameRecord> _eventRenames = new Dictionary<EventDef, RenameRecord>();
public void AddRenameRecord(ModuleDefMD mod, string oldName, string newName)
{
_modRenames.Add(mod, new RenameRecord
{
status = RenameStatus.Renamed,
oldName = oldName,
newName = newName
});
}
public void AddRenameRecord(TypeDef type, string oldName, string newName)
{
_typeRenames.Add(type, new RenameRecord
{
status = RenameStatus.Renamed,
oldName = oldName,
newName = newName
});
}
public void AddRenameRecord(MethodDef method, string oldName, string newName)
{
_methodRenames.Add(method, new RenameRecord
{
status = RenameStatus.Renamed,
oldName = oldName,
newName = newName
});
}
public void AddRenameRecord(FieldDef field, string oldName, string newName)
{
_fieldRenames.Add(field, new RenameRecord
{
status = RenameStatus.Renamed,
oldName = oldName,
newName = newName
});
}
public void AddRenameRecord(PropertyDef property, string oldName, string newName)
{
_propertyRenames.Add(property, new RenameRecord
{
status = RenameStatus.Renamed,
oldName = oldName,
newName = newName
});
}
public void AddRenameRecord(EventDef eventDef, string oldName, string newName)
{
_eventRenames.Add(eventDef, new RenameRecord
{
status = RenameStatus.Renamed,
oldName = oldName,
newName = newName
});
}
public void AddUnRenameRecord(ModuleDefMD mod)
{
_modRenames.Add(mod, new RenameRecord
{
status = RenameStatus.NotRenamed,
oldName = mod.Assembly.Name,
newName = null,
});
}
public void AddUnRenameRecord(TypeDef typeDef)
{
_typeRenames.Add(typeDef, new RenameRecord
{
status = RenameStatus.NotRenamed,
oldName = typeDef.FullName,
newName = null,
});
}
public void AddUnRenameRecord(MethodDef methodDef)
{
_methodRenames.Add(methodDef, new RenameRecord
{
status = RenameStatus.NotRenamed,
oldName = methodDef.Name,
newName = null,
});
}
public void AddUnRenameRecord(FieldDef fieldDef)
{
_fieldRenames.Add(fieldDef, new RenameRecord
{
status = RenameStatus.NotRenamed,
oldName = fieldDef.Name,
newName = null,
});
}
public void AddUnRenameRecord(PropertyDef propertyDef)
{
_propertyRenames.Add(propertyDef, new RenameRecord
{
status = RenameStatus.NotRenamed,
oldName = propertyDef.Name,
newName = null,
});
}
public void AddUnRenameRecord(EventDef eventDef)
{
_eventRenames.Add(eventDef, new RenameRecord
{
status = RenameStatus.NotRenamed,
oldName = eventDef.Name,
newName = null,
});
}
}
}

View File

@ -12,6 +12,7 @@ using UnityEngine;
namespace Obfuz
{
public class SymbolRename
{
private readonly ObfuscatorContext _ctx;
@ -19,7 +20,7 @@ namespace Obfuz
private readonly IRenamePolicy _renamePolicy;
private readonly INameMaker _nameMaker;
private readonly Dictionary<ModuleDef, List<CustomAttributeInfo>> _customAttributeArgumentsWithTypeByMods = new Dictionary<ModuleDef, List<CustomAttributeInfo>>();
private readonly RenameRecordMap _renameRecordMap = new RenameRecordMap();
class CustomAttributeInfo
{
@ -36,24 +37,18 @@ namespace Obfuz
BuildCustomAttributeArguments();
}
private bool MayRenameType(ElementType type)
{
return type == ElementType.Class || type == ElementType.ValueType || type == ElementType.Object || type == ElementType.SZArray;
}
private void CollectCArgumentWithTypeOf(IHasCustomAttribute meta, List<CustomAttributeInfo> customAttributes)
{
int index = 0;
foreach (CustomAttribute ca in meta.CustomAttributes)
{
List<CAArgument> arguments = null;
if (ca.ConstructorArguments.Any(a => MayRenameType(a.Type.ElementType)))
if (ca.ConstructorArguments.Any(a => MetaUtil.MayRenameCustomDataType(a.Type.ElementType)))
{
arguments = ca.ConstructorArguments.ToList();
}
List<CANamedArgument> namedArguments = null;
if (ca.NamedArguments.Any(a => MayRenameType(a.Type.ElementType)))
if (ca.NamedArguments.Any(a => MetaUtil.MayRenameCustomDataType(a.Type.ElementType)))
{
namedArguments = ca.NamedArguments.ToList();
}
@ -117,18 +112,30 @@ namespace Obfuz
{
Rename(ass.module);
}
else
{
_renameRecordMap.AddUnRenameRecord(ass.module);
}
foreach (TypeDef type in ass.module.GetTypes())
{
if (!IsSystemReservedType(type) && _renamePolicy.NeedRename(type))
if (_renamePolicy.NeedRename(type))
{
Rename(type);
}
else
{
_renameRecordMap.AddUnRenameRecord(type);
}
foreach (FieldDef field in type.Fields)
{
if (_renamePolicy.NeedRename(field))
{
Rename(field);
}
else
{
_renameRecordMap.AddUnRenameRecord(field);
}
}
foreach (MethodDef method in type.Methods)
{
@ -143,6 +150,10 @@ namespace Obfuz
}
}
}
else
{
_renameRecordMap.AddUnRenameRecord(method);
}
}
foreach (EventDef eventDef in type.Events)
{
@ -150,6 +161,10 @@ namespace Obfuz
{
Rename(eventDef);
}
else
{
_renameRecordMap.AddUnRenameRecord(eventDef);
}
}
foreach (PropertyDef property in type.Properties)
{
@ -157,18 +172,13 @@ namespace Obfuz
{
Rename(property);
}
}
}
}
}
private bool IsSystemReservedType(TypeDef type)
else
{
if (type.FullName == "<Module>")
{
return true;
_renameRecordMap.AddUnRenameRecord(property);
}
}
}
}
return false;
}
private List<ObfuzAssemblyInfo> GetReferenceMeAssemblies(ModuleDef mod)
@ -180,6 +190,7 @@ namespace Obfuz
{
string oldName = MetaUtil.GetModuleNameWithoutExt(mod.Name);
string newName = _nameMaker.GetNewName(mod, oldName);
_renameRecordMap.AddRenameRecord(mod, oldName, newName);
mod.Name = $"{newName}.dll";
Debug.Log($"rename module. oldName:{oldName} newName:{newName}");
foreach (ObfuzAssemblyInfo ass in GetReferenceMeAssemblies(mod))
@ -243,6 +254,7 @@ namespace Obfuz
}
type.Name = newName;
string newFullName = type.FullName;
_renameRecordMap.AddRenameRecord(type, oldFullName, newFullName);
Debug.Log($"rename typedef. assembly:{type.Module.Name} oldName:{oldFullName} => newName:{newFullName}");
}
@ -576,7 +588,7 @@ namespace Obfuz
RenameFieldNameInCustomAttributes(ass.module, (ModuleDefMD)field.DeclaringType.Module, field.Name, newName);
}
field.Name = newName;
_renameRecordMap.AddRenameRecord(field, oldName, newName);
Debug.Log($"rename field. {field} => {newName}");
}
@ -645,6 +657,7 @@ namespace Obfuz
}
method.Name = newName;
_renameRecordMap.AddRenameRecord(method, oldName, newName);
}
private void RenameMethodBody(MethodDef method)
@ -663,7 +676,10 @@ namespace Obfuz
private void Rename(EventDef eventDef)
{
eventDef.Name = _nameMaker.GetNewName(eventDef, eventDef.Name);
string oldName = eventDef.Name;
string newName = _nameMaker.GetNewName(eventDef, eventDef.Name);
eventDef.Name = newName;
_renameRecordMap.AddRenameRecord(eventDef, oldName, newName);
}
private void Rename(PropertyDef property)
@ -676,6 +692,7 @@ namespace Obfuz
{
RenameFieldNameInCustomAttributes(ass.module, mod, oldName, newName);
}
_renameRecordMap.AddRenameRecord(property, oldName, newName);
}
}
}