在 Eazfuscator.NET 中禁用 "Constant Literals Pruning"
Disable "Constant Literals Pruning" in Eazfuscator.NET
我想在 Eazfuscator.NET(程序集级别)中禁用 "Constant Literals Pruning"。这怎么可能?
背景:
我们在自定义属性构造函数中使用枚举。构造函数参数的类型是对象,因为属性 class 在一个没有引用包含枚举的程序集的程序集中。
混淆前:
[MyAttribute(MyEnum.Value3)]
public class MyClass
{
}
混淆(反编译)后:
[MyAttribute(2)]
public class MyAttribute : Attribute
{
}
在属性的构造函数中,我将值转换为 Enum。这会在混淆的程序集中生成异常,但不会在未混淆的变体中生成异常:
public class MyAttribute : Attribute
{
public MyAttribute(object value)
{
var x = (Enum) value; // this throws an InvalidCastException after obfuscation
}
}
我是 Frans 的同事,我们想到了以下解决方案。
为了能够将整数转换回其枚举值,您必须传递枚举的类型。
有什么想法吗?
[myAttribute("description", param1: MyOwnEnum.MyParticularEnumValue, param2: MyOwnEnum.MyParticularEnumValue2, passedType: typeof(MyOwnEnum)]
内部 class myAttribute : 属性
{
public myAttribute(string description, object param1, object param2, Type passedType)
{
this.myAttributeDescription = description;
this.SomePropertyWhichIsAnEnum = (Enum)Enum.ToObject(passedType, param1));
this.SomeOtherPropertyWhichIsAnEnum = (Enum)Enum.ToObject(passedType, param2)
}
}
您不能将整数转换为枚举基 class。
但是,您可能不需要禁用“常量文字修剪”。您可以将整数强制转换为特定的枚举类型,而不是强制转换为 Enum 基类型。
当枚举没有表示整数值的值时,这也适用。
[MyAttribute(MyEnum.Value3)]
public class MyClass1
{
//...
}
[MyAttribute(2)]
public class MyClass2
{
//...
}
[MyAttribute(123456)]
public class MyClass4
{
// MyEnum does not have a value with 123456
// but it still works
}
public class MyAttribute : Attribute
{
public MyAttribute(object value)
{
var x1 = (MyEnum)value; // works with enum and number
var x2 = (Enum)(MyEnum)value; // works (but why would you?)
var x3 = (Enum) value; // this throws an InvalidCastException after obfuscation
}
}
这就是您可以使用 Eazfuscator.NET:
禁用枚举文字的 stripping/pruning 的方法
[Obfuscation(Feature = "enum values pruning", Exclude = true)]
enum SampleEnum
{
None,
Digit1,
Digit2
}
我想在 Eazfuscator.NET(程序集级别)中禁用 "Constant Literals Pruning"。这怎么可能?
背景: 我们在自定义属性构造函数中使用枚举。构造函数参数的类型是对象,因为属性 class 在一个没有引用包含枚举的程序集的程序集中。
混淆前:
[MyAttribute(MyEnum.Value3)]
public class MyClass
{
}
混淆(反编译)后:
[MyAttribute(2)]
public class MyAttribute : Attribute
{
}
在属性的构造函数中,我将值转换为 Enum。这会在混淆的程序集中生成异常,但不会在未混淆的变体中生成异常:
public class MyAttribute : Attribute
{
public MyAttribute(object value)
{
var x = (Enum) value; // this throws an InvalidCastException after obfuscation
}
}
我是 Frans 的同事,我们想到了以下解决方案。 为了能够将整数转换回其枚举值,您必须传递枚举的类型。
有什么想法吗?
[myAttribute("description", param1: MyOwnEnum.MyParticularEnumValue, param2: MyOwnEnum.MyParticularEnumValue2, passedType: typeof(MyOwnEnum)]
内部 class myAttribute : 属性 {
public myAttribute(string description, object param1, object param2, Type passedType)
{
this.myAttributeDescription = description;
this.SomePropertyWhichIsAnEnum = (Enum)Enum.ToObject(passedType, param1));
this.SomeOtherPropertyWhichIsAnEnum = (Enum)Enum.ToObject(passedType, param2)
}
}
您不能将整数转换为枚举基 class。
但是,您可能不需要禁用“常量文字修剪”。您可以将整数强制转换为特定的枚举类型,而不是强制转换为 Enum 基类型。 当枚举没有表示整数值的值时,这也适用。
[MyAttribute(MyEnum.Value3)]
public class MyClass1
{
//...
}
[MyAttribute(2)]
public class MyClass2
{
//...
}
[MyAttribute(123456)]
public class MyClass4
{
// MyEnum does not have a value with 123456
// but it still works
}
public class MyAttribute : Attribute
{
public MyAttribute(object value)
{
var x1 = (MyEnum)value; // works with enum and number
var x2 = (Enum)(MyEnum)value; // works (but why would you?)
var x3 = (Enum) value; // this throws an InvalidCastException after obfuscation
}
}
这就是您可以使用 Eazfuscator.NET:
禁用枚举文字的 stripping/pruning 的方法[Obfuscation(Feature = "enum values pruning", Exclude = true)]
enum SampleEnum
{
None,
Digit1,
Digit2
}