修复虚函数分配名字未检查是否与每个虚函数所在类型其他函数冲突的严重bug

before-split
walon 2025-05-23 20:40:54 +08:00
parent 5f4083066b
commit d64e57b370
3 changed files with 32 additions and 3 deletions

View File

@ -16,6 +16,8 @@ namespace Obfuz.ObfusPasses.SymbolObfus
void AddPreservedName(EventDef eventDef, string name); void AddPreservedName(EventDef eventDef, string name);
bool IsNamePreserved(VirtualMethodGroup virtualMethodGroup, string name);
string GetNewName(TypeDef typeDef, string originalName); string GetNewName(TypeDef typeDef, string originalName);
string GetNewNamespace(TypeDef typeDef, string originalNamespace, bool reuse); string GetNewNamespace(TypeDef typeDef, string originalNamespace, bool reuse);

View File

@ -57,6 +57,11 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers
GetNameScope(_namespaceScope).AddPreservedName(name); 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) private string GetDefaultNewName(object scope, string originName)
{ {
return GetNameScope(scope).GetNewName(originName, false); return GetNameScope(scope).GetNewName(originName, false);
@ -88,7 +93,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers
while (true) while (true)
{ {
string newName = scope.GetNewName(originalName, false); 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; continue;
} }
@ -96,7 +101,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers
{ {
foreach (var method in virtualMethodGroup.methods) foreach (var method in virtualMethodGroup.methods)
{ {
GetNameScope(method).AddPreservedName(newName); GetNameScope(method.DeclaringType).AddPreservedName(newName);
} }
return newName; return newName;
} }

View File

@ -479,7 +479,29 @@ namespace Obfuz.ObfusPasses.SymbolObfus
groupNeedRenames.Add(group, needRename); groupNeedRenames.Add(group, needRename);
if (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) if (!needRename)