【问题标题】:Disable "Constant Literals Pruning" in Eazfuscator.NET在 Eazfuscator.NET 中禁用“常量文字修剪”
【发布时间】:2020-10-01 19:00:06
【问题描述】:

我想在 Eazfuscator.NET(程序集级别)中禁用“常量文字修剪”。这怎么可能?

背景: 我们在自定义属性构造函数中使用枚举。构造函数参数的类型是object,因为属性类在一个不引用包含枚举的程序集的程序集中。

混淆前:

[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
    }
}

【问题讨论】:

  • 奇怪。 int 应该始终可以转换为基于 int 的枚举。也许是对象类型的构造函数参数导致了麻烦。您是否尝试将构造函数参数类型更改为该枚举?否则你可能会尝试投两次:(Enum)(int)value

标签: c# .net obfuscation eazfuscator


【解决方案1】:

这是您可以使用 Eazfuscator.NET 禁用枚举文字的剥离/修剪的方法:

[Obfuscation(Feature = "enum values pruning", Exclude = true)]
enum SampleEnum
{
    None,
    Digit1,
    Digit2
}

【讨论】:

    【解决方案2】:

    我是 Frans 的同事,我们想到了以下解决方案。 为了能够将整数转换回它的枚举值,您必须传递枚举的类型。

    有什么想法吗?

    [myAttribute("description", param1: MyOwnEnum.MyParticularEnumValue, param2: MyOwnEnum.MyParticularEnumValue2,passedType: typeof(MyOwnEnum)]

    内部类 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)
    }
    

    }

    【讨论】:

      【解决方案3】:

      您不能将整数强制转换为 Enum 基类。

      但是,您可能不需要禁用“常量文字修剪”。您可以将整数转换为特定的枚举类型,而不是转换为 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
          }
      }
      

      【讨论】:

      • 嗨,巴特,我不能使用 x1 和 x2,因为 "属性类在一个不引用包含枚举的程序集的程序集中"。跨度>
      • 确实是 Eazfuscator.NET 打破了一切。使用 x1 没有混淆没有问题。
      • 我知道,@FransvanderVelden,但您也许可以使用双重转换(或至少转换为特定枚举类型)作为 Eazfuscators 行为的解决方法
      猜你喜欢
      • 1970-01-01
      • 2013-06-06
      • 2017-01-03
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2010-12-11
      相关资源
      最近更新 更多