字符串混淆的const和静态readonly之间的区别?

时间:2012-12-04 14:50:46

标签: .net obfuscation

我们通过混淆器运行我们的.NET二进制文件(至少启用了字符串混淆),稍后在构建过程中进行一些基本检查以验证这一点。我很惊讶地注意到,通过将字符串从static readonly string更改为const string,现在可以在查看反汇编代码时通过纯文本显示已更改的字符串(通过ildasm输出)。

关于字符串混淆,const stringstatic readonly string之间有什么区别?

编辑: 举例来说,这是一个小程序:

class Program
{
    private const string MyConstString = "MyConstString";
    private static readonly string MyStaticReadonlyString = "MyStaticReadonlyString";

    static void Main(string[] args)
    {
        string myLocalString = "myLocalString";

        Console.WriteLine(MyConstString);
        Console.WriteLine(MyStaticReadonlyString);
        Console.WriteLine(myLocalString);

        Console.WriteLine("Hit <ENTER> to exit");
        Console.ReadLine();
    }
}

查看.il代码后,纯文本中唯一的值是const string。这适用于两种不同的混淆工具:

.field private static literal string a = "MyConstString"       // using Dotfuscator
.field private static literal string '[SOH]' = "MyConstString" // using RedGate SmartAssembly

2 个答案:

答案 0 :(得分:4)

对于const字段,它们的值必须直接包含在程序集中,没有办法解决这个问题。那是因为编译器必须能够获得这样的字段的值,而不执行任何自定义代码。

对于static readonly字段,混淆器可以使用静态构造函数来执行它想要的任何代码,这意味着它们可以被混淆。

答案 1 :(得分:0)

如果它是静态的,那么字符串值就存在于程序的数据段中,它具有一个地址,并在其地址中引用(在代码中)。

然而,如果它是const,那么它在代码段中存在一个字符串文字。