5

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

const string关于字符串混淆,和有什么区别static 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 代码后,纯文本中的唯一值是 .il 代码const string。这适用于两种不同的混淆工具:

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

2 回答 2

5

对于const字段,它们的值只需直接包含在程序集中,这是没有办法的。这是因为编译器必须能够获取此类字段的值,而无需执行任何自定义代码。

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

于 2012-12-04T20:43:17.050 回答
0

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

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

于 2012-12-04T14:54:07.230 回答