From d64e57b3701ad0c9d615c82dec1b2fcd8cc1f1c4 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 23 May 2025 20:40:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=99=9A=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=88=86=E9=85=8D=E5=90=8D=E5=AD=97=E6=9C=AA=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E4=B8=8E=E6=AF=8F=E4=B8=AA=E8=99=9A=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=89=80=E5=9C=A8=E7=B1=BB=E5=9E=8B=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=86=B2=E7=AA=81=E7=9A=84=E4=B8=A5=E9=87=8D?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ObfusPasses/SymbolObfus/INameMaker.cs | 2 ++ .../SymbolObfus/NameMakers/NameMakerBase.cs | 9 +++++-- .../ObfusPasses/SymbolObfus/SymbolRename.cs | 24 ++++++++++++++++++- 3 files changed, 32 insertions(+), 3 deletions(-) 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)