控制機器代碼的本機圖像訪問操作系統資源的系統及方法
【技術領域】
[0001] 本公開內容設及計算機科學領域,并且更具體地設及用于控制機器代碼的本機圖 像訪問計算機裝置的操作系統資源的系統及方法。
【背景技術】
[0002] 目前,可安裝在用戶裝置(例如,個人計算機、智能電話、平板電腦等)上的軟件應 用顯著地增長,且可由運些應用創建的文件的數目也指數地上升。在應用的安裝和運行時 由軟件應用創建的某些文件是唯一的,即,文件可作為單一副本存在。很難在不執行其內容 的詳細分析的情況下分類此類文件。
[0003] 通常,運些文件可為機器代碼中的父程序集的圖像(即,本機圖像),運是.肥T技術 的一部分。.肥T應用可使用一定數目的程序集一起創建,其中程序集為由公共語言運行(" CLR")環境輔助的二進制文件。.肥T程序集包括W下元數據元素:
[0004] ?可移植執行("PE")文件標頭;
[0005] ?化晰頭;
[0006] .公共中間語言("CIL")代碼;
[0007] .在各種類型的程序集中使用的元數據(例如,類別、接口、結構、列舉 (enumerations)、委托);
[000引.程序集的清單;W及
[0009] ?額外的內置資源。
[0010] 大體上,PE標頭識另帷序集可在Window?系列的操作系統中加載和執行。陽標頭 還識別應用(例如,控制臺應用、具有圖形用戶接口的應用、代碼庫等)的類型。
[00川化財示頭構成可支持所有.肥T程序集W便它們可在化R環境中維護的數據。CLR標 頭包含諸如標記、CLR版本、入口點(例如,在特定情況下,開始函數Main0的地址),運允許 執行環境確定管理的文件的組成(即,包含管理代碼的文件)。
[0012] 各個程序集均包含CIL代碼,其為并非依賴處理器的中間代碼。在執行期間,CIL代 碼由JIT(準時,即,動態編譯)W實時模式編譯成對應于特定處理器的要求的指令。
[0013] 在任何給定程序集中,還存在完整描述存在于程序集內的類型(例如,類別、接口、 結構、計數、委托等)W及程序集參照的外部類型(即,其它程序集中描述的類型)的格式的 元數據。在可執行環境中,元數據用于確定二進制文件中的類型的位置,W將類型置于存儲 器中,且簡化類型的方法的遠程調用的進程。
[0014] 程序集還可包含清單,其描述組成程序集的各個模塊、程序集的版本W及還有當 前程序集參照的任何外部程序集。清單還包含指定程序集的版本和身份的程序集的要求所 需的所有元數據,W及確定程序集的范圍和允許鏈接至資源和類別所需的所有元數據。下 表示出了包含在程序集的清單中的數據。前四個元素(程序集名稱、版本號、語言和區域參 數,W及強名稱數據)構成程序集的身份。
[0015]
[0017] 任何.肥τ程序集都可包含任何給定數目的嵌入資源,如,應用圖標、圖形文件、音 頻片段或字符串表。
[0018] 程序集可由若干模塊構成。模塊為程序集的一部分,即,代碼或資源的邏輯收集。 用于程序集中的實體的等級為:程序集 >模塊> 類型(類別、接口、結構、計數、委托 (delegate))>方法。模塊可為內部(即,程序集的文件內)或外部的(即,分離文件)。模塊沒 有入口點,其也不具有任何獨立的版本號,且因此其不可由化R環境直接地載入。模塊僅可 由程序集的主模塊載入,如,包含程序集的清單的文件。模塊的清單僅包含所有外部程序集 的計數。各個模塊均具有模塊版本標識符("MVID"),其為程序集的各個模塊中寫出的唯一 標識符,其在各次編譯期間變化。
[0019] 圖1A示出了單文件程序集的示例性布局。如圖所示,在單文件程序集中,所有要求 元素(例如,標頭、CIL代碼、類型的元數據、清單和資源)位于單個文件*.exe或*.dll內。
[0020] 圖1B示出了多文件程序集的實例。多文件程序集由一組.肥T模塊構成,其W單個 邏輯單元的形式配置,且設有相同的版本號。通常,運些模塊中的一個稱為主模塊,且包含 程序集的清單,且還可包含所有所需的CIL指令、元數據、標頭和附加資源。
[0021] 主模塊的清單描述主模塊的操作依賴的所有其它相關模塊。多文件程序集中的次 級模塊可分配擴展名*. netmodule。次級*. netmodule模塊也包含CIL代碼和類型的元數據, W及模塊的水平的清單,其中列舉了由給定模塊所需的外部程序集。
[0022] 正如任何PE文件,程序集可利用數字簽名(例如,X. 509)來簽名,其位于PE文件或 數字簽名目錄文件(.cat)的疊加部分(overlay)中。強名稱簽名另外或單獨使用,即,通過 使用程序集的內容和RSA私鑰生成的哈希值。哈希值位于PE標頭與元數據之間的程序集中。 哈希值使得有可能檢查程序集從其編譯時的時間起沒有變化。對于單文件程序集,當編譯 文件時,在PE標頭之后沒有字節。文件的哈希值然后使用私鑰計算,且所得的哈希值輸入運 些可用的字節中。
[0023] 該技術對于多文件程序集是不同的。除程序集的主文件的哈希值之外,還計算外 部模塊的哈希值,此后,數據輸入主程序集中。模塊沒有其自身的簽名,且它們具有不同于 主模塊的MVID。W下項目輸入程序集的清單中:
[0024] . PublicK巧,即,強名稱簽名的公鑰,W及
[00巧]?化blicK巧Token,即,強名稱簽名的密鑰的公開部分的哈希。
[0026] 通常,程序集分成:私密和公開/共享。私密程序集應當總是位于與它們用于其中 的客戶應用相同的目錄(即,應用目錄)中或其子目錄中的一個中。
[0027] 相比之下,公開程序集可同時用于同一裝置上的若干應用中。公開程序集并非位 于與它們被認為應用其中的應用相同的目錄內。相反,它們可安裝在全局程序集緩存(GAC) 中。GAC可同時位于如下表所示的若干位置中:
[002引
[0029] 安裝在GAC中的程序集應當具有強名稱。強名稱是用于COM中的全局唯一標識符 (GUID)的當代.肥T等同物。不同于128位數字的COM中的GUID值,.肥T的強名稱部分地基于 稱為公開密鑰和秘密(私密)密鑰的兩個相關加密密鑰。
[0030] 強名稱由一組相關數據構成,至少包括:
[0031] .程序集的名稱(沒有文件擴展名的程序集的名稱)。
[0032] .程序集的版本號;
[0033] ?公鑰值;
[0034] .指定區域的值,其不是強制的,且可用于應用的定位;W及
[0035] ?利用從程序集的內容和私鑰的值獲得的哈希值創建的數字簽名。
[0036] 為了創建程序集的強名稱,例如,用戶可獲得公鑰和私鑰,公鑰和私鑰的數據由提 供為.肥T框架SDK的一部分的實用程序sn.exe生成。實用程序生成包含用于兩個不同但數 學上相關的密鑰(公鑰和私鑰)的數據的文件。該文件的位置然后向編譯器指出,編譯器寫 出程序集的清單中的公鑰的全部值。
[0037] 在特定情況中,編譯器基于程序集的全部內容(例如,CIL代碼、元數據等)生成對 應的哈希值。哈希值是對于固定輸入數據在統計上唯一的數值。因此,在.NET程序集的任何 數據(甚至字符串字面值中的單個字符)的變化的情況下,編譯器將生成不同的哈希值。生 成的哈希值然后與包含在文件內的私鑰數據組合,W獲得插入CL財示頭數據內的程序集中 的數字簽名。
[0038] 圖1C示出了用于生成強名稱的示例性進程。通常,私鑰數據未在清單中指出,而是 僅用于由數字簽名(連同生成的哈希值)識別程序集的內容。在完成創建和分配強名稱的進 程之后,程序集可安裝在GAC中。
[0039] 例如,至GAC中的程序集的路徑可為:
[0040] C:\Windows\assembly\GAC_32\KasperskyLab\2.0.0.0__b03f5f7f1Id50a3a\ KasperskyLab.dll,其中:
[0041 ] C: \Windows\assembly 是至 GAC 的路徑;
[0042] \GAC_32是處理器的GAC結構;
[0043] \KasperskyLab是