我们通过混淆器运行我们的.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代码后,纯文本中唯一的值是const string
。这适用于两种不同的混淆工具:
.field private static literal string a = "MyConstString" // using Dotfuscator
.field private static literal string '[SOH]' = "MyConstString" // using RedGate SmartAssembly
答案 0 :(得分:4)
对于const
字段,它们的值必须直接包含在程序集中,没有办法解决这个问题。那是因为编译器必须能够获得这样的字段的值,而不执行任何自定义代码。
对于static readonly
字段,混淆器可以使用静态构造函数来执行它想要的任何代码,这意味着它们可以被混淆。
答案 1 :(得分:0)
如果它是静态的,那么字符串值就存在于程序的数据段中,它具有一个地址,并在其地址中引用(在代码中)。
然而,如果它是const,那么它在代码段中存在一个字符串文字。