ObfuscationAttribute模糊处理

时间:2022-09-13 19:03:16

在Reflection的强大和Reflector的盛行下,.NET产品的内部实现越来越透明,在恶意用户和Cracker面前,基本上已是砧板上的肉,被切到什么程度只能祈祷遇到的都是钝刀子;于是一批批的混淆工具应声而出,虽然他们的实现机制可能不同,但是都相同的是,使用这些工具的时候,需要为对应要混淆的产品写相当不简单的配置文件,里面描述哪些需要加密,哪些需要排除。那么,有没有办法在Assembly里就让工具知道某些地方不做混淆呢?     答案肯定是有办法了!Microsoft在设计.NET时就考虑到混淆了,并暴露出System.Reflection.ObfuscationAttribute和System.Reflection.ObfuscateAssemblyAttribute,并建议(仅仅是建议,没有要求,所以这个不是万能的)混淆工具提供商对它们提供支持。目前大多数的混淆工具提供商都支持了它们(不知道有哪个没有支持,如果你知道,欢迎提出),下面就对这两个Attribute的使用做简单的展示。     为了说明必要,先拉出我们的测试code来:

public class Type1
 {
   public void MethodA() { }
    public void MethodB() { }
 }
 
 public class Type2
{
  public void MethodA() { }
   public void MethodB() { }
}

编译之后使用IDE自带Dotfuscator做加密,注意这里在Rename配置页里面什么也不做,在Input配置页里选中Honor Obfuscation Attributes,然后就保存并Run,很快看到输出结果,发现所有的类和方法都加密了。     修改Code如下,添上ObfuscationAttribute,代码如下,这里我希望Type1的MethodA方法不混淆,Type2的名字不被混淆,但其他的都自动混淆,到底能不能做到呢?

[assembly: ObfuscateAssemblyAttribute(true)]
ObfuscationAttribute模糊处理
ObfuscationAttribute模糊处理public class Type1
{
    [ObfuscationAttribute(Exclude = true)]
   public void MethodA() { }
   public void MethodB() { }
}
ObfuscationAttribute模糊处理
ObfuscationAttribute模糊处理[ObfuscationAttribute(Exclude = true, ApplyToMembers = false)]
ObfuscationAttribute模糊处理public class Type2
{
  [ObfuscationAttribute(Exclude = false, Feature = "default",
        StripAfterObfuscation = false)]
    public void MethodA() { }
    public void MethodB() { }
}

ObfuscationAttribute模糊处理ObfuscationAttribute模糊处理{  5ObfuscationAttribute模糊处理    [ObfuscationAttribute(Exclude = true)]  6ObfuscationAttribute模糊处理ObfuscationAttribute模糊处理    public void MethodA() ObfuscationAttribute模糊处理{ }  7ObfuscationAttribute模糊处理ObfuscationAttribute模糊处理    public void MethodB() ObfuscationAttribute模糊处理{ }  8ObfuscationAttribute模糊处理}  9ObfuscationAttribute模糊处理 10ObfuscationAttribute模糊处理[ObfuscationAttribute(Exclude = true, ApplyToMembers = false)] 11ObfuscationAttribute模糊处理public class Type2 12ObfuscationAttribute模糊处理ObfuscationAttribute模糊处理ObfuscationAttribute模糊处理{ 13ObfuscationAttribute模糊处理    [ObfuscationAttribute(Exclude = false, Feature = "default", 14ObfuscationAttribute模糊处理        StripAfterObfuscation = false)] 15ObfuscationAttribute模糊处理ObfuscationAttribute模糊处理    public void MethodA() ObfuscationAttribute模糊处理{ } 16ObfuscationAttribute模糊处理ObfuscationAttribute模糊处理    public void MethodB() ObfuscationAttribute模糊处理{ } 17ObfuscationAttribute模糊处理}

这里用到了ObfuscateAssemblyAttribute和ObfuscationAttribute,偶从MSDN摘取了它们的功能说明: ObfuscateAssemblyAttribute:指示模糊处理工具对适当的程序集类型使用其标准模糊处理规则。 ObfuscationAttribute:指示模糊处理工具对程序集、类型或成员采取指定的操作。 备注: ObfuscationAttribute 和 ObfuscateAssemblyAttribute 属性使得程序集作者可以批注二进制文件,以便模糊处理工具能够使用最少的外部配置正确处理这些二进制文件。

重要事项:

应用此属性不会自动模糊处理该属性应用到的代码实体。应用此属性是为模糊处理工具创建配置文件的替代方法。也就是说,             它仅提供有关模糊处理工具的说明。Microsoft 建议模糊处理工具供应商遵循此处描述的语义。             但并不保证特定工具遵循 Microsoft 建议。

ObfuscationAttribute 属性 (Attribute) 具有一个字符串 Feature 属性 (Property)。模糊处理工具可将此属性的字符串值映射到它们实现的功能(最好是通过使用用户可访问的 XML 配置文件)。ObfuscationAttribute 定义两个功能字符串:“default”和“all”。字符串“default”应映射到模糊处理工具的默认模糊处理功能,而“all”应映射到模糊处理工具支持的模糊处理功能的完整集合。Feature 属性的默认值为“all”,该值启用模糊处理功能的完整集合。 当应用于某个程序集时,ObfuscationAttribute 也应用于该程序集内的所有类型。如果 ApplyToMembers 属性 (Property) 未指定或设置为 true,则该属性 (Attribute) 也应用于所有成员。ObfuscationAttribute 不指定程序集是公共的还是私有的。若要指定程序集是公共的还是私有的,请使用 ObfuscateAssemblyAttribute 属性。 如果 ApplyToMembers 属性未指定或设置为 true,则当应用于类或结构时,ObfuscationAttribute 也应用于该类型的所有成员。当应用于方法、参数、字段和属性 (Property) 时,该属性 (Attribute) 仅影响其应用到的实体。     修改完代码,编译,再次使用Dotfuscator,使用刚才相同的配置混淆,结果如下图,是不是和想象的一样。 ObfuscationAttribute模糊处理
结论:     通过给特定的类、方法、属性、Assembly可以帮助简化混淆工具的配置脚本。 GCDN(http://gcdn.grapecity.com/cs)