Ist es möglich, eine Membervariable der hartcodierte Wert mit einem Disassembler wie Reflektor zu sehen?
-
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!
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
siehevar 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.