diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/INameMaker.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/INameMaker.cs index 9e94125..6f95ffd 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/INameMaker.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/INameMaker.cs @@ -16,6 +16,8 @@ namespace Obfuz.ObfusPasses.SymbolObfus void AddPreservedName(EventDef eventDef, string name); + bool IsNamePreserved(VirtualMethodGroup virtualMethodGroup, string name); + string GetNewName(TypeDef typeDef, string originalName); string GetNewNamespace(TypeDef typeDef, string originalNamespace, bool reuse); diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/NameMakers/NameMakerBase.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/NameMakers/NameMakerBase.cs index bd1bb08..43d51c9 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/NameMakers/NameMakerBase.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/NameMakers/NameMakerBase.cs @@ -57,6 +57,11 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers GetNameScope(_namespaceScope).AddPreservedName(name); } + public bool IsNamePreserved(VirtualMethodGroup virtualMethodGroup, string name) + { + return virtualMethodGroup.methods.Any(m => GetNameScope(m.DeclaringType).IsNamePreserved(name)); + } + private string GetDefaultNewName(object scope, string originName) { return GetNameScope(scope).GetNewName(originName, false); @@ -88,7 +93,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers while (true) { string newName = scope.GetNewName(originalName, false); - if (virtualMethodGroup.methods.Any(m => GetNameScope(m).IsNamePreserved(newName))) + if (virtualMethodGroup.methods.Any(m => GetNameScope(m.DeclaringType).IsNamePreserved(newName))) { continue; } @@ -96,7 +101,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers { foreach (var method in virtualMethodGroup.methods) { - GetNameScope(method).AddPreservedName(newName); + GetNameScope(method.DeclaringType).AddPreservedName(newName); } return newName; } diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs index b7f2105..3f2228b 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs @@ -479,7 +479,29 @@ namespace Obfuz.ObfusPasses.SymbolObfus groupNeedRenames.Add(group, needRename); if (needRename) { - _renameRecordMap.InitAndAddRename(group, _renameRecordMap.TryGetExistRenameMapping(method, out var nn) ? nn : _nameMaker.GetNewName(method, method.Name)); + bool conflict = false; + string newVirtualMethodName = null; + foreach (MethodDef m in group.methods) + { + if (_renameRecordMap.TryGetExistRenameMapping(m, out var existVirtualMethodName)) + { + if (newVirtualMethodName == null) + { + newVirtualMethodName = existVirtualMethodName; + } + else if(newVirtualMethodName != existVirtualMethodName) + { + Debug.LogWarning($"Virtual method rename conflict. {m} => {existVirtualMethodName} != {newVirtualMethodName}"); + conflict = true; + break; + } + } + } + if (newVirtualMethodName == null || conflict || _nameMaker.IsNamePreserved(group, newVirtualMethodName)) + { + newVirtualMethodName = _nameMaker.GetNewName(group, method.Name); + } + _renameRecordMap.InitAndAddRename(group, newVirtualMethodName); } } if (!needRename)