现在的位置: 首页 > 综合 > 正文

Eazfuscator.NET 3.3中属性的特性问题

2013年02月01日 ⁄ 综合 ⁄ 共 1137字 ⁄ 字号 评论关闭

Eazfuscator.NET对特性的处理有好有坏,好的方面如果类型被标记了可序列化(Serializable特性),Eazfuscator.NET自动不会修改类型名称的,因为序列化和反序列化过程需要验证对象的类型信息。不好的一个方面则是在属性上标记的特性会消失。

 

如下我们定义一个特性,然后应用在类,属性,字段和方法上:

class MyAttr : Attribute

{ }

 

[MyAttr]

class b

{

    [MyAttr]

    public int aaa;

    [MyAttr]

    public int bbb { get; set; }

    [MyAttr]

    public void ccc() { }

}

 

接着使用Eazfuscator.NET混淆化后,反编译后的代码是这样的:

image

 

可以看出来,除了类本身有特性,还有两处有特性标记,一个是字段,一个是方法。而属性的特性则不见了。其他的成员是这样的:

第一个蓝线:属性背后包装的字段。

第二个蓝线:属性的get。

第三个蓝线:属性的set。

第四个蓝线:构造函数。

 

属性的特性之所以不在是因为Eazfuscator.NET把属性拆分成了方法,虽然属性本质上就是方法,但是IL是支持属性定义的,同时上面可以加入特性。比如这样,下面是上述代码未经过混淆化属性bbb的定义:

.property instance int32 bbb

   {

       .get instance int32 Mgen.b::get_bbb()

       .set instance void Mgen.b::set_bbb(int32)

       .custom instance void Mgen.MyAttr::.ctor()

   }

.custom是自定义特性的定义,一切都在.property属性定义中。

 

而Eazfuscator.NET直接把属性定义去掉把他分离成方法(这也是出于混淆化目的),因此针对属性的特性是无法被应用的。

 

解决方案之一就是使用System.Reflection.ObfuscationAttribute特性(这个特性诞生在.NET 2.0之后)来命令Eazfuscator.NET不要重命名这个属性:

[MyAttr]

[System.Reflection.ObfuscationAttribute(Feature = "renaming", Exclude = true)]

public int bbb { get; set; }

 

反编译后的结果会是这样:

image

 

这次属性上的特性没有消失,不过属性本身也没有被重命名。

 

那么Eazfuscator.NET 3.3对属性上的特性的处理现状就好像两个极端,要么什么也不处理,要么扔掉特性把属性彻底处理一下(拆分成独立的方法)。难道不能提供一个中间的选择吗?

抱歉!评论已关闭.