2016-05-12 13 views
0

Say sehen Ich habe eine Klasse B, die von der Klasse abgeleitet AMono.Cecil: nicht Kind Klasse

B : A 

Wenn von der Baugruppe lesen Mono.Cecil Verwendung Ich kann A (die übergeordnete Klasse) sehen, aber ich im obigen Code - -

AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(pathfile); 
foreach (TypeDefinition type in assembly.MainModule.Types) 
     { 
      foreach (MethodDefinition method in type.Methods) 
      { 
       Mono.Cecil.Cil.MethodBody mybody = method.Body; 

       if (mybody != null) 
       { 
        foreach (Mono.Cecil.Cil.Instruction ins in mybody.Instructions) 
        { // do stuff 
}}}} 

Mein Testprogramm ausgegeben wird, dann pathfile nicht B. sehen und sieht wie folgt aus:

static void Main(string[] args) 
    { 
     using (var aes = System.Security.Cryptography.AesManaged.Create()) 
     { 
      aes.GenerateKey(); 
     } 
    } 

In diesem Beispiel kann ich die Klasse AES (Elternklasse) sehen, aber nicht die AESManaged (Kindklasse). https://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged(v=vs.110).aspx

+0

Ich fürchte, Sie müssen viel genauer darüber sein, was genau Sie tun. Sie sollten die Quelle der Assembly, die Sie gerade lesen, und den Code, mit dem Sie sie lesen, angeben. Siehe auch [mcve]. – svick

+0

Laut der Dokumentation ist [AesManaged] (https://msdn.microsoft.com/library/system.security.cryptography.aesmanaged) in 'System.Core', [Aes] (https://msdn.microsoft.microsoft.com) definiert. com/library/system.security.cryptography.aes) ist in 'mscorlib' definiert. Sie erwarten nicht zufällig, sie in ein und derselben Versammlung zu finden? –

+1

Nach welcher Klasse suchen Sie? In welcher Baugruppe befindet es sich? Welche Klasse ist ihre Basisklasse? In welcher Baugruppe befindet sich die Klasse? –

Antwort

0

Ihre spezielle Frage sollte wirklich sein, warum dieses Stück Code:

static void Main(string[] args) 
{ 
    using (var aes = System.Security.Cryptography.AesManaged.Create()) 
    { 
     aes.GenerateKey(); 
    } 
} 

Compiliert an folgenden IL:

IL_0000: call  System.Security.Cryptography.Aes.Create 
IL_0005: stloc.0  // aes 
IL_0006: ldloc.0  // aes 
IL_0007: callvirt System.Security.Cryptography.SymmetricAlgorithm.GenerateKey 
IL_000C: leave.s  IL_0018 
IL_000E: ldloc.0  // aes 
IL_000F: brfalse.s IL_0017 
IL_0011: ldloc.0  // aes 
IL_0012: callvirt System.IDisposable.Dispose 
IL_0017: endfinally 
IL_0018: ret   

(. Hinweis: keine Erwähnung AesManaged überall)

Dies passiert, weil AesManaged keine statische Methode namens Create, Aes hat. Mit dem C# -Compiler können Sie diese Methode aufrufen, indem Sie auf die abgeleitete Klasse verweisen, aber auf der IL-Ebene ist die Methode nur Teil von Aes und Aes. Aus dem gleichen Grund wird aes.GenerateKey() als Aufruf an die Methode SymmetricAlgorithm.GenerateKey kompiliert, da dort die Methode tatsächlich definiert ist. (Dies gilt, obwohl AesManaged diese Methode überschreibt.)

Nun, was Sie tun möchten, hängt davon ab, Ihr Szenario. Wenn es Ihr Ziel ist, die Klassenreferenzen so zu erhalten, wie sie tatsächlich von der IL verwendet werden, dann tut Ihr bestehender Code, was Sie wollen. Wenn Sie andererseits die Referenzen so erhalten möchten, wie sie im Quellcode enthalten sind, müssen Sie eine andere Methode verwenden (wie die Analyse mit Roslyn).

+0

Das macht Sinn. Wie auf der Microsoft-Website heißt es: "Wenn die Windows-Sicherheitsrichtlinieneinstellung für FIPS-kompatible (Federal Information Processing Standards) -echte Algorithmen aktiviert ist, löst die Verwendung dieses Algorithmus eine CryptographicException aus." und das ist, was mich interessiert. Mein Code sollte eine Ausnahme richtig machen? Wenn ja, dann muss ich Roselyn einen Versuch geben, wenn Cecil nicht genug hilft :) – user2567674

+0

Ich mag es, wie wir mit jedem Schritt näher an deine * echte * Frage kommen. Also ist deine * echte * Frage: "Wie analysiere ich meinen Code statisch, um sicherzustellen, dass es keine möglichen FIPS-Verstöße gibt?" Weil das etwas mehr braucht, als nur die Verwendung von 'AesManaged' zu erkennen. (Aber ein Anfang könnte sein, irgendeinen Aufruf von 'Aes.Create()' ohne ein Argument zu finden, und dies kann perfekt auf der IL-Ebene durchgeführt werden.) –

+0

Das passiert, weil Sie hier und da einige Annahmen getroffen haben Was die "echte Frage/Problem" ist. Tatsächlich könnte die FIPS-Konformitätsbewertung mit der Erkennung von AES-verwalteten Klassen beginnen, nicht nur mit der Create() -Methode. Davon abgesehen denke ich, dass Sie einen Punkt haben, ich könnte sicherlich eine Funktion erkennen, die auf einem neu erstellten AESManaged-Objekt als Workaround verwendet werden würde. Obwohl ich mehr daran interessiert war, zu verstehen, wie ich Mono.Cecil dazu bringen konnte, jede Klasse zu entdecken (unabhängig von der Vererbung). – user2567674