修复当混淆程序集虚函数override了nonObfuscatedButReferencingObfuscatedModuleSet程序集中虚函数,错误地将nonObfuscatedButReferencingObfuscatedModuleSet中虚函数也混淆的bug

1.x
walon 2025-06-12 10:30:42 +08:00
parent 83598d6805
commit ea5a8e62ce
2 changed files with 27 additions and 1 deletions

View File

@ -23,6 +23,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
private List<ModuleDef> _toObfuscatedModules; private List<ModuleDef> _toObfuscatedModules;
private List<ModuleDef> _obfuscatedAndNotObfuscatedModules; private List<ModuleDef> _obfuscatedAndNotObfuscatedModules;
private HashSet<ModuleDef> _toObfuscatedModuleSet; private HashSet<ModuleDef> _toObfuscatedModuleSet;
private HashSet<ModuleDef> _nonObfuscatedButReferencingObfuscatedModuleSet;
private IObfuscationPolicy _renamePolicy; private IObfuscationPolicy _renamePolicy;
private INameMaker _nameMaker; private INameMaker _nameMaker;
private readonly Dictionary<ModuleDef, List<CustomAttributeInfo>> _customAttributeArgumentsWithTypeByMods = new Dictionary<ModuleDef, List<CustomAttributeInfo>>(); private readonly Dictionary<ModuleDef, List<CustomAttributeInfo>> _customAttributeArgumentsWithTypeByMods = new Dictionary<ModuleDef, List<CustomAttributeInfo>>();
@ -67,6 +68,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
_toObfuscatedModules = ctx.modulesToObfuscate; _toObfuscatedModules = ctx.modulesToObfuscate;
_obfuscatedAndNotObfuscatedModules = ctx.allObfuscationRelativeModules; _obfuscatedAndNotObfuscatedModules = ctx.allObfuscationRelativeModules;
_toObfuscatedModuleSet = new HashSet<ModuleDef>(ctx.modulesToObfuscate); _toObfuscatedModuleSet = new HashSet<ModuleDef>(ctx.modulesToObfuscate);
_nonObfuscatedButReferencingObfuscatedModuleSet = new HashSet<ModuleDef>(ctx.allObfuscationRelativeModules.Where(m => !_toObfuscatedModuleSet.Contains(m)));
var obfuscateRuleConfig = new ConfigurableRenamePolicy(ctx.coreSettings.assembliesToObfuscate, ctx.modulesToObfuscate, _obfuscationRuleFiles); var obfuscateRuleConfig = new ConfigurableRenamePolicy(ctx.coreSettings.assembliesToObfuscate, ctx.modulesToObfuscate, _obfuscationRuleFiles);
var totalRenamePolicies = new List<IObfuscationPolicy> var totalRenamePolicies = new List<IObfuscationPolicy>
@ -551,7 +553,10 @@ namespace Obfuz.ObfusPasses.SymbolObfus
VirtualMethodGroup group = _virtualMethodGroupCalculator.GetMethodGroup(method); VirtualMethodGroup group = _virtualMethodGroupCalculator.GetMethodGroup(method);
if (!groupNeedRenames.TryGetValue(group, out var needRename)) 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; needRename = false;
} }

View File

@ -11,6 +11,8 @@ namespace Obfuz.ObfusPasses.SymbolObfus
private HashSet<TypeDef> _nameScopes; private HashSet<TypeDef> _nameScopes;
private HashSet<TypeDef> _rootNameScope;
public HashSet<TypeDef> GetNameConflictTypeScopes() public HashSet<TypeDef> GetNameConflictTypeScopes()
{ {
if (_nameScopes != null) if (_nameScopes != null)
@ -31,6 +33,25 @@ namespace Obfuz.ObfusPasses.SymbolObfus
return _nameScopes; return _nameScopes;
} }
public HashSet<TypeDef> GetRootBeInheritedTypes()
{
if (_rootNameScope != null)
{
return _rootNameScope;
}
_rootNameScope = new HashSet<TypeDef>();
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<TypeDef> GetNameDeclaringTypeScopes() public IEnumerable<TypeDef> GetNameDeclaringTypeScopes()
{ {
foreach (var method in methods) foreach (var method in methods)