Eazfuscator.NET打破了Enum.IsDefined

时间:2012-04-27 23:37:54

标签: c# .net reflection obfuscation eazfuscator

在我的代码中,我使用了许多小枚举:

enum UserRequest : byte { Burp=1, Sneeze=2, Fart=3 }

我经常需要在将整数输入转换为此枚举之前对其进行验证。

bool valid_input = Enum.IsDefined(typeof(UserRequest), user_byte_value);

当enum使用FlagsAttribute时,此方法不起作用; Enum.IsDefined无法自动组合标志以生成指定值。但是,我已经能够解决不需要FlagsAttribute的问题。

然而,TIL Eazfuscator.NET的混淆打破了Enum.IsDefined。我知道这是一种可能性,但我希望它不会,因为它不在System.Reflection命名空间中(据报道,它大量使用System.Reflection)。

所以我想知道是否有人知道任何好的选择。我特别关注以下内容:

  1. 允许检查整数是否在指定的枚举中。
  2. 与.NET Framework 2.0和Mono Framework兼容。
  3. 在没有明确禁用它的情况下生存混淆(使用属性或某些GUI工具)。

1 个答案:

答案 0 :(得分:2)

如果其他人遇到同样的问题,并且发现了这篇文章,那么我使用的解决方案就是为每个枚举添加一个额外的枚举成员。

enum UserRequests : byte
{
    Burp = 0,
    Sneeze = 1,
    Fart = 2,
    /* Maximum Valid Value */
    MAXVAL = Fart
}

这是我记得在C((非ANSI)和#defines中使用迭代枚举值的一种做法,它唯一的缺点是难以维护。

我写了一个通用函数来教导负担(如下所示);我仍然必须明确地传递MAXVAL成员,但它的工作量比我想象的少。当然,它可以在混淆中存活并且可以移植。

public static bool TryParseByteToEnum<T>(byte input_byte, 
    out T enum_member, T max_value) where 
        T : struct, IConvertible