change: add classType for class rule of symbol obfuscation
parent
b618f2cb1e
commit
98ee041b4d
|
@ -27,29 +27,30 @@ namespace Obfuz.ObfusPasses.SymbolObfus.Policies
|
||||||
|
|
||||||
enum ModifierType
|
enum ModifierType
|
||||||
{
|
{
|
||||||
Private = 0,
|
None = 0x0,
|
||||||
Protected = 1,
|
Private = 0x1,
|
||||||
Public = 2,
|
Protected = 0x2,
|
||||||
|
Public = 0x3,
|
||||||
}
|
}
|
||||||
|
|
||||||
class MethodRuleSpec
|
class MethodRuleSpec
|
||||||
{
|
{
|
||||||
public NameMatcher nameMatcher;
|
public NameMatcher nameMatcher;
|
||||||
public ModifierType modifierType;
|
public ModifierType? modifierType;
|
||||||
public bool? obfuscateName;
|
public bool? obfuscateName;
|
||||||
}
|
}
|
||||||
|
|
||||||
class FieldRuleSpec
|
class FieldRuleSpec
|
||||||
{
|
{
|
||||||
public NameMatcher nameMatcher;
|
public NameMatcher nameMatcher;
|
||||||
public ModifierType modifierType;
|
public ModifierType? modifierType;
|
||||||
public bool? obfuscateName;
|
public bool? obfuscateName;
|
||||||
}
|
}
|
||||||
|
|
||||||
class PropertyRuleSpec
|
class PropertyRuleSpec
|
||||||
{
|
{
|
||||||
public NameMatcher nameMatcher;
|
public NameMatcher nameMatcher;
|
||||||
public ModifierType modifierType;
|
public ModifierType? modifierType;
|
||||||
public bool? obfuscateName;
|
public bool? obfuscateName;
|
||||||
public bool? obfuscateGetter;
|
public bool? obfuscateGetter;
|
||||||
public bool? obfuscateSetter;
|
public bool? obfuscateSetter;
|
||||||
|
@ -58,7 +59,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.Policies
|
||||||
class EventRuleSpec
|
class EventRuleSpec
|
||||||
{
|
{
|
||||||
public NameMatcher nameMatcher;
|
public NameMatcher nameMatcher;
|
||||||
public ModifierType modifierType;
|
public ModifierType? modifierType;
|
||||||
public bool? obfuscateName;
|
public bool? obfuscateName;
|
||||||
public bool? obfuscateAdd;
|
public bool? obfuscateAdd;
|
||||||
public bool? obfuscateRemove;
|
public bool? obfuscateRemove;
|
||||||
|
@ -68,7 +69,8 @@ namespace Obfuz.ObfusPasses.SymbolObfus.Policies
|
||||||
class TypeRuleSpec
|
class TypeRuleSpec
|
||||||
{
|
{
|
||||||
public NameMatcher nameMatcher;
|
public NameMatcher nameMatcher;
|
||||||
public ModifierType modifierType;
|
public ModifierType? modifierType;
|
||||||
|
public ClassType? classType;
|
||||||
public bool? obfuscateName;
|
public bool? obfuscateName;
|
||||||
public bool? obfuscateNamespace;
|
public bool? obfuscateNamespace;
|
||||||
public List<FieldRuleSpec> fields;
|
public List<FieldRuleSpec> fields;
|
||||||
|
@ -124,19 +126,57 @@ namespace Obfuz.ObfusPasses.SymbolObfus.Policies
|
||||||
return rule;
|
return rule;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ModifierType ParseModifierType(string modifierType)
|
private enum ClassType
|
||||||
|
{
|
||||||
|
None = 0x0,
|
||||||
|
Class = 0x1,
|
||||||
|
Struct = 0x2,
|
||||||
|
Interface = 0x4,
|
||||||
|
Enum = 0x8,
|
||||||
|
Delegate = 0x10,
|
||||||
|
}
|
||||||
|
|
||||||
|
private ClassType? ParseClassType(string classType)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(classType))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassType type = ClassType.None;
|
||||||
|
foreach (var s in classType.Split('|'))
|
||||||
|
{
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case "class": type |= ClassType.Class; break;
|
||||||
|
case "struct": type |= ClassType.Struct; break;
|
||||||
|
case "interface": type |= ClassType.Interface; break;
|
||||||
|
case "enum": type |= ClassType.Enum; break;
|
||||||
|
case "delegate": type |= ClassType.Delegate; break;
|
||||||
|
default: throw new Exception($"Invalid class type {s}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ModifierType? ParseModifierType(string modifierType)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(modifierType))
|
if (string.IsNullOrEmpty(modifierType))
|
||||||
{
|
{
|
||||||
return ModifierType.Private;
|
return null;
|
||||||
}
|
}
|
||||||
switch (modifierType)
|
ModifierType type = ModifierType.None;
|
||||||
|
foreach (var s in modifierType.Split('|'))
|
||||||
{
|
{
|
||||||
case "public": return ModifierType.Public;
|
switch (s)
|
||||||
case "protected": return ModifierType.Protected;
|
{
|
||||||
case "private": return ModifierType.Private;
|
case "public": type |= ModifierType.Public; break;
|
||||||
default: throw new Exception($"Invalid modifier type {modifierType}");
|
case "protected": type |= ModifierType.Protected; break;
|
||||||
|
case "private": type |= ModifierType.Private; break;
|
||||||
|
default: throw new Exception($"Invalid modifier type {s}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TypeRuleSpec ParseType(XmlElement element)
|
private TypeRuleSpec ParseType(XmlElement element)
|
||||||
|
@ -147,6 +187,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.Policies
|
||||||
rule.obfuscateName = ConfigUtil.ParseNullableBool(element.GetAttribute("obName"));
|
rule.obfuscateName = ConfigUtil.ParseNullableBool(element.GetAttribute("obName"));
|
||||||
rule.obfuscateNamespace = ConfigUtil.ParseNullableBool(element.GetAttribute("obNamespace"));
|
rule.obfuscateNamespace = ConfigUtil.ParseNullableBool(element.GetAttribute("obNamespace"));
|
||||||
rule.modifierType = ParseModifierType(element.GetAttribute("modifier"));
|
rule.modifierType = ParseModifierType(element.GetAttribute("modifier"));
|
||||||
|
rule.classType = ParseClassType(element.GetAttribute("classType"));
|
||||||
|
|
||||||
//rule.nestTypeRuleSpecs = new List<TypeRuleSpec>();
|
//rule.nestTypeRuleSpecs = new List<TypeRuleSpec>();
|
||||||
rule.fields = new List<FieldRuleSpec>();
|
rule.fields = new List<FieldRuleSpec>();
|
||||||
|
@ -297,29 +338,29 @@ namespace Obfuz.ObfusPasses.SymbolObfus.Policies
|
||||||
// return ModifierType.Protected;
|
// return ModifierType.Protected;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
private bool MatchModifier(ModifierType modifierType, TypeDef typeDef)
|
private bool MatchModifier(ModifierType? modifierType, TypeDef typeDef)
|
||||||
{
|
{
|
||||||
return modifierType <= ComputeModifierType(typeDef.Visibility);
|
return modifierType == null || (modifierType & ComputeModifierType(typeDef.Visibility)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool MatchModifier(ModifierType modifierType, FieldDef fieldDef)
|
private bool MatchModifier(ModifierType? modifierType, FieldDef fieldDef)
|
||||||
{
|
{
|
||||||
return modifierType <= ComputeModifierType(fieldDef.Access);
|
return modifierType == null || (modifierType & ComputeModifierType(fieldDef.Access)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool MatchModifier(ModifierType modifierType, MethodDef methodDef)
|
private bool MatchModifier(ModifierType? modifierType, MethodDef methodDef)
|
||||||
{
|
{
|
||||||
return modifierType <= ComputeModifierType((FieldAttributes)methodDef.Access);
|
return modifierType == null || (modifierType & ComputeModifierType((FieldAttributes)methodDef.Access)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool MatchModifier(ModifierType modifierType, PropertyDef propertyDef)
|
private bool MatchModifier(ModifierType? modifierType, PropertyDef propertyDef)
|
||||||
{
|
{
|
||||||
return modifierType <= ComputeModifierType((FieldAttributes)propertyDef.Attributes);
|
return modifierType == null || (modifierType & ComputeModifierType((FieldAttributes)propertyDef.Attributes)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool MatchModifier(ModifierType modifierType, EventDef eventDef)
|
private bool MatchModifier(ModifierType? modifierType, EventDef eventDef)
|
||||||
{
|
{
|
||||||
return modifierType <= ComputeModifierType((FieldAttributes)eventDef.Attributes);
|
return modifierType == null || (modifierType & ComputeModifierType((FieldAttributes)eventDef.Attributes)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MethodComputeCache
|
private class MethodComputeCache
|
||||||
|
@ -399,6 +440,35 @@ namespace Obfuz.ObfusPasses.SymbolObfus.Policies
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool MatchClassType(ClassType? classType, TypeDef typeDef)
|
||||||
|
{
|
||||||
|
if (classType == null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!typeDef.IsValueType && (classType & ClassType.Class) != 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (typeDef.IsValueType && (classType & ClassType.Struct) != 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (typeDef.IsInterface && (classType & ClassType.Interface) != 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (typeDef.IsEnum && (classType & ClassType.Enum) != 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (typeDef.IsDelegate && (classType & ClassType.Delegate) != 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private TypeRuleSpec GetOrCreateTypeDefRenameComputeCache(TypeDef typeDef)
|
private TypeRuleSpec GetOrCreateTypeDefRenameComputeCache(TypeDef typeDef)
|
||||||
{
|
{
|
||||||
if (_typeSpecCache.TryGetValue(typeDef, out var typeRule))
|
if (_typeSpecCache.TryGetValue(typeDef, out var typeRule))
|
||||||
|
@ -436,7 +506,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.Policies
|
||||||
bool findMatch = false;
|
bool findMatch = false;
|
||||||
foreach (var typeSpec in assemblyRuleSpec.types)
|
foreach (var typeSpec in assemblyRuleSpec.types)
|
||||||
{
|
{
|
||||||
if (!typeSpec.nameMatcher.IsMatch(typeName) || !MatchModifier(typeSpec.modifierType, typeDef))
|
if (!typeSpec.nameMatcher.IsMatch(typeName) || !MatchModifier(typeSpec.modifierType, typeDef) || !MatchClassType(typeSpec.classType, typeDef))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue