2016-05-12 19 views
0

說我有一個B類從類派生的Mono.Cecil能做到:不能看到孩子上課

B : A 

使用Mono.Cecil能做到,我可以看到A(父類)從組件讀取數據時,但我不能看B.

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 
}}}} 

我的測試程序輸出然後pathfile - 在上面的代碼 - 看起來像這樣:

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

在這個例子中,我可以看到類AES(父類),但不能看到AESManaged類(子類)。 https://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged(v=vs.110).aspx

+0

恐怕你不得不對你到底在做什麼更具體。您應該包括您正在閱讀的程序集的源代碼以及您正在使用的代碼來閱讀它。另見[mcve]。 – svick

+0

根據文檔[AesManaged](https://msdn.microsoft.com/library/system.security.cryptography.aesmanaged)在'System.Core',[Aes](https://msdn.microsoft.com/en/)中定義。 com/library/system.security.cryptography.aes)在'mscorlib'中定義。你有沒有希望在同一個組裝中找到它們? –

+1

你在找什麼課?它位於哪個組件?它的基類是哪一類?該班級在哪個組合? –

回答

0

您的具體問題應該真正爲什麼這段代碼:

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

編譯以下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   

(注:沒有提到AesManaged任何地方)

發生這種情況是因爲AesManaged沒有名爲CreateAes的靜態方法。 C#編譯器允許您通過引用派生類來調用此方法,但在IL級別上,該方法僅爲AesAes的一部分。出於同樣的原因,aes.GenerateKey()被編譯爲對方法SymmetricAlgorithm.GenerateKey的調用,因爲那是該方法實際定義的位置。 (即使AesManaged覆蓋此方法,情況也是如此。)

現在,您要做什麼取決於您的方案。如果您的目標是獲取IL實際使用的類引用,那麼您現有的代碼將按照您的要求進行操作。另一方面,如果您希望獲取源代碼中的引用,則必須使用其他方法(如使用Roslyn進行分析)。

+0

這很有道理。也就是說,按照Microsoft網站的說法:「如果啓用了符合聯邦信息處理標準(FIPS)的算法的Windows安全策略設置,則使用此算法將拋出CryptographicException。」這是我感興趣的。我的代碼應該拋出異常嗎?如果是這樣,那麼我想我必須給Roselyn一個嘗試,如果塞西爾沒有足夠的幫助:) – user2567674

+0

我喜歡每一步我們如何接近你的*真實*問題。那麼你的真實*問題「我如何靜態分析我的代碼以確保沒有可能的FIPS違規」?因爲這隻需要檢測「AesManaged」的使用。 (但是,一開始可能會檢測到沒有參數的情況下對'Aes.Create()'的任何調用,並且這可以在IL級別上完美地完成)。 –

+0

發生這種情況是因爲您已經在這裏和那裏做了很多假設,關於「真正的問題/問題」是什麼。事實上,FIPS合規性評估絕對可以從AESManaged類檢測開始,而不僅僅是Create()方法。這就是說,我想你有點,我可以發現任何將用於新創建的AESManaged對象的函數,作爲解決方法。儘管我更關心如何讓Mono.Cecil發現任何類(不論繼承)。 – user2567674