From 225c61376300d3106436d95632a048a79b2077b9 Mon Sep 17 00:00:00 2001 From: walon Date: Sun, 13 Apr 2025 21:20:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4RenameRecordMap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/MetaUtil.cs | 5 ++ Editor/Rename/RenameRecordMap.cs | 150 +++++++++++++++++++++++++++++++ Editor/Rename/SymbolRename.cs | 59 +++++++----- 3 files changed, 193 insertions(+), 21 deletions(-) create mode 100644 Editor/Rename/RenameRecordMap.cs diff --git a/Editor/MetaUtil.cs b/Editor/MetaUtil.cs index 531c2cd..b405cbe 100644 --- a/Editor/MetaUtil.cs +++ b/Editor/MetaUtil.cs @@ -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; + } } } diff --git a/Editor/Rename/RenameRecordMap.cs b/Editor/Rename/RenameRecordMap.cs new file mode 100644 index 0000000..96c153e --- /dev/null +++ b/Editor/Rename/RenameRecordMap.cs @@ -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 _modRenames = new Dictionary(); + private readonly Dictionary _typeRenames = new Dictionary(); + private readonly Dictionary _methodRenames = new Dictionary(); + private readonly Dictionary _fieldRenames = new Dictionary(); + private readonly Dictionary _propertyRenames = new Dictionary(); + private readonly Dictionary _eventRenames = new Dictionary(); + + + 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, + }); + } + + } +} diff --git a/Editor/Rename/SymbolRename.cs b/Editor/Rename/SymbolRename.cs index 0b90634..9aafa56 100644 --- a/Editor/Rename/SymbolRename.cs +++ b/Editor/Rename/SymbolRename.cs @@ -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> _customAttributeArgumentsWithTypeByMods = new Dictionary>(); - + 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 customAttributes) { int index = 0; foreach (CustomAttribute ca in meta.CustomAttributes) { List 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 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,20 +172,15 @@ namespace Obfuz { Rename(property); } + else + { + _renameRecordMap.AddUnRenameRecord(property); + } } } } } - private bool IsSystemReservedType(TypeDef type) - { - if (type.FullName == "") - { - return true; - } - return false; - } - private List GetReferenceMeAssemblies(ModuleDef mod) { return _ctx.assemblies.Find(ass => ass.module == mod).referenceMeAssemblies; @@ -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); } } }