Ist es möglich, eine Membervariable der hartcodierte Wert mit einem Disassembler wie Reflektor zu sehen?

StackOverflow https://stackoverflow.com/questions/1562174

  •  21-09-2019
  •  | 
  •  

Frage

In Anbetracht des Beispiel-Quellcode unten, ist es möglich, dass jemand den Wert _secret mit einem Disassembler zu sehen? Ich habe einen Weg, nicht auf dem Wert über Reflektor zu bekommen, aber ich habe es nicht sehr viel verwendet. Angenommen, der Code wird nicht in irgendeiner Weise verschleiert.

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

    public void Foo()
    {
        ...
    }
}

Danke!

War es hilfreich?

Lösung

Es ist sichtbar im Konstruktor in Reflector.

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

übersetzt mit Konstruktor

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

, die in Reflector unter Foo in Verfahren .ctor sichtbar ist.

Sie können diese Informationen auch in ildasm sehen (im Lieferumfang von Microsoft Visual Studio) in 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

Schließlich, wenn jemand den Namen Ihrer Art und den Namen Ihres privaten Bereich kennt, können Sie den Wert als solche erhalten:

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

Natürlich kann ich immer alle Ihre privaten Felder mit

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

Andere Tipps

Ja, ist es möglich. Der hartcodierte Wert wird im IL vorhanden sein und wird sichtbar über jeden .NET-Disassembler. Da dies ein Bereich ist, wird ihre Initialisierung von den wörtlichen im Konstruktor in Reflector angezeigt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top