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