Dotfuscator访问器重命名get和set

时间:2014-09-15 22:18:21

标签: c# accessor renaming dotfuscator

我的问题是Dotfuscator配置重命名。想象一下看起来像这样的课程:

Class MyClass
{
    private int _propertyA;
    private int _propertyB;

    public int PropertyA
    {
        get{return _propertyA;}
        set{_propertyA = value;}
    }

    [Obfuscation(Feature = "renaming", Exclude = true)]
    public int DestinationReference
    {
        get{return _propertyB;}
    }
}

混淆的类将被写入像这样的

Class a
{

    int s()
    void z(int a)

    public int DestinationReference
    {
        get{return _propertyB;}
    }
}

这是我使用.Net Reflector

所能看到的假设

我的问题如下: - 在我们的代码中,我们实现了一个方法,该方法使用反射查找类的所有属性,以便查找特定参数 - 此方法在混淆代码中不起作用,因为我的访问者PropertyA已被替换为get访问器和set访问器的两种不同方法。 - 我知道如果我将一个访问者排除在重命名之外,它会在msil代码中保留一个访问者,并且可以通过我的方法查找访问者

我的问题是: - 不是重命名唯一的选择吗? - Dotfuscator中是否有一个参数允许重命名访问者,而不将其分成两个不同的方法并丢失访问者?

我对混淆很新,所以原谅我的不完美之处,这就是我所能看到的与上述反射器类似的类。

Screenshot

正如您所看到的,从重命名中排除的属性将保留具有get访问器的属性。但对于另一个被混淆的人,我可以看到两个不同的方法s和z

我试图看看是否有办法获得单个访问者,例如使用底层getter和setter重命名为“s”

1 个答案:

答案 0 :(得分:1)

我在查看这篇文章后首先找到了一些问题的答案:http://vicky4147.wordpress.com/2007/10/23/exploring-msil-properties/

我看到MSIL生成了get_XXX()方法和set_XXX(int)方法以及添加属性。 Dotfuscator负责重命名get和set方法(这是我们想要的),但也用于删除属性本身(我不想要)

解决方案是启用"库模式"对于混淆的DLL,如果启用了库模式,则文档说明:

  
      
  • 不重命名公共类和嵌套公共类的名称。如果这些类的成员(字段和方法)具有公共,家庭或famorassem访问权限,也不会重命名。
  •   
  • 此外,无论访问说明符如何,都不会重命名虚拟方法。这允许库的客户端在需要时覆盖私有虚拟方法(这是.NET体系结构中允许的行为)。
  •   
  • 除上述规则隐含的排除外,还会应用任何用户指定的自定义重命名排除项。
  •   
  • 始终保留属性和事件元数据。
  •   

这可以在反射器中进行模糊处理后看到,顶部库模式被禁用,底部库模式被启用

Screenshot

可以看出,没有一个公共类/方法/字段被重命名,对我来说更重要的是保留了属性元数据。

现在我的下一个问题是,如何保留属性元数据但允许重命名属性本身。我想找到一个令人满意的解决方案,而无需使用自定义混淆属性定义手动装饰每个属性。

我会继续寻找另一天,如果我找不到任何东西,就会将此答案标记为问题的解决方案。