專利名稱:使用部分映像散列確認(rèn)可執(zhí)行文件完整性的系統(tǒng)和方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)認(rèn)證或驗證。
背景技術(shù):
運行在用戶計算機上的可執(zhí)行文件可能包括病毒或特洛伊木馬。可執(zhí)行文件也被稱為二進制映像,且包括,例如,諸如可移植可執(zhí)行代碼(PE)、宏、如VisualBasic腳本(VBS)的腳本等任何可執(zhí)行對象。病毒是修改磁盤上的二進制映像的程序或代碼片段,一般違背用戶意愿且不為用戶所知。病毒也可以自我復(fù)制。反復(fù)制作自己的副本的簡單病毒相對較容易產(chǎn)生。即使這樣的簡單病毒也是危險的,因為它們可能會迅速使用所有可用的存儲器,造成系統(tǒng)停機。其它危險類型的病毒能夠在網(wǎng)絡(luò)上傳輸自己并繞過安全系統(tǒng)。與病毒不同,特洛伊木馬不自我復(fù)制,但是它們可以一樣有破壞性,通常將自己化裝為良性應(yīng)用程序。例如,特洛伊木馬可以是由不受懷疑的用戶獨立裝入的。隱伏類型的特洛伊木馬是聲稱使你的計算機擺脫病毒而實際將病毒引入至你的計算機的程序。從而,在計算機上運行可執(zhí)行文件可能是危險的。
標(biāo)識已被例如病毒或特洛伊木馬破壞的可執(zhí)行代碼的一種方法涉及當(dāng)將可執(zhí)行文件安裝或下載至計算設(shè)備時使用可信的密碼散列。密碼散列或簡稱為“散列”,將可執(zhí)行文件編譯為概括的形式,即摘要。可信散列在散列的創(chuàng)建時間已知為良好的,或表示未被破壞的代碼。為了為可執(zhí)行文件(即,二進制映像、可執(zhí)行代碼、腳本、宏等)生成可信散列,在可執(zhí)行文件,包括諸如數(shù)據(jù)等相關(guān)聯(lián)的資源上執(zhí)行消息摘要或校驗和計算,以在將該可執(zhí)行文件從一個位置傳送至另一個位置之前獲取第一結(jié)果。在已傳送的可執(zhí)行文件上進行同一計算來獲取第二結(jié)果。將第一結(jié)果與第二結(jié)果比較,來確定所接收的可執(zhí)行文件是否是原來發(fā)送的同一數(shù)據(jù)。例如,如果之前和之后的計算結(jié)果匹配,那么所接收的數(shù)據(jù)很可能是正確的。否則,所接收的可執(zhí)行文件已被破壞。以這種方式,對完全二進制映像散列的使用有效地減少了下載或安裝已破壞的二進制映像的風(fēng)險。
發(fā)明內(nèi)容
描述了用于使用部分映像散列來確認(rèn)可執(zhí)行文件的完整性的系統(tǒng)和方法。在一個方面,生成多個部分映像散列,其組合表示整個二進制映像的摘要。在將該二進制映像加載至計算設(shè)備之后,截取將該二進制映像的一部調(diào)頁調(diào)頁至存儲器來執(zhí)行的請求。響應(yīng)于截取該請求,并在將該部分調(diào)頁至存儲器來執(zhí)行之前,計算該部分的確認(rèn)散列。將確認(rèn)散列與該多個部分映像散列中的部分散列進行比較,來確定該部分的代碼完整性。該部分散列表示與該部分相同的代碼段。
附圖中,組件參考標(biāo)號的最左位數(shù)字標(biāo)識其中該組件首次出現(xiàn)的特定附圖。
圖1示出了使用部分散列來確認(rèn)可執(zhí)行文件的完整性的示例性系統(tǒng)。
圖2示出了使用部分散列來確認(rèn)可執(zhí)行文件的完整性的示例性過程。
圖3示出了可在其中完全或部分實現(xiàn)使用部分散列來確認(rèn)可執(zhí)行文件的完整性的系統(tǒng)和方法的合適的計算環(huán)境的示例。
具體實施例方式
綜述一般在執(zhí)行可執(zhí)行代碼之前的任一時刻僅將該代碼的一部分映射至存儲器,來有效地利用處理和存儲器資源。例如,調(diào)頁是由虛擬存儲器操作系統(tǒng)用于在任一時刻將可執(zhí)行文件(例如,PE文件)的僅某些字節(jié)作為代碼從存儲設(shè)備加載/映射至存儲器的技術(shù)。例如,當(dāng)計算機程序需要不在主存儲器中的一頁時,操作系統(tǒng)將所需的頁復(fù)制至存儲器。在另一示例中,諸如VB腳本引擎等腳本引擎可以將一部分腳本(獨立于任何頁或頁大小概念的部分)作為代碼從存儲設(shè)備映射至存儲器。
考慮到用來將不同類型和數(shù)量的可執(zhí)行代碼加載至存儲器用于執(zhí)行的不同技術(shù),并為討論起見,在后文中短語“一部分”指示任意數(shù)量的字節(jié),其中字節(jié)的數(shù)量對于正被執(zhí)行的特定代碼-存儲器加載操作是適當(dāng)?shù)?。例如,對調(diào)頁操作,短語“一部分”或“部分”指的是由頁邊界(一頁或多頁)描述的多個字節(jié)。在另一示例中,對于非調(diào)頁操作(例如,由腳本引擎執(zhí)行的可執(zhí)行代碼存儲器加載操作),短語“一部分”或“部分”指的是對用于將代碼/腳本移動至存儲器以供后續(xù)執(zhí)行的特定實現(xiàn)適當(dāng)?shù)亩鄠€字節(jié)。無論使用何種技術(shù)來將可執(zhí)行代碼加載至存儲器用于執(zhí)行,在這樣的部分中的字節(jié)數(shù)是任意的,且一般比完整的可執(zhí)行文件中的字節(jié)數(shù)少,通常是由正被實現(xiàn)的特定可執(zhí)行代碼加載體系結(jié)構(gòu)決定的。
加載至存儲器的部分可執(zhí)行代碼的字節(jié)大小一般小于完整的可執(zhí)行文件的大小的一個原因是,由于將完整的可執(zhí)行文件加載至存儲器一般所需過高數(shù)量的存儲器和處理資源,尤其是當(dāng)僅調(diào)度了小部分(例如,一頁或多頁)可執(zhí)行文件來執(zhí)行時。例如,當(dāng)可執(zhí)行文件被安裝至數(shù)據(jù)存儲設(shè)備之后,如果在將整個映像(可執(zhí)行文件)的第一部分加載至存儲器中用于執(zhí)行之前剛確認(rèn)該映像的單個散列,那么存儲器和處理器資源將不能被有效利用。這是因為計算完整映像散列需要將整個可執(zhí)行文件調(diào)頁至存儲器中。
這樣的進程要求對代碼片段、數(shù)據(jù)和/或資源進行調(diào)頁,這些代碼片段、數(shù)據(jù)和/或資源在正常調(diào)頁操作環(huán)境中,即使有過調(diào)頁操作也不會在該特定時刻被頁入。這樣的部分加載操作在資源和性能開銷方面基本上也是過高的。為這些原因,當(dāng)將代碼的一部分映射至存儲器中用于執(zhí)行來確定與該部分相關(guān)聯(lián)的代碼是否已被破壞時使用完全映像散列是不現(xiàn)實的。從而,可執(zhí)行代碼加載體系結(jié)構(gòu)一般加載遠(yuǎn)小于完整的可執(zhí)行文件的部分至存儲器用于執(zhí)行。這確保了有效地使用存儲器和處理資源。
鑒于上述原因,當(dāng)可執(zhí)行文件的一部分被調(diào)頁至存儲器中,如果該部分自上一次進行完全可執(zhí)行文件散列完整性檢查以來已被破壞,那么現(xiàn)有系統(tǒng)在執(zhí)行該被破壞的代碼之前根本不會檢測到該被破壞的代碼。到此刻,被破壞的代碼已經(jīng)可能損害了系統(tǒng)的一個或多個部分的完整性。換言之,如果在完整性檢查之后頁被破壞,那么實現(xiàn)完全映像完整性檢查的任何現(xiàn)有系統(tǒng)可能會遇到問題。為此,運行可執(zhí)行文件仍舊十分危險。
與常規(guī)的代碼完整性基礎(chǔ)架構(gòu)相反,以下描述的用于確認(rèn)可執(zhí)行文件完整性的系統(tǒng)和方法在緊接將代碼移動(調(diào)頁等)至存儲器中來執(zhí)行之前,使用部分散列來檢測任何代碼是否在安裝至系統(tǒng)之后已被破壞。該系統(tǒng)和方法不依賴于常規(guī)系統(tǒng)的完全映像散列基礎(chǔ)架構(gòu)就可達(dá)到這一目的。為此,該系統(tǒng)和方法為每一可執(zhí)行文件生成多個散列。每一個別的散列表示該可執(zhí)行文件的相應(yīng)部分,使得每一散列是少于該可執(zhí)行文件的所有字節(jié)的摘要。在該實現(xiàn)中,例如,每一散列是可執(zhí)行文件的相應(yīng)頁的摘要——即,按頁散列。(頁中的字節(jié)數(shù)是任意的,且是由該特別實現(xiàn)的調(diào)頁體系結(jié)構(gòu)來決定的。)在另一實現(xiàn)中,每一散列不是按頁散列,而是表示少于或多于可執(zhí)行文件的一頁的摘要。
由于該系統(tǒng)和方法從存儲設(shè)備中加載可執(zhí)行文件的一部分(例如,一頁或其它)至存儲器,該系統(tǒng)和方法僅檢查該部分的完整性。這導(dǎo)致極小的資源或性能影響,因為無需加載可執(zhí)行文件(例如,整個可執(zhí)行文件)的任何其它/無關(guān)的部分就可以確認(rèn)該部分。
當(dāng)用于使用部分散列來確認(rèn)可執(zhí)行文件的完整性的系統(tǒng)和方法標(biāo)識將被加載至存儲器的可執(zhí)行文件的破壞的部分,例如作為進頁操作的一部分時,該破壞的部分不被映射至存儲器來執(zhí)行。在一種實現(xiàn)中,當(dāng)在調(diào)頁操作中標(biāo)識可執(zhí)行文件的破壞的部分時,相應(yīng)的進頁操作失敗,在某些實現(xiàn)中這會拋出異常。以這種方式,該系統(tǒng)和方法在可以執(zhí)行代碼之前檢測代碼的破壞頁。這基本上減少了執(zhí)行可執(zhí)行文件的風(fēng)險,從而提供了對抗涉及可執(zhí)行文件的病毒、特洛伊木馬攻擊和/或類似物的額外保護。
現(xiàn)在將詳細(xì)描述用于使用部分散列來確認(rèn)可執(zhí)行文件的完整性的系統(tǒng)和方法的這些和其它方面。
示例性系統(tǒng)盡管并非必需,但將在由諸如個人計算機等計算設(shè)備執(zhí)行的計算機可執(zhí)行指令(程序模塊)的通用語境中描述用于使用部分散列來確認(rèn)可執(zhí)行文件的完整性的系統(tǒng)和方法。程序模塊一般包括例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等,它們執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。盡管該系統(tǒng)和方法是在前述語境中描述的,后文描述的動作和操作也可以用硬件實現(xiàn)。
圖1示出了用于使用部分散列來確認(rèn)可執(zhí)行文件的完整性的示例性系統(tǒng)100。在該實現(xiàn)中,系統(tǒng)100包括客戶計算設(shè)備102。計算設(shè)備102是任何類型的計算設(shè)備,諸如個人計算機、膝上型計算機、服務(wù)器、小形狀因子移動計算設(shè)備(例如,手機、個人數(shù)字助理或手持式計算機)等。計算設(shè)備102包括程序模塊104和程序數(shù)據(jù)106。程序模塊102包括,例如,為可執(zhí)行文件的各個部分生成多個密碼散列(即,部分映像散列108)的一個或多個計算機程序模塊,以及在代碼調(diào)頁(或部分加載)操作中使用多個密碼散列中相應(yīng)的一個來確認(rèn)可執(zhí)行文件的程序模塊。例如,按部分的可執(zhí)行文件散列模塊110為可執(zhí)行文件的各個部分生成部分映像散列108。在該實現(xiàn)中為文件系統(tǒng)插件(例如,過濾器驅(qū)動程序)的映像部分完整性驗證模塊112在代碼調(diào)頁操作中使用所生成的密碼散列來確認(rèn)該可執(zhí)行文件。為說明起見,用于對密碼求散列以生成部分映像散列108的可執(zhí)行文件被示為“其它數(shù)據(jù)”114的各個部分。
為討論和說明起見,按部分的可執(zhí)行文件散列模塊110和映像部分完整性確認(rèn)模塊112被示為在單個計算設(shè)備102上實現(xiàn)。然而,這些程序模塊可以在含有計算設(shè)備102的所有程序模塊104和程序數(shù)據(jù)106或其子集的不同計算設(shè)備上實現(xiàn)。例如,在一個實現(xiàn)中,第一計算設(shè)備實現(xiàn)可執(zhí)行文件散列模塊110來生成包含可執(zhí)行文件和相應(yīng)的部分映像散列108用于安裝和/或下載至第二計算設(shè)備的包。第二計算設(shè)備實現(xiàn)映像部分完整性確認(rèn)模塊112,以在代碼調(diào)頁(或部分加載)操作中使用多個密碼散列中相應(yīng)的幾個來確認(rèn)該可執(zhí)行文件。
現(xiàn)在通過首先描述按部分的可執(zhí)行文件散列模塊110的示例性操作,然后描述映像部分完整性確認(rèn)模塊112的示例性操作,來更詳細(xì)地描述系統(tǒng)100的操作。
示例性按部分的可執(zhí)行文件密碼散列如上所述,按部分的可執(zhí)行文件散列模塊110為可執(zhí)行文件的各個部分生成部分映像散列108。部分映像散列108的每一部分散列108表示可執(zhí)行文件的各個部分的散列,使得每一散列108是少于可執(zhí)行文件所有字節(jié)的部分的摘要(除非整個可執(zhí)行文件的大小小于或等于該部分的大小)。例如,在一種實現(xiàn)中,每一散列108不是每頁散列,但是表示了可執(zhí)行文件少于一頁或多于一頁的部分的摘要(即,不是基于頁大小邊界的摘要)。在該實現(xiàn)中,為討論起見,每一散列108是可執(zhí)行文件的相應(yīng)一頁的摘要——即,每頁散列。(一頁中的字節(jié)數(shù)是任意的,且是由特別實現(xiàn)的調(diào)頁體系結(jié)構(gòu)來決定的。)由按部分的可執(zhí)行文件散列模塊110實現(xiàn)來創(chuàng)建多個部分散列108的特定散列算法是任意的,且可以是用于生成二進制碼的散列的任何算法。這樣的算法的示例包括,例如SHA-1和MD5。
系統(tǒng)100可以將可執(zhí)行文件與其相應(yīng)的部分映像散列108以多種不同的方式相關(guān)聯(lián)。例如,在一種實現(xiàn)中,系統(tǒng)100利用制造或更新系統(tǒng)目錄應(yīng)用程序(見“其它程序模塊”118)來將可執(zhí)行文件與其相應(yīng)的部分映像散列108打包成系統(tǒng)目錄108。這樣的打包可以作為系統(tǒng)目錄120創(chuàng)建操作的一部分,或者作為系統(tǒng)目錄120更新進程的一部分來執(zhí)行。在一種實現(xiàn)中,系統(tǒng)目錄120基于也包括部分映像散列108的小巧文件(cabinet file)結(jié)構(gòu)。盡管系統(tǒng)目錄的使用是常見的,但是常規(guī)的系統(tǒng)目錄不包括任何可執(zhí)行文件的部分映像散列108。相反,如果常規(guī)系統(tǒng)目錄包括任何類型的可執(zhí)行文件散列,那么該可執(zhí)行文件散列將是整個可執(zhí)行文件的單個可執(zhí)行文件散列。在一種實現(xiàn)中,系統(tǒng)目錄120包括部分映像散列108和完全可執(zhí)行文件散列;該完全可執(zhí)行文件散列是為了與常規(guī)代碼完整性基礎(chǔ)架構(gòu)向后兼容。
在另一種實現(xiàn)中,系統(tǒng)100利用密碼簽署應(yīng)用程序(見“其它程序模塊”118)來將可執(zhí)行文件與其相應(yīng)的部分映像散列108打包成自簽署文件122。在該實現(xiàn)中,自簽署文件是PKC#7數(shù)據(jù)格式,從而允許最終用戶跟蹤對最終證書授權(quán)的相關(guān)聯(lián)的簽名和X.509證書。在一種實現(xiàn)中,自簽署文件122包括部分映像散列108和完全可執(zhí)行文件散列;該完全可執(zhí)行文件散列是為了與常規(guī)代碼完整性基礎(chǔ)架構(gòu)向后兼容。
示例性可執(zhí)行文件完整性確認(rèn)無論系統(tǒng)100如何將部分映像散列108與相應(yīng)的可執(zhí)行文件相關(guān)聯(lián)(例如,將可執(zhí)行文件與其部分映像散列108關(guān)聯(lián)成系統(tǒng)目錄120或自簽署文件122),這樣的關(guān)聯(lián)允許映像部分完整性確認(rèn)模塊112在代碼加載操作中以最少的資源和性能影響來執(zhí)行可執(zhí)行文件確認(rèn)。這是因為由于可執(zhí)行文件的各個部分是在調(diào)頁(或部分加載)操作中從存儲設(shè)備復(fù)制至存儲器以便后續(xù)執(zhí)行的,與各個部分相關(guān)聯(lián)的相應(yīng)部分映像散列108用于確認(rèn)各個部分。(以下參考圖3示出和描述了示例性RAM、ROM以及諸如磁盤驅(qū)動器、CD-ROM、DVD等存儲設(shè)備。)如下所述,這是獨立于將無關(guān)/額外的代碼和資源(例如,頁或腳本)拉入存儲器的任何需求來完成的。
文件系統(tǒng)116、存儲器管理器124以及映像部分完整性確認(rèn)模塊112在操作系統(tǒng)(OS)調(diào)頁(或部分加載)操作中協(xié)作以確認(rèn)被拉入存儲器中以供執(zhí)行的可執(zhí)行文件的各部分。(在一種實現(xiàn)中,存儲器管理器和文件系統(tǒng)被實現(xiàn)為操作系統(tǒng)的相應(yīng)部分。)為了這些目的,當(dāng)執(zhí)行代碼(見“其它程序模塊”118)想要為后續(xù)執(zhí)行加載存儲在存儲設(shè)備上的可執(zhí)行文件的一部分時,作為段創(chuàng)建進程的一部分,存儲器管理器124向文件系統(tǒng)116發(fā)送打開請求來打開該可執(zhí)行文件。接著,存儲器管理器向文件系統(tǒng)116傳遞一個或多個進頁(或進部分)請求,以將可執(zhí)行文件的一頁或多頁調(diào)頁或映射至存儲器用于執(zhí)行。為討論起見,在調(diào)頁操作中,“進部分請求”是進頁請求。在另一實現(xiàn)中,“進部分請求”是對不是由頁邊界描述而是由正被實現(xiàn)的代碼加載體系結(jié)構(gòu)(例如,腳本引擎加載體系結(jié)構(gòu)等)描述的某些其它數(shù)量的字節(jié)的請求。打開、進頁請求以及進部分請求被示為“其它數(shù)據(jù)”114的相應(yīng)部分。
為了在代碼的執(zhí)行之前驗證代碼的這一個或多個部分的完整性,可執(zhí)行文件部分完整性確認(rèn)模塊112截取這些請求。響應(yīng)于打開文件(例如,創(chuàng)建請求)的接收,可執(zhí)行文件部分完整性確認(rèn)模塊112評估由打開請求所標(biāo)識的數(shù)據(jù)(目標(biāo))的來源,來確定目標(biāo)是數(shù)據(jù)還是代碼。數(shù)據(jù)一般不被映射為代碼,反之亦然。如果目標(biāo)被映射為代碼,則可執(zhí)行文件部分完整性確認(rèn)模塊112定位與該目標(biāo)相關(guān)聯(lián)的部分映像散列108,并將該散列中的每一個映射至存儲器中。在一種實現(xiàn)中,這是通過確定部分映像散列是被打包至系統(tǒng)目錄120還是自簽署文件122來完成的。為此,可執(zhí)行文件部分完整性確認(rèn)模塊112首先使用由按部分的可執(zhí)行文件散列模塊110用來創(chuàng)建部分映像散列108的同一算法來計算該可執(zhí)行文件頭的散列。計算出的散列與每一部分映像散列108是同一可配置字節(jié)大小。為說明起見,該計算出的散列被示為“其它數(shù)據(jù)”114中“為驗證而計算出的散列”中相應(yīng)的一個。
可執(zhí)行文件部分完整性確認(rèn)模塊112將計算出的散列與存儲在系統(tǒng)目錄120中的各個部分映像散列108進行比較,來搜索具有匹配計算出的散列的所有位的相關(guān)聯(lián)部分映像散列108的可執(zhí)行文件。如果找到了這樣的匹配散列108,那么所關(guān)心的可執(zhí)行文件是“目錄簽署的”,即是在系統(tǒng)目錄120中表示的。在該情形中,可執(zhí)行文件部分完整性確認(rèn)模塊112將與該可執(zhí)行文件相關(guān)聯(lián)的每一部分映像散列108讀入RAM中。注意,該復(fù)制操作不是檢查了完整性的調(diào)頁(或其它代碼部分加載)操作,因為該散列列表是來自非可執(zhí)行數(shù)據(jù)文件的數(shù)據(jù),而不是從可執(zhí)行二進制文件中讀取/調(diào)頁的信息。
如果該所關(guān)心的可執(zhí)行文件(目標(biāo))不是目錄簽署的,那么可執(zhí)行文件部分完整性確認(rèn)模塊112確定該所關(guān)心的可執(zhí)行文件是否是自簽署的,例如具有嵌入的PKCS#7簽署的內(nèi)容。如果是,那么確認(rèn)過濾程序112讀取證書數(shù)據(jù),確認(rèn)該證書可以被最終上溯至一組已知/可信的證書根中的一個,然后將每頁散列108的嵌入列表(位于目標(biāo)的簽名中)復(fù)制至存儲器中。在一種實現(xiàn)中,該自簽署文件也包括可執(zhí)行文件的完全散列,用于執(zhí)行常規(guī)代碼完整性檢查。
響應(yīng)于由可執(zhí)行文件部分完整性確認(rèn)模塊112進行的截取,存儲器管理器124向文件系統(tǒng)116傳遞對可執(zhí)行文件的一個或多個部分的“進部分”請求,其中該可執(zhí)行文件是前一打開文件請求的主體,可執(zhí)行文件部分完整性去忍模塊112確認(rèn)所請求的一個或多個部分的每一部分的完整性。更具體地,可執(zhí)行文件部分完整性確認(rèn)模塊112為由該進頁/進部分請求標(biāo)識的每一頁/部分計算散列,并將每一相應(yīng)的散列與該部分之前計算出的相應(yīng)部分映像散列108進行比較。(如上所述,響應(yīng)于打開文件請求,部分映像散列108被復(fù)制至存儲器)。
如果計算出的散列與存儲的散列匹配,那么可執(zhí)行文件部分完整性確認(rèn)模塊112允許該進頁/進部分操作完成,從而將所請求的部分映射至存儲器用于執(zhí)行。如果該計算出的散列與相應(yīng)的部分映像散列108不匹配,那么可執(zhí)行文件部分完整性確認(rèn)模塊112使該進頁/進部分請求失敗,且該被修改/破壞/篡改的代碼將不作為代碼被拉入存儲器中,從而,之后將不被執(zhí)行。
考慮上述,由于系統(tǒng)100實現(xiàn)調(diào)頁和其它存儲器代碼加載操作來將可執(zhí)行文件的一部分(例如,一頁)從存儲設(shè)備拉入至存儲器中,系統(tǒng)100僅檢查被拉入的該部分代碼的完整性。這引起極小的資源或性能的影響,因為僅確認(rèn)該部分,而沒有加載可執(zhí)行文件的任何額外/無關(guān)部分(例如,整個可執(zhí)行文件)。
示例性過程圖2示出了用于使用部分散列確認(rèn)可執(zhí)行文件的完整性的示例性過程200。為討論和說明起見,參考圖1的組件來描述該過程的操作。組件參考標(biāo)號的最左邊的數(shù)字表示其中該組件首次出現(xiàn)的特定附圖。在框202處,按部分的可執(zhí)行文件散列模塊110(圖1)為可執(zhí)行文件生成部分映像散列108。在框204處,部分映像散列108與該可執(zhí)行文件相關(guān)聯(lián)。在一種實現(xiàn)中,這是通過將該可執(zhí)行文件與部分映像散列108封裝至系統(tǒng)目錄120來完成的。在另一種實現(xiàn)中,這是通過將該可執(zhí)行文件與部分映像散列108封裝至自簽署文件122來完成的。系統(tǒng)目錄120和/或自簽署文件122可被安裝或下載至不同的計算設(shè)備上。
在框206處,映像部分完整性確認(rèn)模塊112(圖1)截取從存儲器管理器124發(fā)送給文件系統(tǒng)116的文件打開(創(chuàng)建段)請求。在框208處,響應(yīng)于該文件打開請求操作的接收,映像部分完整性確認(rèn)模塊112評估該請求的目標(biāo)數(shù)據(jù)源,來確定它是代碼(可執(zhí)行文件)還是數(shù)據(jù)(不是可執(zhí)行文件)。如果該目標(biāo)為可執(zhí)行文件,那么映像部分完整性確認(rèn)模塊112定位與該目標(biāo)相關(guān)聯(lián)的每一部分映像散列108,并將它們復(fù)制至存儲器中以供快速訪問(例如,當(dāng)接收到關(guān)聯(lián)于部分映像散列108的一個或多個的進頁請求時的訪問)。在框210處,響應(yīng)于截取由存儲器管理器124定向至文件系統(tǒng)116的進頁或進部分請求,映像部分完整性確認(rèn)模塊112為作為所截取的請求的目標(biāo)的那部分代碼計算散列(用于確認(rèn)的計算出的散列)。該部分代碼由文件系統(tǒng)從數(shù)據(jù)存儲單元中拉出,用于拉入至存儲器中以供執(zhí)行——如果該部分之后被確認(rèn)為沒有被破壞。
為此,在框212處,映像部分完整性確認(rèn)模塊112將所計算出的散列與相應(yīng)的一個部分映像散列108進行比較,來驗證通過所截取的請求(框210)而請求的該部分代碼的完整性。在框214處,如果該部分代碼被確定為沒有被破壞(即,計算出的散列匹配相對應(yīng)的一個部分映像散列108),那么映像部分完整性確認(rèn)模塊112允許在調(diào)頁操作中將該部分代碼映射至存儲器以供后續(xù)執(zhí)行。否則,在框216處,如果該部分代碼被確定為被破壞的(即,計算出的散列不匹配相對應(yīng)的一個部分映像散列108),那么映像部分完整性確認(rèn)模塊112使所截取的請求失敗,使得該部分代碼不被映射至存儲器用于執(zhí)行。
示例性操作環(huán)境圖3示出了可在其中完全或部分實現(xiàn)用于使用部分散列來確認(rèn)可執(zhí)行文件完整性的系統(tǒng)和方法的合適的計算環(huán)境300的示例。示例性計算環(huán)境300只是適用于圖1的示例性系統(tǒng)和圖2的示例性操作的計算環(huán)境的一個示例,并不旨在對此處描述的系統(tǒng)和方法的使用范圍或功能提出任何限制。也不應(yīng)該把計算環(huán)境300解釋為對計算環(huán)境300中示出的任一組件或其組合有任何依賴性或要求。
本發(fā)明可用眾多其它通用或?qū)S糜嬎阆到y(tǒng)、環(huán)境或配置來操作??蛇m于使用的公知的計算系統(tǒng)、環(huán)境和/或配置的示例包括,但不限于,個人計算機、膝上型計算機、小形狀因子移動計算設(shè)備(例如,手機、個人數(shù)字助理或手持式計算機)、服務(wù)器計算機、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、網(wǎng)絡(luò)PC、小型機、大型機、包含上述系統(tǒng)或設(shè)備中的任一個的分布式計算機環(huán)境等。架構(gòu)的簡單或子集形式也可以在有限資源的客戶機中實現(xiàn),諸如手持式計算機或其它計算設(shè)備。本發(fā)明在分布式計算環(huán)境中實現(xiàn),其中任務(wù)由通過通信網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備執(zhí)行。在分布式計算環(huán)境中,程序模塊可以位于本地和遠(yuǎn)程計算機存儲器存儲設(shè)備中。
參考圖3,示例性系統(tǒng)300示出了可在其中完全或部分實現(xiàn)用于使用部分散列來確認(rèn)可執(zhí)行文件完整性的系統(tǒng)和方法的合適的計算環(huán)境300的示例。系統(tǒng)300包括實現(xiàn)例如圖1的客戶計算機102的計算機310形式的通用計算設(shè)備。計算機310的組件可以包括,但不限于,處理單元320、系統(tǒng)存儲器330和將包括系統(tǒng)存儲器在內(nèi)的各種系統(tǒng)組件耦合至處理單元320的系統(tǒng)總線321。系統(tǒng)總線321可以是若干類型的總線結(jié)構(gòu)中的任一種,包括存儲器總線或存儲器控制器、外圍總線和使用各種總線體系結(jié)構(gòu)中的任一種的局部總線。作為示例,而非限制,這樣的體系結(jié)構(gòu)包括工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(ISA)總線、微通道體系結(jié)構(gòu)(MCA)總線、擴展的ISA(EISA)總線、視頻電子技術(shù)標(biāo)準(zhǔn)協(xié)會(VESA)局部總線和外圍部件互連(PCI)總線(也被稱為Mezzanine總線)。
計算機310通常包括各種計算機可讀介質(zhì)。計算機可讀介質(zhì)可以是能夠被計算機310訪問的任何可用介質(zhì),且包括易失性和非易失性介質(zhì)、可移動和不可移動介質(zhì)。作為示例,而非限制,計算機可讀介質(zhì)可以包括計算機存儲介質(zhì)和通信介質(zhì)。計算機存儲介質(zhì)包括以任何方法或技術(shù)實現(xiàn)的用于存儲諸如計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的易失性和非易失性、可移動和不可移動介質(zhì)。計算機存儲介質(zhì)包括,但不限于,RAM、ROM、EEPROM、閃存或其它存儲器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其它光盤存儲、磁帶盒、磁帶、磁盤存儲或其它磁性存儲設(shè)備、或能用于存儲所需信息且可以由計算機310訪問的任何其它介質(zhì)。
通信介質(zhì)通常具體化為諸如載波或其它傳輸機制等已調(diào)制數(shù)據(jù)信號中的計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),且包含任何信息傳遞介質(zhì)。術(shù)語“已調(diào)制數(shù)據(jù)信號”指的是這樣一種信號,其一個或多個特征以在信號中編碼信息的方式被設(shè)定或更改。作為示例,而非限制,通信介質(zhì)包括有線介質(zhì),諸如有線網(wǎng)絡(luò)或直接線連接,以及無線介質(zhì),諸如聲學(xué)、RF、紅外線和其它無線介質(zhì)。上述中任一個的組合也應(yīng)包括在計算機可讀介質(zhì)的范圍之內(nèi)。
系統(tǒng)存儲器330包括易失性或非易失性存儲器形式的計算機存儲介質(zhì),諸如只讀存儲器(ROM)331和隨機存取存儲器(RAM)332?;据斎?輸出系統(tǒng)333(BIOS)包含有助于諸如啟動時在計算機310中元件之間傳遞信息的基本例程,它通常存儲在ROM 331中。RAM 332通常包含處理單元320可以立即訪問和/或目前正在操作的數(shù)據(jù)和/或程序模塊。作為示例,而非限制,圖3示出了操作系統(tǒng)334、應(yīng)用程序335、其它程序模塊336和程序數(shù)據(jù)337。
計算機310也可以包括其它可移動/不可移動、易失性/非易失性計算機存儲介質(zhì)。僅作為示例,圖3示出了從不可移動、非易失性磁介質(zhì)中讀取或向其寫入的硬盤驅(qū)動器341,從可移動、非易失性磁盤352中讀取或向其寫入的磁盤驅(qū)動器351,以及從諸如CD ROM或其它光學(xué)介質(zhì)等可移動、非易失性光盤356中讀取或向其寫入的光盤驅(qū)動器355。可以在示例性操作環(huán)境中使用的其它可移動/不可移動、易失性/非易失性計算機存儲介質(zhì)包括,但不限于,盒式磁帶、閃存卡、數(shù)字多功能盤、數(shù)字錄像帶、固態(tài)RAM、固態(tài)ROM等。硬盤驅(qū)動器341通常由不可移動存儲器接口,諸如接口340連接至系統(tǒng)總線321,磁盤驅(qū)動器351和光盤驅(qū)動器355通常由可移動存儲器接口,諸如接口350連接至系統(tǒng)總線321。
以上描述和在圖3中示出的驅(qū)動器及其相關(guān)聯(lián)的計算機存儲介質(zhì)為計算機310提供了對計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其它數(shù)據(jù)的存儲。例如,在圖3中,硬盤驅(qū)動器341被示為存儲操作系統(tǒng)344、應(yīng)用程序345、其它程序模塊346和程序數(shù)據(jù)347。注意,這些組件可以與操作系統(tǒng)334、應(yīng)用程序335、其它程序模塊336和程序數(shù)據(jù)337相同或不同。應(yīng)用程序335包括,例如圖1的程序模塊104。程序數(shù)據(jù)337包括,例如圖1的程序數(shù)據(jù)106。操作系統(tǒng)344、應(yīng)用程序345、其它程序模塊346和程序數(shù)據(jù)347在這里被標(biāo)注了不同的標(biāo)號是為了說明至少它們是不同的副本。
用戶可以通過輸入設(shè)備,諸如鍵盤362和定點設(shè)備361(通常指鼠標(biāo)、跟蹤球或觸摸墊)向計算機310輸入命令和信息。其它輸入設(shè)備(未示出)可以包括麥克風(fēng)、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等。這些和其它輸入設(shè)備通常由耦合至系統(tǒng)總線321的用戶輸入接口360連接至處理單元320,但也可以由其它接口或總線結(jié)構(gòu),諸如并行端口、游戲端口或通用串行總線(USB)連接。
監(jiān)視器391或其它類型的顯示設(shè)備也經(jīng)由接口,諸如視頻接口390連接至系統(tǒng)總線321。除監(jiān)視器以外,計算機也可以包括其它外圍輸出設(shè)備,諸如打印機396和音頻設(shè)備397,它們可以通過輸出外圍接口395連接。
計算機310可使用至一個或多個遠(yuǎn)程計算機,諸如遠(yuǎn)程計算機380的邏輯連接在網(wǎng)絡(luò)化環(huán)境中操作。在一種實現(xiàn)中,遠(yuǎn)程計算機380表示由映像部分完整性確認(rèn)模塊112在代碼調(diào)頁操作中為后續(xù)的每一可執(zhí)行文件部分安裝或下載可執(zhí)行文件和圖1的部分映像散列108的計算設(shè)備。遠(yuǎn)程計算機380可以是個人計算機、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對等設(shè)備或其它常見網(wǎng)絡(luò)節(jié)點,且是由其特定實現(xiàn)來決定的,可以包括上文相對于計算機102描述的許多或所有元件(例如,程序模塊104和程序數(shù)據(jù)106等),盡管在圖3中只示出存儲器存儲設(shè)備381。圖3中所示邏輯連接包括局域網(wǎng)(LAN)371和廣域網(wǎng)(WAN)373,但也可以包括其它網(wǎng)絡(luò)。這樣的網(wǎng)絡(luò)環(huán)境在辦公室、企業(yè)范圍計算機網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)和因特網(wǎng)中是常見的。
當(dāng)在LAN網(wǎng)絡(luò)環(huán)境中使用時,計算機310通過網(wǎng)絡(luò)接口或適配器370連接至LAN 371。當(dāng)在WAN網(wǎng)絡(luò)環(huán)境中使用時,計算機310通常包括調(diào)制解調(diào)器372或用于通過諸如因特網(wǎng)等WAN 373建立通信的其它裝置。調(diào)制解調(diào)器372可以是內(nèi)置或外置的,它可以通過用戶輸入接口360或其它合適的機制連接至系統(tǒng)總線321。在網(wǎng)絡(luò)化環(huán)境中,相對于計算機310所描述的程序模塊或其部分可以存儲在遠(yuǎn)程存儲器存儲設(shè)備中。作為示例,而非限制,圖3示出了遠(yuǎn)程應(yīng)用程序385駐留在存儲器設(shè)備381上。所示的網(wǎng)絡(luò)連接是示例性的,且可以使用在計算機之間建立通信鏈路的其它手段。
結(jié)論盡管以對結(jié)構(gòu)特征和/或方法操作或動作專用的語言描述了用于使用部分散列來確認(rèn)可執(zhí)行文件完整性的系統(tǒng)和方法,但可以理解,所附權(quán)利要求書中定義的實現(xiàn)不必限于所描述的具體特征或動作。例如,盡管映像部分完整性確認(rèn)模塊112被示為作為插件結(jié)合到文件系統(tǒng)116中,但是程序模塊112也可以是插件或以其它方式結(jié)合到除文件系統(tǒng)之外的其它程序模塊中。例如,在一種實現(xiàn)中,映像部分完整性確認(rèn)模塊112的操作由存儲器管理器124直接訪問(作為插件或其它)。從而,這些具體特征和操作被揭示為實現(xiàn)所要求保護的主題的示例性形式。
權(quán)利要求
1.一種計算機實現(xiàn)的方法,包括生成表示可執(zhí)行文件的多個部分映像散列,所述多個部分映像散列中的每一部分散列表示少于所述可執(zhí)行文件的所有字節(jié)的部分;在將所述可執(zhí)行文件加載至計算設(shè)備上之后,截取將所述可執(zhí)行文件的一部分調(diào)頁至存儲器中用于執(zhí)行的請求;以及響應(yīng)于截取所述請求,并在將所述部分調(diào)頁至存儲器用于執(zhí)行之前計算所述部分的確認(rèn)散列;以及將所述確認(rèn)散列與所述多個部分映像散列中的一個部分散列進行比較,來確定所述部分的代碼完整性,所述部分散列表示與所述部分相同的代碼段。
2.如權(quán)利要求1所述的方法,其特征在于,所述多個部分映像散列是在將所述可執(zhí)行文件加載至所述計算設(shè)備之前計算的。
3.如權(quán)利要求1所述的方法,其特征在于,所述多個部分映像散列被存儲在系統(tǒng)目錄或自簽署密碼文件中。
4.如權(quán)利要求1所述的方法,其特征在于,還包括確定所述確認(rèn)散列匹配所述部分散列;以及響應(yīng)于所述確定,將所述部分調(diào)頁至存儲器中用于執(zhí)行。
5.如權(quán)利要求1所述的方法,其特征在于,還包括確定所述確認(rèn)散列不匹配所述部分散列;以及響應(yīng)于所述確定,使將所述部分調(diào)頁至存儲器中用于執(zhí)行的請求失敗。
6.如權(quán)利要求1所述的方法,其特征在于,還包括在將所述可執(zhí)行文件加載至計算設(shè)備之后,截取為所述可執(zhí)行文件創(chuàng)建代碼段的打開請求;以及響應(yīng)于截取所述打開請求計算所述可執(zhí)行文件頭的標(biāo)識散列;將所述標(biāo)識散列與存儲在系統(tǒng)目錄中的多個部分可執(zhí)行文件散列中的相應(yīng)的幾個進行比較,來標(biāo)識多個部分二進制散列中匹配所述文件頭的散列,所述散列是所述多個部分映像散列中的第一散列;以及響應(yīng)于定位所述散列,將所述可執(zhí)行文件的多個部分映像散列從所述系統(tǒng)目錄復(fù)制至存儲器中,用于之后響應(yīng)于將所述可執(zhí)行文件的一個或多個部分調(diào)頁至存儲器用于執(zhí)行而進行的部分映像散列碼完整性確認(rèn)操作。
7.如權(quán)利要求1所述的方法,其特征在于,還包括在將所述可執(zhí)行文件加載至計算設(shè)備之后,截取為所述可執(zhí)行文件創(chuàng)建代碼段的打開請求;以及響應(yīng)于截取所述打開請求,并響應(yīng)于確定所述可執(zhí)行文件是自簽署密碼文件,將所述多個部分映像散列從所述自簽署密碼文件中復(fù)制至存儲器中,用于之后響應(yīng)于將所述可執(zhí)行文件的一個或多個部分調(diào)頁至存儲器用于執(zhí)行而進行的部分映像散列碼完整性確認(rèn)操作。
8.一種包含處理器可執(zhí)行計算機程序指令的計算機可讀介質(zhì),所述計算機程序指令用于生成表示可執(zhí)行文件的摘要的多個部分映像散列,所述多個部分映像散列中的每一部分散列表示少于所述可執(zhí)行文件的所有字節(jié)的部分;在將所述可執(zhí)行文件加載至計算設(shè)備之后,截取將所述可執(zhí)行文件的一部分調(diào)頁至存儲器中用于執(zhí)行的請求;以及響應(yīng)于截取所述請求,并在將所述部分調(diào)頁至存儲器用于執(zhí)行之前計算所述部分的確認(rèn)散列;以及將所述確認(rèn)散列與所述多個部分映像散列中的一個部分散列進行比較,來確定所述部分的代碼完整性,所述部分散列表示與所述部分相同的代碼段。
9.如權(quán)利要求8所述的計算機可讀介質(zhì),其特征在于,所述多個部分映像散列是在將所述可執(zhí)行文件加載至所述計算設(shè)備之前計算的。
10.如權(quán)利要求8所述的計算機可讀介質(zhì),其特征在于,所述多個部分映像散列被存儲在系統(tǒng)目錄或自簽署密碼文件中。
11.如權(quán)利要求8所述的計算機可讀介質(zhì),其特征在于,所述計算機程序指令還包括指令,用于確定所述確認(rèn)散列匹配所述部分散列;以及響應(yīng)于所述確定,將所述部分調(diào)頁至存儲器中用于執(zhí)行。
12.如權(quán)利要求8所述的計算機可讀介質(zhì),其特征在于,所述計算機程序指令還包括指令,用于確定所述確認(rèn)散列不匹配所述部分散列;以及響應(yīng)于所述確定,使將所述部分調(diào)頁至存儲器中用于執(zhí)行的請求失敗。
13.如權(quán)利要求8所述的計算機可讀介質(zhì),其特征在于,所述計算機程序指令還包括指令,用于在將所述可執(zhí)行文件加載至計算設(shè)備之后,截取為所述可執(zhí)行文件創(chuàng)建代碼段的打開請求;以及響應(yīng)于截取所述打開請求計算所述可執(zhí)行文件頭的標(biāo)識散列;將所述標(biāo)識散列與存儲在系統(tǒng)目錄中的多個部分可執(zhí)行文件散列中的相應(yīng)的幾個進行比較,來標(biāo)識多個部分二進制散列中匹配所述文件頭的散列,所述散列是所述多個部分映像散列中的第一散列;以及響應(yīng)于定位所述散列,將所述可執(zhí)行文件的多個部分映像散列從所述系統(tǒng)目錄復(fù)制至存儲器中,用于之后響應(yīng)于將所述可執(zhí)行文件的一個或多個部分調(diào)頁至存儲器用于執(zhí)行而進行的部分映像散列碼完整性確認(rèn)操作。
14.如權(quán)利要求8所述的計算機可讀介質(zhì),其特征在于,所述計算機程序指令還包括指令,用于在將所述可執(zhí)行文件加載至計算設(shè)備之后,截取為所述可執(zhí)行文件創(chuàng)建代碼段的打開請求;以及響應(yīng)于截取所述打開請求,并響應(yīng)于確定所述可執(zhí)行文件是自簽署密碼文件,將所述多個部分映像散列從所述自簽署密碼文件復(fù)制至存儲器中,用于之后響應(yīng)于將所述可執(zhí)行文件的一個或多個部分調(diào)頁至存儲器用于執(zhí)行而進行的部分映像散列碼完整性確認(rèn)操作。
15.一種計算設(shè)備包括處理器;以及耦合至所述處理器的存儲器,所述存儲器包括所述處理器可執(zhí)行的計算機程序指令,用于生成表示可執(zhí)行文件的摘要的多個部分映像散列,所述多個部分映像散列中的每一部分散列表示少于所述可執(zhí)行文件的所有字節(jié)的部分;在將所述可執(zhí)行文件加載至計算設(shè)備之后,截取將所述可執(zhí)行文件的一部分調(diào)頁至存儲器中用于執(zhí)行的請求;以及響應(yīng)于截取所述請求,并在將所述部分調(diào)頁至存儲器用于執(zhí)行之前計算所述部分的確認(rèn)散列;以及將所述確認(rèn)散列與所述多個部分映像散列中的一個部分散列進行比較,來確定所述部分的代碼完整性,所述部分散列表示與所述部分相同的代碼段。
16.如權(quán)利要求15所述的計算設(shè)備,其特征在于,所述多個部分映像散列被存儲在系統(tǒng)目錄或自簽署密碼文件中。
17.如權(quán)利要求15所述的計算設(shè)備,其特征在于,所述計算機程序指令還包括指令,用于確定所述確認(rèn)散列匹配所述部分散列;以及響應(yīng)于所述確定,將所述部分調(diào)頁至存儲器中用于執(zhí)行。
18.如權(quán)利要求15所述的計算設(shè)備,其特征在于,所述計算機程序指令還包括指令,用于確定所述確認(rèn)散列不匹配所述部分散列;以及響應(yīng)于所述確定,使將所述部分調(diào)頁至存儲器中用于執(zhí)行的請求失敗。
19.如權(quán)利要求15所述的計算設(shè)備,其特征在于,所述計算機程序指令還包括指令,用于在將所述可執(zhí)行文件加載至計算設(shè)備之后,截取為所述可執(zhí)行文件創(chuàng)建代碼段的打開請求;以及響應(yīng)于截取所述打開請求計算所述可執(zhí)行文件頭的標(biāo)識散列;將所述標(biāo)識散列與存儲在系統(tǒng)目錄中的多個部分可執(zhí)行文件散列中的相應(yīng)的幾個進行比較,來標(biāo)識多個部分二進制散列中匹配所述文件頭的散列,所述散列是所述多個部分映像散列中的第一散列;以及響應(yīng)于定位所述散列,將所述可執(zhí)行文件的多個部分映像散列從所述系統(tǒng)目錄復(fù)制至存儲器中,用于之后響應(yīng)于將所述可執(zhí)行文件的一個或多個部分調(diào)頁至存儲器用于執(zhí)行而進行的部分映像散列碼完整性確認(rèn)操作。
20.如權(quán)利要求15所述的計算設(shè)備,其特征在于,所述計算機程序指令還包括指令,用于在將所述可執(zhí)行文件加載至計算設(shè)備之后,截取為所述可執(zhí)行文件創(chuàng)建代碼段的打開請求;以及響應(yīng)于截取所述打開請求,并響應(yīng)于確定所述可執(zhí)行文件是自簽署密碼文件,將所述多個部分映像散列從所述自簽署密碼文件復(fù)制至存儲器中,用于之后響應(yīng)于將所述可執(zhí)行文件的一個或多個部分調(diào)頁至存儲器用于執(zhí)行而進行的部分映像散列碼完整性確認(rèn)操作。
全文摘要
描述了用于確認(rèn)可執(zhí)行文件的完整性的系統(tǒng)和方法。在一個方面,生成多個部分映像散列,其組合表示整個可執(zhí)行文件的摘要。在將該可執(zhí)行文件加載至計算設(shè)備之后,截取將該可執(zhí)行文件的一部分調(diào)頁至存儲器來運行的請求。響應(yīng)于截取該請求,并在調(diào)頁該部分至存儲器來執(zhí)行之前,計算該部分的確認(rèn)散列。將確認(rèn)散列與該多個部分映像散列中的一個部分散列進行比較,來確定該部分的代碼完整性。該部分散列表示與該部分相同的代碼段。
文檔編號G06F1/00GK1808326SQ20051013614
公開日2006年7月26日 申請日期2005年12月19日 優(yōu)先權(quán)日2005年1月18日
發(fā)明者J·D·斯瓦茨, P·J·哈林, Y·L·謝 申請人:微軟公司