.net 字符串混淆的常量和静态只读之间的区别?

.net 字符串混淆的常量和静态只读之间的区别?,.net,obfuscation,.net,Obfuscation,我们通过模糊处理程序运行.NET二进制文件(至少启用了字符串模糊处理),然后在构建过程中进行一些基本检查以验证这一点。我惊讶地注意到,通过将字符串从静态只读字符串更改为常量字符串,在查看反汇编代码时(通过ildasm输出),更改后的字符串现在可以在纯文本中看到 关于字符串混淆,const string和静态只读字符串之间有什么区别? 编辑: 举个例子,这里有一个小程序: class Program { private const string MyConstString = "MyCon

我们通过模糊处理程序运行.NET二进制文件(至少启用了字符串模糊处理),然后在构建过程中进行一些基本检查以验证这一点。我惊讶地注意到,通过将字符串从
静态只读字符串
更改为
常量字符串
,在查看反汇编代码时(通过
ildasm
输出),更改后的字符串现在可以在纯文本中看到

关于字符串混淆,
const 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();
    }
}

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


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

对于
const
字段,它们的值必须直接包含在程序集中,这是无法避免的。这是因为编译器必须能够在不执行任何自定义代码的情况下获取此类字段的值


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

这对字符串混淆有何影响?我之所以选择“community wiki”,是因为我不确定这个答案是否正确,但我没有删除它,以防它有用。@jgluie这取决于模糊器的实现方式:例如,模糊器可能在运行时解密数据段,或者在从数据段读取字符串值时及时解密字符串值。使用模糊器,字符串
“Foo”
是否在以下代码中被混淆<代码>控制台.WriteLine(“Foo”)@DanielHilgarth是的,这是模糊的。@RedGate的SmartAssembly 6也会发生错误。为什么模糊器不能修改常量值并调整使用常量值的每个位置?因为它不可能知道“其他每个位置”是什么。您可能正在使用反射检索
常量的值,而模糊处理程序将无法调整该值。对于
public
const
s(在
public
类型中),情况更糟,因为任何人都可以从外部使用它。对于静态只读字符串也可以使用相同的参数,对吗?模糊处理程序不知道值是通过反射读取的还是在外部使用的,但它还是对这些值进行了模糊处理。@jgluie但通过反射加载模糊处理的
只读
字段仍然有效,因为在执行模糊处理的代码后,您会得到正确的值。使用
const
s,区别在于不可能有任何代码。
.field private static literal string a = "MyConstString"       // using Dotfuscator
.field private static literal string '[SOH]' = "MyConstString" // using RedGate SmartAssembly