Можно ли увидеть жестко запрограммированное значение переменной-члена, используя дизассемблер, такой как Reflector? - PullRequest
2 голосов
/ 13 октября 2009

Учитывая приведенный ниже пример исходного кода, может ли кто-нибудь увидеть значение _secret с помощью дизассемблера? Я не видел способа получить значение с помощью Reflector, но я не использовал его очень много. Предположим, что код никак не запутан.

class Foo
{
    private string _secret = @"all your base are belong to us";

    public void Foo()
    {
        ...
    }
}

Спасибо!

Ответы [ 2 ]

4 голосов
/ 13 октября 2009

Это видно в конструкторе в Reflector.

class Foo { private string _secret = @"all your base are belong to us"; }

означает наличие конструктора

public Foo() { this._secret = "all your base are belong to us"; }

, который отображается в Reflector под Foo в методе .ctor.

Вы также можете увидеть эту информацию в ildasm (поставляется с Microsoft Visual Studio) в Foo::.ctor : void:

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {
    // Code size       19 (0x13)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  ldstr      "all your base are belong to us"
    IL_0006:  stfld      string Playground.Foo::_secret
    IL_000b:  ldarg.0
    IL_000c:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0011:  nop
    IL_0012:  ret
} // end of method Foo::.ctor

Наконец, если кто-то знает имя вашего типа и имя вашего личного поля, вы можете получить значение как таковое:

object o = typeof(Foo).GetField(
    "_secret",
    BindingFlags.Instance | BindingFlags.NonPublic
).GetValue(f);
Console.WriteLine(o); // writes "all your base are belong to us" to the console

Конечно, я всегда могу видеть все ваши личные поля с

var fields = typeof(Foo).GetFields(
    BindingFlags.Instance | BindingFlags.NonPublic
);
2 голосов
/ 13 октября 2009

Да, это возможно. Значение в жестком коде будет присутствовать в IL и будет доступно для просмотра через любой дизассемблер .NET. Поскольку это поле, его инициализация из литерала будет видима в конструкторе в Reflector.

...