修复虚函数分配名字未检查是否与每个虚函数所在类型其他函数冲突的严重bug
parent
5f4083066b
commit
d64e57b370
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue