簡體   English   中英

如何確定在已編譯的.Net或Java應用程序中引用了哪些類?

[英]How to determine which classes are referenced in a compiled .Net or Java application?

我想知道是否有一種簡單的方法來確定已編譯的.NET或Java應用程序在“使用”庫中的哪些類,並且我需要編寫一個簡單的實用程序來做到這一點(因此使用任何可用的反編譯器都不會這樣做)工作)。

我不需要分析不同的輸入就可以確定是否為此輸入集實際創建了一個類-我只關心是否在應用程序中引用了該類。 應用程序很可能會從我要查找和使用的子類中繼承子類。

我已經用十六進制編輯器瀏覽了一堆.Net .exe和Java .class,看來引用的類是用明文拼寫出來的,但是我不確定是否總是這樣-我對MSIL的了解/ Java字節碼還不夠。 我假設即使應用程序本身可以被混淆,它仍必須使用原始名稱來調用庫類?

延伸過度懈怠的說法

編輯:出於某種原因,我以為您問的是方法而不是類型

類型

就像查找方法一樣,這並不涵蓋通過Reflection API的訪問。

您必須在Reflector插件中找到以下內容,以標識引用的類型並執行傳遞閉包

  • 方法參數
  • 方法返回類型
  • 自定義屬性
  • 基本類型和接口實現
  • 局部變量聲明
  • 評估子表達式類型
  • 字段,屬性和事件類型

如果您自己解析IL,那么您要做的就是從主程序集中處理TypeRef和TypeSpec元數據,這非常簡單(當然,我是在這里解析整個字節碼的)。 但是,傳遞閉包仍然需要您處理引用程序集中每個引用方法的完整字節碼(以獲取子表達式類型)。

方法

如果您可以為Reflector編寫插件來處理任務,那肯定是最簡單的方法。 解析IL並非易事,盡管我現在已經完成了,所以如果需要的話,我只會使用該代碼(只是說這並非不可能)。 :d

請記住,您可能具有在第一遍中沒有看到的方法依賴性,因此上述兩種方法都無法捕獲。 這些是由於通過callvirt (虛擬方法和接口方法調用)和calli (通常是委托)指令進行的間接分派。 對於使用newobj創建的每個T類型以及該類型中的每個方法M ,您都必須檢查所有callvirtldftnldvirtftn指令,以查看目標的基本定義 (如果目標是虛擬方法)是否為如果目標是接口方法,則與TM中的M的基本方法定義相同,位於類型的接口映射中 這不是完美的,但是它是在沒有定理證明者的情況下可以進行靜態分析的最佳方法。 它是將在Reflection API外部調用的實際方法的超集,並且是程序集中完整方法集的子集。

對於.NET:似乎在MSDN有一篇文章可以幫助您入門。 就其價值而言,對於.NET而言,神奇的Google詞是“ .net程序集引用”。

在Java中,找到類依賴關系(以編程方式)的最佳機制是通過字節碼檢查 這可以通過BCEL或(最好是) ASM之類的庫來完成。 如果您希望使用自己的代碼來解析類文件,則Java VM規范中很好地記錄了類文件結構

請注意,類檢查不會涵蓋運行時依賴項(例如,使用service API加載的類)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM