我的问题是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中是否有一个参数允许重命名访问者,而不将其分成两个不同的方法并丢失访问者?
我对混淆很新,所以原谅我的不完美之处,这就是我所能看到的与上述反射器类似的类。
正如您所看到的,从重命名中排除的属性将保留具有get访问器的属性。但对于另一个被混淆的人,我可以看到两个不同的方法s和z
我试图看看是否有办法获得单个访问者,例如使用底层getter和setter重命名为“s”
答案 0 :(得分:1)
我在查看这篇文章后首先找到了一些问题的答案:http://vicky4147.wordpress.com/2007/10/23/exploring-msil-properties/
我看到MSIL生成了get_XXX()方法和set_XXX(int)方法以及添加属性。 Dotfuscator负责重命名get和set方法(这是我们想要的),但也用于删除属性本身(我不想要)
解决方案是启用"库模式"对于混淆的DLL,如果启用了库模式,则文档说明:
- 不重命名公共类和嵌套公共类的名称。如果这些类的成员(字段和方法)具有公共,家庭或famorassem访问权限,也不会重命名。
- 此外,无论访问说明符如何,都不会重命名虚拟方法。这允许库的客户端在需要时覆盖私有虚拟方法(这是.NET体系结构中允许的行为)。
- 除上述规则隐含的排除外,还会应用任何用户指定的自定义重命名排除项。
- 始终保留属性和事件元数据。
这可以在反射器中进行模糊处理后看到,顶部库模式被禁用,底部库模式被启用
可以看出,没有一个公共类/方法/字段被重命名,对我来说更重要的是保留了属性元数据。
现在我的下一个问题是,如何保留属性元数据但允许重命名属性本身。我想找到一个令人满意的解决方案,而无需使用自定义混淆属性定义手动装饰每个属性。
我会继续寻找另一天,如果我找不到任何东西,就会将此答案标记为问题的解决方案。