diff --git a/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs b/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs index 6e0cc53..537b0bc 100644 --- a/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs +++ b/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs @@ -23,6 +23,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus private List _toObfuscatedModules; private List _obfuscatedAndNotObfuscatedModules; private HashSet _toObfuscatedModuleSet; + private HashSet _nonObfuscatedButReferencingObfuscatedModuleSet; private IObfuscationPolicy _renamePolicy; private INameMaker _nameMaker; private readonly Dictionary> _customAttributeArgumentsWithTypeByMods = new Dictionary>(); @@ -67,6 +68,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus _toObfuscatedModules = ctx.modulesToObfuscate; _obfuscatedAndNotObfuscatedModules = ctx.allObfuscationRelativeModules; _toObfuscatedModuleSet = new HashSet(ctx.modulesToObfuscate); + _nonObfuscatedButReferencingObfuscatedModuleSet = new HashSet(ctx.allObfuscationRelativeModules.Where(m => !_toObfuscatedModuleSet.Contains(m))); var obfuscateRuleConfig = new ConfigurableRenamePolicy(ctx.coreSettings.assembliesToObfuscate, ctx.modulesToObfuscate, _obfuscationRuleFiles); var totalRenamePolicies = new List @@ -551,7 +553,10 @@ namespace Obfuz.ObfusPasses.SymbolObfus VirtualMethodGroup group = _virtualMethodGroupCalculator.GetMethodGroup(method); if (!groupNeedRenames.TryGetValue(group, out var needRename)) { - if (!group.methods.Any(m => _toObfuscatedModuleSet.Contains(m.DeclaringType.Module))) + var rootBeInheritedTypes = group.GetRootBeInheritedTypes(); + // - if the group contains no obfuscated methods + // - if the group contains method defined in non-obfuscated module but referencing obfuscated module and virtual method in obfuscated type overrides virtual method from non-obfuscated type + if (!group.methods.Any(m => _toObfuscatedModuleSet.Contains(m.DeclaringType.Module)) || group.methods.Any(m => _nonObfuscatedButReferencingObfuscatedModuleSet.Contains(m.Module) && rootBeInheritedTypes.Contains(m.DeclaringType))) { needRename = false; } diff --git a/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs b/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs index 05d9858..cf66df1 100644 --- a/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs +++ b/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs @@ -11,6 +11,8 @@ namespace Obfuz.ObfusPasses.SymbolObfus private HashSet _nameScopes; + private HashSet _rootNameScope; + public HashSet GetNameConflictTypeScopes() { if (_nameScopes != null) @@ -31,6 +33,25 @@ namespace Obfuz.ObfusPasses.SymbolObfus return _nameScopes; } + public HashSet GetRootBeInheritedTypes() + { + if (_rootNameScope != null) + { + return _rootNameScope; + } + _rootNameScope = new HashSet(); + var nameScopes = GetNameConflictTypeScopes(); + foreach (var type in nameScopes) + { + TypeDef parentType = MetaUtil.GetBaseTypeDef(type); + if (parentType == null || !nameScopes.Contains(parentType)) + { + _rootNameScope.Add(type); + } + } + return _rootNameScope; + } + public IEnumerable GetNameDeclaringTypeScopes() { foreach (var method in methods)