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 コードを見ると、プレーン テキストの唯一の値はconst string. これは、次の 2 つの異なる難読化ツールに当てはまります。

.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 に答える