2009-10-13 6 views
2

Étant donné l'exemple de code source ci-dessous, est-il possible pour quelqu'un de voir la valeur de _secret en utilisant un désassembleur? Je n'ai pas vu un moyen d'obtenir la valeur via Reflector, mais je ne l'ai pas beaucoup utilisé. Supposons que le code ne soit pas obscurci de quelque façon que ce soit.Est-il possible de voir la valeur codée en dur d'une variable membre en utilisant un désassembleur comme Reflector?

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

    public void Foo() 
    { 
     ... 
    } 
} 

Merci!

Répondre

4

Il est visible dans le constructeur dans Reflector.

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

se traduit par le constructeur ayant

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

qui est visible dans le réflecteur sous Foo dans la méthode .ctor.

Vous pouvez également consulter ces informations en ildasm (livré avec Microsoft Visual Studio) dans 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 

Enfin, si quelqu'un connaît le nom de votre type et le nom de votre domaine privé, vous pouvez obtenir la valeur en tant que telle:

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 

Bien sûr, je peux toujours voir tous vos champs privés avec

var fields = typeof(Foo).GetFields(
    BindingFlags.Instance | BindingFlags.NonPublic 
); 
+0

Je pensais que c'était là, mais je ne pouvais pas le trouver. Merci beaucoup! –

2

Oui, c'est possible. La valeur codée en dur sera présente dans l'IL et sera visible via n'importe quel désassembleur .NET. Comme il s'agit d'un champ, son initialisation à partir du littéral sera visible dans le constructeur dans Reflector.

Questions connexes