專利名稱:經(jīng)由動態(tài)轉(zhuǎn)換的主動計算機惡意軟件保護的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算設(shè)備,尤其涉及針對惡意軟件的計算設(shè)備保護。
背景技術(shù):
隨著越來越多的計算機和其它計算設(shè)備經(jīng)由諸如因特網(wǎng)等各種網(wǎng)絡(luò)互連,計 算機安全變得日益重要,尤其對于經(jīng)由網(wǎng)絡(luò)或信息流傳遞的侵入或攻擊。如本領(lǐng)域 的技術(shù)人員可以認識到的,這些攻擊具有各種形式,包括但當然不限于,計算機病 毒、計算機蠕蟲、系統(tǒng)組件替換、服務(wù)拒絕攻擊、甚至是對合法的計算機系統(tǒng)特性 的誤用/濫用,所有這些都為不合法的目的而利用一個或多個計算機系統(tǒng)的漏洞。 盡管本領(lǐng)域的技術(shù)人員將認識到各種計算機攻擊在技術(shù)上彼此不同,但為本發(fā)明的 目的以及描述的簡明性起見,所有惡意計算機程序在后文中一般被稱為計算機惡意 軟件,或簡稱為惡意軟件。
當計算設(shè)備被計算機惡意軟件攻擊或"感染"時,不利的結(jié)果是各有不同的, 包括禁用系統(tǒng)設(shè)備;擦除或破壞固件、應(yīng)用程序或數(shù)據(jù)文件;將潛在敏感的數(shù)據(jù)發(fā) 送給網(wǎng)絡(luò)上的另一位置;關(guān)閉計算機設(shè)備;或使計算設(shè)備崩潰。眾多而不是全部計 算機惡意軟件的另一有害方面在于,受感染的計算設(shè)備被用于感染其它系統(tǒng)。
針對計算機惡意軟件,尤其是計算機病毒和蠕蟲的傳統(tǒng)防御是反病毒軟件。 一般而言,反病毒軟件掃描傳入的數(shù)據(jù)、查找與已知計算機惡意軟件相關(guān)聯(lián)的可標 識模式。而且,反病毒軟件越來越多地利用將傳入的數(shù)據(jù)與已知惡意軟件的特征進 行比較的試探技術(shù)。在任何情況中,當檢測到計算機惡意軟件時,反病毒軟件可通 過從受感染的數(shù)據(jù)中移除該計算機惡意軟件、隔離該數(shù)據(jù)或刪除受感染的傳入數(shù)據(jù) 來響應(yīng)。不幸的是,反病毒軟件一般對已知的、可標識的計算機惡意軟件起作用。 通常,這是通過將數(shù)據(jù)內(nèi)的模式與所謂的惡意軟件的"簽名"進行比較來完成的。 這種惡意軟件檢測模型的核心缺陷之一在于,未知的計算機惡意軟件可在網(wǎng)絡(luò)中未 經(jīng)檢查地傳播,直到計算設(shè)備上的反病毒軟件被更新來標識并響應(yīng)該惡意軟件。
隨著反病毒軟件對識別成千種己知計算機惡意軟件變得越來越老練且高效,計算機惡意軟件也變得越來越復雜。例如,惡意計算機用戶現(xiàn)在對惡意軟件加密以
便在不可識別模式背后模糊惡意軟件簽名。例如,多形(polymorphic)惡意軟件 由惡意軟件解密例程和經(jīng)加密的惡意軟件"有效負載"組成。當用戶執(zhí)行受感染程 序時,惡意軟件解密例程獲取對該計算設(shè)備的控制,并對之前加密的惡意軟件有效 負載解密。然后,解密例程將對計算設(shè)備的控制傳送給已解密的惡意軟件有效負載。 每當新目標被感染時,惡意軟件復制解密例程和惡意軟件有效負載兩者。 一般,用 于加密惡意軟件有效負載的加密密鑰在惡意軟件被復制時被改變。結(jié)果是,經(jīng)加密 的惡意軟件不具有反病毒軟件可用于識別惡意軟件的可標識模式或"簽名"。
當寡形(oligomorphic)惡意軟件被創(chuàng)建時,反病毒軟件開發(fā)員認識到,解密 例程在惡意軟件的各版本之間保持不變。反病毒軟件開發(fā)員通過不僅掃描惡意軟件 簽名,還掃描已知與惡意軟件相關(guān)聯(lián)的專用解密例程來利用該弱點。作為響應(yīng),惡 意計算機用戶開發(fā)了被設(shè)計成防止解密例程被標識的更復雜的惡意軟件(后文中,
使用被設(shè)計成隱藏惡意軟件簽名的技術(shù)的所有類型的惡意軟件將被稱為"隱蔽 (obscured)惡意軟件")。
圖1是示出可用于分發(fā)"有效負載"的被稱為多形惡意軟件100的一種隱蔽 惡意軟件的示意圖。如圖1中所示,多形惡意軟件100附加到主機程序102,且在 此實例中,它被示為包括加密引擎106、解密例程108以及多形文件傳染者110的 病毒104。多形惡意軟件100對病毒104的片段加密以防止可標識簽名被標識。然 而,病毒104還包括每當病毒104傳播時即生成隨機加密例程的加密引擎106。當 病毒104運行時,多形文件傳染者110標識新目標,并在計算機存儲器中復制病毒 104。此時,加密引擎106隨機生成具有極少或不具有與之前開發(fā)的加密例程的相 似性的新加密例程。然后,病毒104的經(jīng)加密的副本被追加給被標識的目標。結(jié)果, 病毒104被加密,且用于加密和解密的例程隨感染而有所不同。在沒有固定惡意軟 件簽名或固定加密例程的情況中,常規(guī)的反病毒軟件不可能檢測多形惡意軟件 100,因為簽名不可標識。
考慮到上述問題,計算機用戶擁有針對諸如隱蔽惡意軟件等惡意軟件來主動 保護計算機的軟件將是有利的。
發(fā)明概述
本發(fā)明提供用于針對惡意軟件保護計算設(shè)備的安全模型。根據(jù)本發(fā)明的一個 方面,提供了一種用于將與計算設(shè)備相關(guān)聯(lián)的潛在惡意軟件轉(zhuǎn)換成安全程序代碼的方法。本發(fā)明的這一方面以在存儲器中所標識的程序入口點處分析潛在惡意軟件開 始。對惡意軟件的初始分析包括通過對指令解碼直到遇到基本塊中的最后一條指令 來將程序代碼分成"基本塊"。在基本塊中的指令之前未經(jīng)掃描的情況中,掃描器 搜索基本塊以查找惡意軟件。如果檢測到惡意軟件且以足夠級別的精確性得出該惡 意軟件的身份,則包含該惡意軟件的文件被報告為受到感染。在這種情況中,本發(fā) 明的進一步分析是不必要的。在其它情況中,基本塊中的已解碼指令被轉(zhuǎn)換成可執(zhí) 行的等效且安全的程序代碼。這種轉(zhuǎn)換可從潛在惡意軟件直接執(zhí)行?;蛘?,可使用 被"編譯"成可執(zhí)行程序代碼的體系結(jié)構(gòu)中立格式來執(zhí)行轉(zhuǎn)換。
根據(jù)本發(fā)明的另一方面,提供了一種用于安全地執(zhí)行經(jīng)轉(zhuǎn)換程序代碼的基本 塊的方法。本發(fā)明的這一方面包括確定經(jīng)轉(zhuǎn)換的程序代碼的基本塊在轉(zhuǎn)換之后是否 被更改。在發(fā)生更改的情況中,經(jīng)修改的基本塊在執(zhí)行之前被轉(zhuǎn)換。當沒有發(fā)生更 改時,不需要額外的轉(zhuǎn)換,且執(zhí)行現(xiàn)有的"經(jīng)編譯"的程序代碼??蓤?zhí)行程序代碼 能夠確定之前轉(zhuǎn)換的程序代碼是否作為執(zhí)行結(jié)果而被更改。曾被更改的程序代碼的 任何基本塊被丟棄并在執(zhí)行之前被再次轉(zhuǎn)換。當執(zhí)行完成之后,當前執(zhí)行點被更新, 且執(zhí)行控制被轉(zhuǎn)移給后續(xù)基本塊。然后重復基本塊的轉(zhuǎn)換和執(zhí)行直到惡意軟件被標 識、中斷條件出現(xiàn)、或程序完成執(zhí)行。
附圖簡述
通過結(jié)合附圖考慮參考以下詳細描述,本發(fā)明的前述方面和眾多伴隨的優(yōu)點
將更容易被領(lǐng)會且將更好地被理解,附圖中
圖1是示出可使用本發(fā)明來標識的多形惡意軟件的組件的框圖2是根據(jù)本發(fā)明的適用于執(zhí)行動態(tài)轉(zhuǎn)換并執(zhí)行程序代碼的計算設(shè)備的組件
的框圖3是根據(jù)本發(fā)明的利用體系結(jié)構(gòu)中立格式(neutral format)將潛在的惡意軟 件轉(zhuǎn)換成安全程序代碼的過程的框圖4是示出根據(jù)本發(fā)明的可用于將潛在的惡意軟件轉(zhuǎn)換成安全程序代碼的轉(zhuǎn) 換方法的示例性實施例的流程圖5是示出根據(jù)本發(fā)明的可用于執(zhí)行程序代碼的執(zhí)行方法的示例性實施例的 流程圖。
詳細描述根據(jù)本發(fā)明,提供了一種用于將與計算設(shè)備相關(guān)聯(lián)的潛在的惡意軟件轉(zhuǎn)換成 安全代碼的系統(tǒng)、方法和計算機可讀介質(zhì)。潛在的惡意軟件從包括但不限于本機
CPU程序代碼、平臺無關(guān).NET字節(jié)代碼、以及腳本程序代碼等的多種不同類型的
源語言中的任何一種被轉(zhuǎn)換成體系結(jié)構(gòu)中立格式的安全且功能上相等的程序代碼。
然后,所轉(zhuǎn)換的程序代碼被"編譯"回可由本機CPU執(zhí)行的程序代碼。在執(zhí)行之 前和/或期間,本發(fā)明使掃描器搜索存儲器中所存儲的惡意軟件。如果未檢測到惡 意軟件,則計算設(shè)備使CPU執(zhí)行經(jīng)轉(zhuǎn)換的程序代碼。然而,如果存儲潛在惡意軟 件的計算機存儲器在執(zhí)行期間被更改,則執(zhí)行可被中斷。在這種情況中,現(xiàn)在存儲 在存儲器中的新的潛在惡意軟件將在被執(zhí)行之前被轉(zhuǎn)換成安全程序代碼。
盡管將主要在專用計算機體系結(jié)構(gòu)和源語言的上下文中描述本發(fā)明,但相關(guān) 領(lǐng)域的技術(shù)人員和其他人將理解,本發(fā)明也可應(yīng)用于除所述以外的其它計算機體系 結(jié)構(gòu)或源語言。以下描述首先提供了可在其中實現(xiàn)本發(fā)明的系統(tǒng)的概觀。然后,描 述實現(xiàn)本發(fā)明的方法。此處提供的說明性的示例不旨在是詳盡的,或?qū)⒈景l(fā)明限制 于所公開的精確形式。類似地,此處所述的任何步驟可與其它步驟或步驟的組合互 換,以便達到相同的結(jié)果。
現(xiàn)在參考圖2,以下旨在提供可在其中實現(xiàn)本發(fā)明的一個合適的惡意軟件檢測 系統(tǒng)200的示例性概觀。所示的惡意軟件檢測系統(tǒng)200包括中央處理單元202、掃 描器204、轉(zhuǎn)換引擎206、塊管理器208、編譯引擎210以及虛擬環(huán)境212。在本發(fā) 明的一個實施例中,虛擬環(huán)境212包括虛擬I/O系統(tǒng)214和虛擬存儲器216。而且, 如以下進一步詳細描述的,轉(zhuǎn)換引擎206和編譯引擎210各自可支持一個或多個插 件模塊,諸如插件模塊218和220。在描述本發(fā)明的一個實施例的一般術(shù)語中,惡 意軟件檢測系統(tǒng)200的組件提供掃描器204檢測隱蔽惡意軟件所需的基礎(chǔ)架構(gòu)。而 且,惡意軟件檢測系統(tǒng)200的組件允許在執(zhí)行從潛在惡意軟件轉(zhuǎn)換的安全程序代碼 時對惡意軟件的快速解密和檢測。
如圖2中所示,惡意軟件檢測系統(tǒng)200包括CPU 202。本領(lǐng)域中的技術(shù)人員 及其他人將認識到,CPU 202通過支持本機程序代碼的執(zhí)行來用作惡意軟件檢測系 統(tǒng)200的計算中心。用于檢測隱蔽惡意軟件的一種現(xiàn)有技術(shù)系統(tǒng)在包括虛擬CPU 的虛擬操作環(huán)境中"模擬"程序執(zhí)行。在模擬期間,基于在虛擬操作環(huán)境中所觀察 到的程序事件生成行為簽名。行為簽名適用于分析來確定所模擬的程序是否是惡意 軟件。在這種類型的系統(tǒng)中,程序中的每一指令在虛擬CPU上被模擬。結(jié)果是, 模擬可能是耗時的,且與由本發(fā)明提供的惡意軟件檢測基礎(chǔ)架構(gòu)相比可能導致可觀的性能降級。例如,經(jīng)由循環(huán)為每一迭代在虛擬CPU上模擬循環(huán)中的程序指令, 即使程序指令的效果在之前迭代中已被觀察到。而且,程序在消費顯著計算開銷的
軟件實現(xiàn)的虛擬CPU上被模擬。作為對比,本發(fā)明在實際或基于硬件的CPU 202 上執(zhí)行程序代碼。為了確保惡意軟件不被執(zhí)行,潛在惡意軟件中的程序代碼在被執(zhí) 行之前被轉(zhuǎn)換成安全程序代碼。
如圖2中所示,惡意軟件檢測系統(tǒng)200包括被設(shè)計成檢測惡意軟件的掃描器 204。如本領(lǐng)域的技術(shù)人員及其他人所知的,眾多不同的軟件廠商在反病毒軟件中 包括被配置成標識惡意軟件的程序代碼特征的掃描器。不幸的是,現(xiàn)有的掃描器未 被配置成結(jié)合在執(zhí)行之前將潛在惡意軟件轉(zhuǎn)換成安全程序代碼的系統(tǒng)一起工作。相 反,某些現(xiàn)有的掃描器與上述類型的模擬系統(tǒng)一起工作。在這些系統(tǒng)中,掃描器增 加了附加的開銷,使得模擬過程將花費不合理的時間量。然而,由本發(fā)明實現(xiàn)的軟 件例程向掃描器204提供迅速標識諸如在運行時"被打開"(即,解密)或加載到 存儲器內(nèi)的惡意軟件等隱蔽惡意軟件所需的基礎(chǔ)架構(gòu)。
惡意軟件檢測系統(tǒng)200還包括被設(shè)計成將潛在惡意軟件轉(zhuǎn)換成體系結(jié)構(gòu)中立 程序代碼的轉(zhuǎn)換引擎206。更具體地,轉(zhuǎn)換引擎206可從按照包括但不限于本機 CPU程序代碼、獨立于平臺的字節(jié)代碼以及腳本程序代碼等多種不同格式中的任 何一種的源語言對潛在的惡意軟件解碼。然后,己解碼程序代碼中的每一指令被轉(zhuǎn) 換成體系結(jié)構(gòu)中立格式。在轉(zhuǎn)換期間,已解碼的程序代碼可被分成基本塊。如本領(lǐng) 域中的技術(shù)人員及其他人所知的,基本塊是僅在序列的開始處包含單個入口點且在 序列結(jié)尾處包含單個出口點的程序代碼序列。換言之,基本塊至多包含單條"跳轉(zhuǎn)" 指令。經(jīng)轉(zhuǎn)換的程序代碼的基本塊是本發(fā)明轉(zhuǎn)換并執(zhí)行潛在惡意軟件的單位。由于 程序代碼可從眾多源語言轉(zhuǎn)換,因此轉(zhuǎn)換引擎206支持諸如插件模塊218等插件模 塊。插件模塊提供用于將源語言的程序代碼轉(zhuǎn)換成體系結(jié)構(gòu)中立格式的安全程序代
碼的邏輯。在替換實施例中,轉(zhuǎn)換引擎206將潛在惡意軟件直接從源語言轉(zhuǎn)換成可 被執(zhí)行的安全程序代碼。在此實施例中,不使用體系結(jié)構(gòu)中立格式。然而,體系結(jié) 構(gòu)中立格式在轉(zhuǎn)換引擎206被配置成從多種源語言轉(zhuǎn)換程序代碼的情況中簡化了 轉(zhuǎn)換過程的實現(xiàn)。
惡意軟件檢測系統(tǒng)200還包括用于管理基本塊的執(zhí)行的塊管理器208。塊管理 器208被配置成分析基本塊,并構(gòu)建存儲關(guān)于不同基本塊之間的關(guān)系的信息的數(shù)據(jù) 結(jié)構(gòu)。當執(zhí)行了經(jīng)轉(zhuǎn)換的程序代碼之后,塊管理器208中所包含的邏輯提供用于確 定何時轉(zhuǎn)換其它程序代碼的決策制定過程。在這點上,塊管理器208將參考并更新
10數(shù)據(jù)結(jié)構(gòu)中所存儲的數(shù)據(jù)。塊管理器208還包含用于確定何時應(yīng)由掃描器204對程 序代碼搜索惡意軟件的邏輯。
如圖2中所示,惡意軟件檢測系統(tǒng)200包括生成可由CPU 202執(zhí)行的程序代 碼的編譯引擎210。更具體地,由轉(zhuǎn)換引擎206生成的體系結(jié)構(gòu)中立程序代碼由編 譯引擎210編譯成體系結(jié)構(gòu)專用格式。由于可能需要對不同的體系結(jié)構(gòu)編譯程序代 碼,因此編譯引擎210支持插件模塊,諸如插件模塊220。插件模塊提供用于將體 系結(jié)構(gòu)中立程序代碼編譯成遵循由專用計算機體系結(jié)構(gòu)施加的約束的程序代碼的 邏輯。
如圖2中所示,惡意軟件檢測系統(tǒng)200還支持虛擬環(huán)境212,它包括虛擬IZO 系統(tǒng)214和虛擬存儲器216。由于虛擬環(huán)境的眾多功能對理解本發(fā)明而言不是重要 的,因此它們將不在此處詳細說明。而且,因為它們對理解本發(fā)明而言不是重要的, 因此虛擬環(huán)境212中的眾多組件將不在圖2中示出。就本發(fā)明而言,虛擬環(huán)境212 提供關(guān)于潛在惡意軟件對資源的使用的信息。例如,塊管理器208提供用于確定何 時轉(zhuǎn)換程序代碼的決策制定過程。在這點上,塊管理器208可對虛擬環(huán)境212作出 調(diào)用以確定基本塊在執(zhí)行期間是否在存儲器中被更改。虛擬環(huán)境212被配置成向由
本發(fā)明實現(xiàn)的軟件例程提供關(guān)于資源使用的信息,包括存儲器分配中的改變。
如圖2中所示,惡意軟件檢測系統(tǒng)200的每一組件,例如中央處理單元202、 掃描器204、轉(zhuǎn)換引擎206、塊管理器208、編譯引擎210以及虛擬環(huán)境212被互 連且能夠與其它組件通信。如本領(lǐng)域的技術(shù)人員及其他人所知的,圖2是能夠執(zhí)行 由本發(fā)明實現(xiàn)的功能的一種惡意軟件檢測系統(tǒng)200的簡化示例。惡意軟件檢測系統(tǒng) 200的實際實施例將具有未在圖2中示出或未在附隨的文字中描述的其它組件。而 且,圖2示出用于安全執(zhí)行經(jīng)轉(zhuǎn)換的程序代碼的一種組件體系結(jié)構(gòu),但其它組件體 系結(jié)構(gòu)也是可能的。
現(xiàn)在參考圖3,將描述為惡意軟件檢測的目的而由本發(fā)明實現(xiàn)以產(chǎn)生安全程序 代碼的組件和例程。圖3示出包括AMD-64可執(zhí)行代碼302、 X86-32可執(zhí)行代碼 304以及.NET字節(jié)代碼306的潛在惡意軟件的三個示例。圖3中還示出圖2中所 示的轉(zhuǎn)換引擎206、編譯引擎210、以及插件模塊218-220。 一般而言,轉(zhuǎn)換引擎 206和編譯引擎210 —起工作來產(chǎn)生執(zhí)行安全的程序代碼。圖3中所示的本發(fā)明的 實施例利用體系結(jié)構(gòu)中立格式來產(chǎn)生安全程序代碼。然而,在替換實施例中,潛在 惡意軟件302-306可無需利用體系結(jié)構(gòu)中立格式而被直接轉(zhuǎn)換成安全程序代碼。
動態(tài)轉(zhuǎn)換一般被定義為用于將程序代碼從源語言轉(zhuǎn)化成目標語言或格式的過程。程序代碼一般被轉(zhuǎn)換以便滿足目的。例如,某些現(xiàn)有的轉(zhuǎn)換器通過將指令集縮 減成較小但功能上相等的指令集來優(yōu)化程序代碼。作為另一示例,某些CPU支持 將程序代碼從由老計算機體系結(jié)構(gòu)所理解的語言轉(zhuǎn)換成最近開發(fā)的語言,使得傳統(tǒng) 程序可在新計算設(shè)備上執(zhí)行。大多數(shù)現(xiàn)代轉(zhuǎn)換器是動態(tài)的,這表現(xiàn)在轉(zhuǎn)化程序代碼 的過程在運行時或當程序代碼被執(zhí)行時"在運行中"被執(zhí)行。實現(xiàn)動態(tài)轉(zhuǎn)換的過程 被限于惡意軟件檢測的區(qū)域之外。然而,如圖3中所示,本發(fā)明提供了轉(zhuǎn)換引擎
206中的一般框架,以便為惡意軟件檢測的目的而將程序代碼從源語言(即,AMD 64位、X86 32位、以及.NET字節(jié)代碼)轉(zhuǎn)換成目標格式(即,體系結(jié)構(gòu)中立格式)。 換言之,轉(zhuǎn)換引擎206不限于僅在兩種語言之間轉(zhuǎn)換程序代碼。相反,轉(zhuǎn)換引擎 206可被配置成支持從多種源語言轉(zhuǎn)換。在這一點上,插件模塊可被添加到轉(zhuǎn)換引 擎206來支持源語言與體系結(jié)構(gòu)中立格式之間的轉(zhuǎn)換。圖3中所示的這種類型的源 語言應(yīng)被解釋為示例性而非限制性的。例如,本發(fā)明可被配置成從圖3中未示出的 腳本語言或體系結(jié)構(gòu)無關(guān)源語言轉(zhuǎn)換程序代碼。
在本發(fā)明的一個實際實施例中,插件模塊218支持滿足"X86" 32位指令集 要求的語言與體系結(jié)構(gòu)中立格式之間的轉(zhuǎn)換。在轉(zhuǎn)換過程期間,不僅程序代碼從源 語言轉(zhuǎn)換成使用目標語言的功能上相等的代碼,而且程序代碼也變?yōu)?安全的" (即,如果執(zhí)行則不能夠引起對計算設(shè)備的損害)。例如,以下指令可使用源語 言——"X/Y"來實現(xiàn),其中"X"和"Y"是數(shù)字變量。如果"Y"等于值O,則 這種類型的指令將引起程序崩潰。在這種情況中,指令被轉(zhuǎn)換成"只要Y^O則為 X/Y"。作為另一示例,插件模塊218轉(zhuǎn)換試圖訪問諸如硬件設(shè)備、存儲器和寄存 器等資源的指令。如以上參考圖2所述的,結(jié)合維護虛擬資源的虛擬環(huán)境212來實 現(xiàn)本發(fā)明。在這種情況中,本發(fā)明轉(zhuǎn)換訪問資源的指令,以便完成虛擬資源與實際 資源之間必需的映射。
如圖3中所示,當潛在惡意軟件302-306被轉(zhuǎn)換成體系結(jié)構(gòu)中立程序代碼308 之后,編譯引擎210和插件模塊220將體系結(jié)構(gòu)中立程序代碼308 "編譯"成安全 程序代碼。在圖3中,安全程序代碼由安全程序代碼310、安全程序代碼312、以 及安全程序代碼314表示。如圖所示,安全程序代碼可取決于CPU202 (圖2)的 體系結(jié)構(gòu)使用多種不同格式中的任一種。如本領(lǐng)域中的技術(shù)人員及其他人所已知 的,編譯在傳統(tǒng)上被定義為將高級程序代碼轉(zhuǎn)換成可執(zhí)行代碼。就本發(fā)明而言,編 譯引擎210從體系結(jié)構(gòu)中立程序代碼308生成可執(zhí)行程序代碼。在本發(fā)明的一個實 施例中,體系結(jié)構(gòu)中立程序代碼308是二進制格式的。因此,由編譯引擎210執(zhí)行的"編譯"被定義為從體系結(jié)構(gòu)中立二進制代碼生成可執(zhí)行程序代碼。而且,編譯 引擎210提供用于將程序代碼從體系結(jié)構(gòu)中立格式"編譯"成滿足專用計算機體系 結(jié)構(gòu)的約束的可執(zhí)行代碼的一般框架。換言之,編譯引擎210不限于在兩種格式之
間"編譯"程序代碼。相反,取決于CPU 202的體系結(jié)構(gòu),編譯引擎210可將體 系結(jié)構(gòu)中立程序代碼308編譯成多種格式中的任一種的程序代碼。在這點上,由編 譯引擎210提供的功能可由插件模塊擴展。在本發(fā)明的一個實際實施例中,插件模 塊220支持將體系結(jié)構(gòu)中立程序代碼"編譯"成滿足"X86" 32位指令集的約束的 程序代碼。
圖4是示出根據(jù)本發(fā)明形成的轉(zhuǎn)換方法400的一個示例性實施例的流程圖。 響應(yīng)于接收執(zhí)行潛在惡意軟件的請求,轉(zhuǎn)換方法400順序分析潛該惡意軟件中的指 令。當遇到作為之前未由本發(fā)明分析的基本塊中的第一條指令的指令時,轉(zhuǎn)換方法 400使掃描器執(zhí)行對基本塊中的惡意軟件的搜索。所選指令被解碼成描述該指令屬 性的數(shù)據(jù)集。然而,該數(shù)據(jù)集被用于將所選指令轉(zhuǎn)換成體系結(jié)構(gòu)中立格式的安全且 功能上相等的程序代碼。當程序代碼的基本塊被轉(zhuǎn)換成體系結(jié)構(gòu)中立格式之后,經(jīng) 轉(zhuǎn)換的程序代碼被"編譯"成可執(zhí)行代碼。繼續(xù)參考圖l-3及其所伴隨的描述,現(xiàn) 在將描述圖4中所示的示例性轉(zhuǎn)換方法400。
在步驟402處,轉(zhuǎn)換方法400保持空閑,并等待執(zhí)行潛在惡意軟件的請求。 如本領(lǐng)域中的技術(shù)人員及其他人所知的,可經(jīng)由各種不同的機制發(fā)起執(zhí)行潛在惡意 軟件的請求。例如,計算機用戶可通過在與程序相關(guān)聯(lián)的圖標上"雙擊"而發(fā)出啟 動程序執(zhí)行的請求。作為另一示例,計算機用戶可通過從下拉式菜單或其它基于圖 形的輸入系統(tǒng)發(fā)出"打開文件"命令來發(fā)起與文件相關(guān)聯(lián)的程序的執(zhí)行。然而,如 本領(lǐng)域中的技術(shù)人員及其他人所知的,以上提供的示例應(yīng)被解釋為示例性而非限制 性的,因為對發(fā)出執(zhí)行潛在惡意軟件的請求而言存在眾多不同的機制。
為了滿足步驟402處接收的請求,操作系統(tǒng)的現(xiàn)有組件在步驟404處執(zhí)行動 作來為執(zhí)行潛在惡意軟件作準備。 一般,為了執(zhí)行程序,操作系統(tǒng)為程序初始化地 址空間(即,存儲器),并將所需程序代碼復制到經(jīng)初始化的地址空間內(nèi)。然而, 如本領(lǐng)域中的技術(shù)人員及其他人所知的,惡意軟件可能通過在惡意軟件簽名可被標 識之前對有效負載解密或"打開"來在執(zhí)行期間更改存儲器中的數(shù)據(jù)。 一般,惡意 軟件有效負載作為對已經(jīng)存儲在存儲器中的數(shù)據(jù)的算術(shù)和/或邏輯運算的應(yīng)用的結(jié) 果而被"打開"。在任何情況中,與潛在惡意軟件相關(guān)聯(lián)的程序代碼在步驟404 處被加載到存儲器中。
13在步驟406處,轉(zhuǎn)換方法400初始化描述潛在惡意軟件中包括基本塊之間的 執(zhí)行流在內(nèi)的基本塊屬性的數(shù)據(jù)結(jié)構(gòu)。如以下將參考圖5進一步詳細描述的,本發(fā) 明一般執(zhí)行程序代碼的單位是基本塊。在步驟406處,使用描述每一基本塊的信息 初始化數(shù)據(jù)結(jié)構(gòu)。例如,標識被調(diào)度成在當前基本塊之后執(zhí)行的基本塊的后繼基本 塊并將其存儲在數(shù)據(jù)結(jié)構(gòu)中。而且,標識在基本塊之間發(fā)生的控制轉(zhuǎn)移的類型(即, 條件和非條件分支等)并將其存儲在數(shù)據(jù)結(jié)構(gòu)中。在這一點上,標識從其它基本塊 中接受控制或?qū)⒖刂妻D(zhuǎn)移給另一基本塊的指令。
在步驟408處,選擇將由轉(zhuǎn)換方法400分析的指令。如前所述,程序中的指
令以定義的順序被執(zhí)行。然而,諸如分支等某些指令通過在用于標識被調(diào)度來執(zhí)行 的下一指令的寄存器中置新值來中斷正常的執(zhí)行順序。如將在以下進一步詳細描述 的,中斷正常執(zhí)行順序的指令標記基本塊的末尾。由轉(zhuǎn)換方法400執(zhí)行的分析遵循 程序執(zhí)行時發(fā)生的同一執(zhí)行流。然而,分析以及之后執(zhí)行程序代碼的基本單位是基 本塊。由于可使用本領(lǐng)域中公知的技術(shù)來標識位于執(zhí)行流中的指令,因此將不在此 處提供對轉(zhuǎn)換方法在步驟408處使用的技術(shù)的進一步描述。
如圖4中所示,轉(zhuǎn)換方法400在步驟410處確定步驟408處所選的指令是否 是基本塊中之前未被本發(fā)明分析過的第一條指令。在本發(fā)明的一個實施例中,位于 程序入口點處或位于跳轉(zhuǎn)指令的目的地地址處的指令被標識為基本塊中的第一條 指令。而且,轉(zhuǎn)換方法400通過將所選指令的地址與之前分析過的每一基本塊(如 有)中的第一條指令的地址進行比較來確定基本塊之前是否已被轉(zhuǎn)換成安全程序代 碼。如果所選指令不匹配之前分析的基本塊中的第一條指令的地址,則所選指令是 之前未被轉(zhuǎn)換成安全程序代碼的新基本塊的開頭,且轉(zhuǎn)換方法400前進至步驟412。 反之,如果所選指令不是基本塊中的第一條指令或者當前基本塊之前已被分析,則 轉(zhuǎn)換方法400前進至步驟414。
在步驟412處,在步驟406處初始化的數(shù)據(jù)結(jié)構(gòu)中創(chuàng)建步驟410處所標識的 基本塊的條目。如前所述,由本發(fā)明維護的數(shù)據(jù)結(jié)構(gòu)描述了被轉(zhuǎn)換成安全程序代碼 的基本塊的屬性。例如,每一基本塊的起始地址以及描述基本塊的屬性的其它數(shù)據(jù) 被存儲在該數(shù)據(jù)結(jié)構(gòu)中。而且,步驟412處在數(shù)據(jù)結(jié)構(gòu)中創(chuàng)建條目包括實例化與基 本塊相關(guān)聯(lián)的某些變量。例如,實例化指示是否已對基本塊掃描惡意軟件的變量(后 文中稱為"掃描變量")以及指示基本塊是否被轉(zhuǎn)換成安全程序代碼的變量(后文 中稱為"轉(zhuǎn)換變量")并將其存儲在數(shù)據(jù)結(jié)構(gòu)中。當實例化這些變量時,在步驟 412處,它們的值指示尚未對基本塊掃描惡意軟件或基本塊尚未被轉(zhuǎn)換成安全程序代碼。
在步驟414處,轉(zhuǎn)換方法400確定是否需要在執(zhí)行包含所選指令的基本塊前 對其搜索惡意軟件。如上所述,"掃描"變量與每一基本塊相關(guān)聯(lián),它指示之前是 否對該基本塊掃描過惡意軟件。在步驟414處,轉(zhuǎn)換方法400標識與當前基本塊相 關(guān)聯(lián)的變量的值。如果之前未對當前基本塊搜索惡意軟件,則轉(zhuǎn)換方法400前進至 步驟416。反之,如果之前搜索過該基本塊,則轉(zhuǎn)換方法400前進至下述步驟426。
在步驟416處,轉(zhuǎn)換方法400使得為步驟408處所選指令所在的基本塊執(zhí)行 掃描。在本發(fā)明的一個實施例中,掃描器204 (圖2)中的軟件實現(xiàn)的例程對當前 基本塊搜索惡意軟件。如上所述,大多數(shù)防病毒軟件應(yīng)用程序或掃描器通過將數(shù)據(jù) 模式與惡意軟件"簽名"進行匹配來搜索惡意軟件。然而,當數(shù)據(jù)被"打開"(即 解密)或在執(zhí)行期間下載到存儲器中時,隨著某些隱蔽惡意軟件的出現(xiàn)而出現(xiàn)現(xiàn)有 反病毒軟件的漏洞。在這種情況中,潛在惡意軟件中的程序代碼的執(zhí)行繼續(xù),而沒 有執(zhí)行對惡意軟件的附加掃描。換言之,當數(shù)據(jù)在運行時被"打開"時,執(zhí)行不會 被中斷。然而,如將在以下參考圖5更詳細描述的,本發(fā)明當數(shù)據(jù)在運行時被"打 開"時會中斷程序執(zhí)行。因此,在步驟416處,在惡意軟件有效負載被"打開"或 加載到存儲器中之后,掃描器204可搜索隱蔽惡意軟件。而且,在當前基本塊被掃 描之后,在步驟416處,轉(zhuǎn)換方法400設(shè)置與當前基本塊相關(guān)聯(lián)的"掃描"變量的 值來指示已對當前基本塊掃描了惡意軟件。
如圖4中所示,在步驟418處,轉(zhuǎn)換方法400確定當前基本塊在步驟416處 是否被標識為受到惡意軟件感染。如果標識了惡意軟件感染,則方法400進而在步 驟420處使用本領(lǐng)域中公知的技術(shù)向用戶報告感染。如果未標識惡意軟件感染,則 轉(zhuǎn)換方法400前進至下述步驟426。
在步驟422處,轉(zhuǎn)換方法400確定是否以足夠的精確性得出惡意軟件的身份。 當檢測到惡意軟件時,通??蓮膼阂廛浖暮灻蚱渌匦灾忻黠@得出惡意軟件的 身份。然而,在某些情況中,惡意軟件的感染是顯而易見的,但不知道惡意軟件的 確切身份。例如,某些惡意軟件具有難以區(qū)分的變體。在任何情況中,如果基本塊 受到感染,且以足夠的精確性得出惡意軟件的身份,則轉(zhuǎn)換方法400前進至步驟 424,在那里它終止。反之,如果不能以足夠的精確性得出惡意軟件的身份,則轉(zhuǎn) 換方法400前進至步驟426。
在步驟426處,轉(zhuǎn)換方法400確定包含所選指令的基本塊在被執(zhí)行之前是否 需要被轉(zhuǎn)換成安全程序代碼。如前所述,本發(fā)明使"轉(zhuǎn)換"變量與每一基本塊相關(guān)聯(lián),該變量指示該基本塊之前是否被轉(zhuǎn)換并被"編譯"成安全且可執(zhí)行的程序代碼。 如果基本塊之前未被轉(zhuǎn)換并"編譯"成可執(zhí)行且安全的程序代碼,則轉(zhuǎn)換變量指示
該基本塊是潛在惡意軟件。在步驟426處,轉(zhuǎn)換方法400標識當前基本塊的轉(zhuǎn)換變 量的值。如果當前基本塊是潛在惡意軟件,則轉(zhuǎn)換方法400前進至步驟428。反之, 如果基本塊之前被轉(zhuǎn)換并被"編譯"成可執(zhí)行且安全的程序代碼,則轉(zhuǎn)換方法400 前進至步驟440,在那里它終止。在這種情況中,基本塊可根據(jù)以下參考圖5描述 的執(zhí)行方法500被安全地執(zhí)行。
如圖4中所示,轉(zhuǎn)換方法400在步驟428處將所選指令從源語言(g卩,本機 CPU程序代碼、平臺無關(guān)字節(jié)代碼、腳本程序代碼等)解碼成描述該指令的數(shù)據(jù) 集。該數(shù)據(jù)集包括但不限于,指令的長度和類型、操作數(shù)的個數(shù)和類型、執(zhí)行該指 令所需的特權(quán)級別。在步驟428處,將所選指令從源語言解碼成描述指令的數(shù)據(jù)集, 以使由所選指令提供的功能可被轉(zhuǎn)換成體系結(jié)構(gòu)中立格式。由于所選指令可使用本 領(lǐng)域中公知的技術(shù)來解碼,因此將不在此處提供對本發(fā)明所使用的技術(shù)的進一步描 述。
在步驟430處,所選指令被轉(zhuǎn)換成體系結(jié)構(gòu)中立格式的安全程序代碼。這種 轉(zhuǎn)換可由轉(zhuǎn)換引擎206的插件模塊,諸如插件模塊218 (圖2)來執(zhí)行。在描述本 發(fā)明的一個示例性實施例的一般情況中,轉(zhuǎn)換方法400將正被分析的所選指令轉(zhuǎn)換 成體系結(jié)構(gòu)中立格式的安全指令。為了執(zhí)行這種轉(zhuǎn)換,可用于"打開"(即,解密) 或?qū)е聬阂廛浖δ艿拿恳活愔噶钣赊D(zhuǎn)換引擎206的插件模塊中所包含的例程轉(zhuǎn) 換成安全程序代碼。在這一點上,實現(xiàn)算術(shù)運算(即,"加"、"乘"等)、逐位 運算(g卩,"與"、"或"、"異或"等)、使用硬件設(shè)備的輸入/輸出(即,"讀"、 "寫"等)等的指令被轉(zhuǎn)換成體系結(jié)構(gòu)中立格式的功能相等的程序代碼。例如,本 發(fā)明使用包括虛擬I/0系統(tǒng)214的虛擬環(huán)境212 (圖2)中的資源。因此,如果所 選指令試圖訪問I/0設(shè)備,則方法400轉(zhuǎn)換該指令,以使輸入和輸出被發(fā)送給虛擬 I/O系統(tǒng)214。盡管描述了本發(fā)明轉(zhuǎn)換的指令的具體示例,但所提供的示例應(yīng)該被 解釋為示例性而非限制性的。
如圖4中所示,轉(zhuǎn)換方法400在步驟432處確定步驟408處所選的指令是否 是基本塊中的最后一條指令。本領(lǐng)域中的技術(shù)人員及其他人可以認識到,基本塊以 諸如跳轉(zhuǎn)指令等單個退出點結(jié)束。在步驟432處,轉(zhuǎn)換方法400確定所分析的指令 是否是基本塊中的最后一條指令。由于基本塊中的最后一條指令可使用本領(lǐng)域中公 知的技術(shù)來標識,因此將不在此處更詳細描述本發(fā)明所使用的技術(shù)的進一步描述。如果所分析的指令是當前基本塊中的最后一條指令,則轉(zhuǎn)換方法400前進至步驟
432。反之,如果所選指令不是基本塊中的最后一條指令,則轉(zhuǎn)換方法400回到步 驟408,并重復步驟408到432直到選擇了當前基本塊中的最后一條指令。
如圖4中所示,在步驟434處,轉(zhuǎn)換方法400使當前基本塊被"編譯"成可 執(zhí)行程序代碼。如本領(lǐng)域的技術(shù)人員及其他人所知的,編譯器是獲取以源語言編寫 的程序代碼并生成為特定體系結(jié)構(gòu)設(shè)計的可執(zhí)行程序代碼的程序。 一般,編譯器首 先從源語言逐個解析所有的程序代碼。然后,在一個或多個相繼階段,編譯器以確 保指令正確引用其它指令的方式來構(gòu)建可執(zhí)行代碼。由編譯器產(chǎn)生的輸出滿足計算 設(shè)備的體系結(jié)構(gòu)要求,并允許CPU順序執(zhí)行指令。對于本發(fā)明,在步驟434處, 轉(zhuǎn)換方法400從體系結(jié)構(gòu)中立程序代碼生成可執(zhí)行程序代碼。由于體系結(jié)構(gòu)中立程 序代碼是二進制格式,因此在步驟434處進行的"編譯"涉及從體系結(jié)構(gòu)中立二進 制代碼生成可執(zhí)行程序代碼。而且,如將在以下進一步詳細描述的,在"編譯"期 間,可將一條或多條指令添加到已編譯代碼中。在本發(fā)明的一個實際實施例中,編 譯引擎210的插件模塊220支持將體系結(jié)構(gòu)中立程序代碼"編譯"成滿足"X86" 32位指令集的約束的程序代碼。然后,轉(zhuǎn)換方法前進至步驟436,在那里它終止。
在步驟436處,轉(zhuǎn)換方法400確定"已編譯"程序代碼中的最后一條指令是 否是跳轉(zhuǎn)指令。 一般,基本塊以將執(zhí)行控制轉(zhuǎn)移給當前基本塊以外的程序代碼的跳 轉(zhuǎn)指令結(jié)束。在步驟430處,本發(fā)明將所遇到的跳轉(zhuǎn)指令轉(zhuǎn)換成在基本塊執(zhí)行之后 使執(zhí)行控制返回給塊管理器208 (圖2)的新跳轉(zhuǎn)指令。在基本塊被執(zhí)行之前,塊 管理器208執(zhí)行上述包括使掃描器204搜索惡意軟件在內(nèi)的一些動作。然而,程序 代碼的基本塊可由本發(fā)明為惡意軟件檢測的目的而被拆分、合并或以其它方式處 理。例如,如將在以下參考圖5更詳細描述的,當執(zhí)行使得存儲器中的程序代碼在 當前執(zhí)行點之后在基本塊中改變時,在沒有對該基本塊掃描惡意軟件的情況下繼續(xù) 執(zhí)行可能導致不合需要的功能。在這種情況中,基本塊被"拆分"成兩個或更多的 基本塊。結(jié)果,在這種或其它情況中,轉(zhuǎn)換方法400將遇到不以跳轉(zhuǎn)指令結(jié)束的基 本塊。如果已編譯程序代碼中的最后一條指令是跳轉(zhuǎn)指令,則程序控制將在當前基 本塊執(zhí)行之后被返回給塊管理器208。在這種情況中,轉(zhuǎn)換方法400前進至塊440, 在那里它終止。反之,如果已編譯程序代碼中的最后一條指令不是跳轉(zhuǎn)指令,則在 當前基本塊執(zhí)行之后控制將不會正常地返回給塊管理器208。在這種情況中,轉(zhuǎn)換 方法400前進至步驟438。
在步驟438處,向"已編譯"程序代碼添加在基本塊的執(zhí)行完成之后使程序控制返回給塊管理器208 (圖2)的指令。本發(fā)明管理程序執(zhí)行流的各方面,使得
加載到存儲器中的潛在惡意軟件在執(zhí)行之前可被掃描并被轉(zhuǎn)換成安全程序代碼。如
前所述,塊管理器208控制執(zhí)行流。因此,在步驟438處向已編譯程序代碼添加在 基本塊執(zhí)行完成之后使程序控制返回給塊管理器208的指令。
在本發(fā)明的替換實施例中,向"已編譯"程序代碼添加不會將程序控制轉(zhuǎn)移 給塊管理器208的指令。在該實施例中,如果被調(diào)度來執(zhí)行的下一基本塊是干凈的, 例如之前曾掃描過惡意軟件且不會作為執(zhí)行結(jié)果而被更改,則在步驟438添加將程 序控制轉(zhuǎn)移給調(diào)度來執(zhí)行的下一基本塊的指令。
參考圖4描述的轉(zhuǎn)換方法400中的步驟也可按照不同于所示的順序執(zhí)行。而 且,某些步驟可被添加或可從轉(zhuǎn)換方法400移除,而不背離本發(fā)明的范圍。例如, 當潛在惡意軟件的基本塊被轉(zhuǎn)換成程序代碼之后,安全程序代碼可被"優(yōu)化",即 重新配置,以便迅速執(zhí)行。因此,圖4中所述的方法400僅提供可在其中實現(xiàn)本發(fā) 明的實施例的方式的一個示例。
圖5是可結(jié)合以上參考圖4所述的轉(zhuǎn)換400使用以執(zhí)行已轉(zhuǎn)換程序代碼的基 本塊的一個示例性執(zhí)行方法500的流程圖。特別地,在基于硬件的CPU上順序選 擇并執(zhí)行基本塊中的指令。在某些情況中,存儲器中的程序代碼被"打開"(即, 解密),且之前轉(zhuǎn)換的程序代碼被更改。在這種情況中,曾被更改的基本塊為"臟", 例如需要在被執(zhí)行之前對其搜索惡意軟件并被轉(zhuǎn)換成安全程序代碼。繼續(xù)參考圖 1-4以及伴隨的描述,現(xiàn)在將描述圖5中所示的示例性執(zhí)行方法500。
在步驟502處,執(zhí)行方法500保持空閑并等待,直到已轉(zhuǎn)換程序代碼準備好 被執(zhí)行。在本發(fā)明的實際實施例中,當轉(zhuǎn)換方法400 (圖4)完成基本塊的轉(zhuǎn)換時, 已轉(zhuǎn)換程序代碼準備好被執(zhí)行。
在步驟504處,執(zhí)行方法500選擇被調(diào)度來執(zhí)行的基本塊中的指令。在本發(fā) 明的一個實施例中,已被轉(zhuǎn)換成安全程序代碼的基本塊被存儲在用于臨時存儲的 "緩沖區(qū)"或存儲區(qū)中。分配給"緩沖區(qū)"的存儲器地址可能不會被潛在惡意軟件 更改。對所選的每一指令,執(zhí)行方法500使得指令被執(zhí)行。然后作出執(zhí)行是否導致 中斷條件的判斷。在所選指令導致中斷條件的情況中,執(zhí)行方法500標識中斷條件 的來源。在某些情況中,中斷條件源于存儲器中正被"打開"(即,解密)的程序 代碼。在這種情況中,曾被更改或重寫的基本塊在被執(zhí)行之前被重新轉(zhuǎn)換成安全程 序代碼。
在步驟506處,執(zhí)行方法500使所選指令被執(zhí)行。如本領(lǐng)域的技術(shù)人員及其他人所知的,CPU的主要用途是執(zhí)行指令。因此,多種市場上銷售的CPU中的任
一種可用于實現(xiàn)執(zhí)行方法500的這一方面。 一般,CPU遵循"取出并執(zhí)行"周期,
其中指令被順序地從存儲器中"取出"然后被"執(zhí)行"。對于本發(fā)明,從緩沖區(qū)而 非存儲潛在惡意軟件的存儲器位置中"取出"指令。如上所述,緩沖區(qū)包含可被安 全執(zhí)行而不會使計算設(shè)備受到惡意軟件的影響的已轉(zhuǎn)換程序代碼。
在執(zhí)行期間,方法500確定所選指令是否試圖執(zhí)行非法或特許操作。例如, 所選指令可能試圖執(zhí)行數(shù)字除以0的算術(shù)運算或訪問特許存儲器位置。在本發(fā)明的 一個實施例中,從潛在惡意軟件轉(zhuǎn)換的安全程序代碼被配置成使得程序代碼能夠檢 測在執(zhí)行期間出現(xiàn)的出錯條件并中斷執(zhí)行。如果在執(zhí)行期間標識了出錯條件,則之 前開發(fā)的異常處理程序?qū)⒃噲D從出錯條件恢復。如本領(lǐng)域的技術(shù)人員及其他人所知 的,異常處理程序是使用處理中斷的結(jié)構(gòu)化方法的事件驅(qū)動的例程。在某些情況中, 出錯條件是可恢復的,且程序執(zhí)行可在遇到中斷條件之后恢復。在其它情況中,中 斷條件是臨界的,且程序執(zhí)行在完成之前停止。然而,在出錯條件可恢復的情況中, 在程序控制被轉(zhuǎn)移給異常處理程序之前,存儲恢復執(zhí)行所必需的信息。
如圖5中所示,在步驟508處,當所選指令被執(zhí)行之后,執(zhí)行方法500確定 作為執(zhí)行結(jié)果是否導致了中斷條件。中斷條件可在不同的情況中出現(xiàn),包括但不限 于當執(zhí)行導致(1)當前基本塊中執(zhí)行點之后的數(shù)據(jù)被更改;以及(2)被調(diào)度來將 執(zhí)行的后續(xù)基本塊中的數(shù)據(jù)被更改時的情況。如將在以下更詳細描述的,執(zhí)行方法 500有差別地處理這些中斷條件。如果在步驟508處檢測到中斷條件,則執(zhí)行方法 500前進至如下所述的框512。反之,如果未在步驟508處檢測到中斷條件,則執(zhí) 行方法500前進至步驟510。
在步驟510處,執(zhí)行方法500確定是否當前基本塊中的所有指令均已被執(zhí)行。 如前所述,本發(fā)明執(zhí)行程序代碼的基本單位是基本塊。如果當前基本塊中的所有指 令都已被執(zhí)行,則執(zhí)行方法500前進至下述步驟520。反之,如果當前基本塊中還 有未被執(zhí)行的指令,則方法500回到步驟504,并重復步驟504到510直到當前基 本塊中的所有指令均被執(zhí)行。
在步驟512處,執(zhí)行方法500確定步驟508處所標識的中斷條件是否需要立 即轉(zhuǎn)換程序代碼。例如,在執(zhí)行導致潛在惡意軟件被"打開"(即,解密)使得當 前基本塊中被調(diào)度來在所選指令之后執(zhí)行的程序代碼被更改的情況中,在執(zhí)行恢復
之前執(zhí)行對被更改的程序代碼的轉(zhuǎn)換。如前參考圖4所述的,程序代碼的基本塊可 由本發(fā)明為惡意軟件檢測的目的而被拆分、合并或以其它方式處理。在當前基本塊中當前執(zhí)行點之后的程序代碼被更改的情況中,該基本塊被拆分成兩個基本塊;第 一個塊包含已經(jīng)執(zhí)行的程序代碼,第二個塊包含所選指令之后的程序代碼。如以下 進一步詳細描述的,對第二基本塊掃描惡意軟件,并在執(zhí)行之前將其轉(zhuǎn)換成安全程
序代碼。如果不需要立即轉(zhuǎn)換程序代碼,則執(zhí)行方法500前進至下述的步驟516。 反之,如果需要立即轉(zhuǎn)換程序代碼,則執(zhí)行方法500前進至步驟514。
在步驟514處,執(zhí)行方法500使得基本塊被掃描并被轉(zhuǎn)換成安全程序代碼。 更具體地,如果到達步驟514,則基于當前執(zhí)行點將基本塊拆分成兩個基本塊。包 含被調(diào)度來在所選指令之后執(zhí)行的程序代碼的基本塊被標記為在執(zhí)行之前需要掃 描并轉(zhuǎn)換成安全程序代碼。以上參考圖4描述了用于將程序代碼的基本塊轉(zhuǎn)換成安 全程序代碼的方法的一個實施例。然后,執(zhí)行方法500前進至下述步驟520。
在步驟516處,執(zhí)行方法500確定是否因為被調(diào)度來在當前基本塊之后執(zhí)行 的隨后基本塊中的程序代碼作為執(zhí)行結(jié)果而被更改而導致步驟508處所標識的中 斷條件。例如,在執(zhí)行所選指令使程序代碼"打開"(即,解密)使得后續(xù)基本塊 中的數(shù)據(jù)被更改的情況中,則在執(zhí)行該后續(xù)基本塊之前對該其搜索惡意軟件并將其 轉(zhuǎn)換成安全程序代碼。如果因為后續(xù)基本塊中的程序代碼被更改而導致步驟506 處標識的中斷條件,則執(zhí)行方法500前進至步驟518。反之,如有由于一不同的原 因而導致中斷條件,則執(zhí)行方法500前進至下述步驟520。
在步驟518處,執(zhí)行方法500標記作為所選指令的執(zhí)行結(jié)果而被更改的基本 塊,以便在這些基本塊執(zhí)行之前對其搜索惡意軟件并將其轉(zhuǎn)換成安全程序代碼。如 參考圖4所述(步驟412), 一掃描變量和轉(zhuǎn)換變量與每一基本塊相關(guān)聯(lián)。這些變 量指示是否對基本塊搜索了惡意軟件或者它們是否已被轉(zhuǎn)換成安全程序代碼。在步 驟518處,執(zhí)行方法500改變與作為執(zhí)行結(jié)果而被更改的每一基本塊相關(guān)聯(lián)的變量 的值,以指示這些基本塊需要執(zhí)行之前針掃描惡意軟件并轉(zhuǎn)換成安全程序代碼。
在步驟520處,執(zhí)行方法500使步驟406 (圖4)處初始化的數(shù)據(jù)結(jié)構(gòu)被更新。 如前所述,本發(fā)明使用數(shù)據(jù)結(jié)構(gòu)來跟蹤基本塊之間的執(zhí)行流。當實現(xiàn)本發(fā)明的這一 方面時,塊管理器208 (圖2)獲取執(zhí)行的控制,并對數(shù)據(jù)結(jié)構(gòu)執(zhí)行更新。本領(lǐng)域 的技術(shù)人員及其他人可以認識到,使用執(zhí)行方法500執(zhí)行基本塊可導致原始執(zhí)行流 改變。例如,執(zhí)行基本塊可導致加載到存儲器中的數(shù)據(jù)被之前解密的數(shù)據(jù)更改。顯 然,在這種情況中,改變了基本塊之間的原始執(zhí)行流。結(jié)果,執(zhí)行方法500更新數(shù) 據(jù)結(jié)構(gòu)來反映作為執(zhí)行結(jié)果而發(fā)生的改變。 一般,被調(diào)度來執(zhí)行的下一基本塊然后 將根據(jù)轉(zhuǎn)換方法400和執(zhí)行方法500被轉(zhuǎn)換成安全程序代碼并被執(zhí)行。然后,執(zhí)行方法500前進至步驟522,在那里它終止。
盡管示出和描述了本發(fā)明的較佳實施例,但可以理解,可在其中進行各種改 變而不背離本發(fā)明的精神和范圍。
權(quán)利要求
1. 一種用于響應(yīng)于接收執(zhí)行潛在惡意軟件的請求而生成安全程序代碼的計算機實現(xiàn)的方法,所述方法包括(a)對所述潛在惡意軟件中所包含的程序代碼解碼;(b)將所述已解碼程序代碼轉(zhuǎn)換成安全且功能上相等的程序代碼;以及(c)在計算設(shè)備上執(zhí)行所述安全且功能上相等的程序代碼。
2. 如權(quán)利要求l所述的方法,其特征在于,還包括將所述潛在惡意軟件的基 本塊加載到存儲器中。
3. 如權(quán)利要求2所述的方法,其特征在于,還包括使掃描器對存儲器中所加 載的基本塊執(zhí)行分析以確定所述潛在惡意軟件是否由具有惡意的程序代碼特征組 成。
4. 如權(quán)利要求2所述的方法,其特征在于,所述基本塊中的第一條指令被標識。
5. 如權(quán)利要求2所述的方法,其特征在于,所述基本塊中的最后一條指令被標識。
6. 如權(quán)利要求l所述的方法,其特征在于,還包括,生成描述所述潛在惡意 軟件中的基本塊之間的執(zhí)行流的數(shù)據(jù)結(jié)構(gòu)。
7. 如權(quán)利要求l所述的方法,其特征在于,所述對潛在惡意軟件中所包含的 程序代碼解碼包括從所述潛在惡意軟件生成體系結(jié)構(gòu)中立程序代碼。
8. 如權(quán)利要求7所述的方法,其特征在于,所述源語言滿足X86-32位計算 機體系結(jié)構(gòu)的規(guī)范。
9. 如權(quán)利要求l所述的方法,其特征在于,所述將已解碼程序代碼轉(zhuǎn)換成安 全且功能上相等的程序代碼包括(a) 選擇所述潛在惡意軟件中的一條指令;(b) 生成不能實現(xiàn)惡意軟件功能的體系結(jié)構(gòu)中立格式的等效的指令集;以及(c) 將所述體系結(jié)構(gòu)中立格式的指令集編譯成可執(zhí)行的程序代碼。
10. 如權(quán)利要求1所述的方法,其特征在于,所述將已解碼的程序代碼轉(zhuǎn)換成安全且功能上相等的程序代碼包括(a)選擇所述已解碼程序代碼中的一條指令;以及(b)生成不能實現(xiàn)惡意軟件功能的功能上相等且安全的可執(zhí)行指令集。
11. 如權(quán)利要求1所述的方法,其特征在于,執(zhí)行所述安全且功能上相等的 程序代碼的單位是基本塊。
12. 如權(quán)利要求ll所述的方法,其特征在于,所述基本塊的執(zhí)行包括(a) 選擇所述基本塊中的一條指令;(b) 使所述指令由中央處理單元執(zhí)行;以及 (C)確定對所選指令的執(zhí)行是否導致中斷條件。
13. 如權(quán)利要求12所述的方法,其特征在于,當對所選指令的執(zhí)行使所述基 本塊中被調(diào)度來在所選指令之后執(zhí)行的程序代碼被更改時,所述基本塊被拆分成兩 個基本塊。
14. 如權(quán)利要求12所述的方法,其特征在于,所執(zhí)行的安全且功能上相等的程序代碼被配置成(a) 檢測在執(zhí)行期間發(fā)生的出錯;(b) 中斷執(zhí)行并調(diào)用異常處理程序;以及(C)使所述異常處理程序完成執(zhí)行之后恢復執(zhí)行所必需的信息被存儲。
15. —種承載計算機可執(zhí)行指令的計算機可讀介質(zhì),所述指令當被執(zhí)行時實現(xiàn)用于響應(yīng)于接收執(zhí)行潛在惡意軟件的請求而生成安全程序代碼的方法,所述方法包括(a) 對所述潛在惡意軟件中所包含的程序代碼解碼;(b) 將所述已解碼程序代碼轉(zhuǎn)換成安全且功能上相等的程序代碼;以及 (C)在計算設(shè)備上執(zhí)行所述安全且功能上相等的程序代碼。
16. 如權(quán)利要求15所述的計算機可讀介質(zhì),其特征在于,還包括將所述潛在惡意軟件的基本塊加載到存儲器中。
17. 如權(quán)利要求16所述的計算機可讀介質(zhì),其特征在于,還包括使掃描器對 存儲器中所加載的基本塊執(zhí)行分析以確定所述潛在惡意軟件是否由具有惡意軟件 特征的程序代碼組成。
18. 如權(quán)利要求16所述的計算機可讀介質(zhì),其特征在于,所述基本塊中的第 一條指令被標識。
19. 如權(quán)利要求16所述的計算機可讀介質(zhì),其特征在于,所述基本塊中的最 后一條指令被標識。
20. 如權(quán)利要求15所述的計算機可讀介質(zhì),其特征在于,還包括生成描述所述潛在惡意軟件中的基本塊之間的執(zhí)行流的數(shù)據(jù)結(jié)構(gòu)。
21. 如權(quán)利要求15所述的計算機可讀介質(zhì),其特征在于,所述對潛在惡意軟 件中所包含的程序代碼解碼包括從所述潛在惡意軟件生成體系結(jié)構(gòu)中立程序代碼。
22. 如權(quán)利要求21所述的計算機可讀介質(zhì),其特征在于,所述源語言滿足 X86-32位計算機體系結(jié)構(gòu)的規(guī)范。
23. 如權(quán)利要求15所述的計算機可讀介質(zhì),其特征在于,所述將已解碼程序 代碼轉(zhuǎn)換成安全且功能上相等的程序代碼包括(a) 選擇所述潛在惡意軟件中的一條指令;(b) 生成不能實現(xiàn)惡意軟件功能的體系結(jié)構(gòu)中立格式的等效的指令集;以及(c) 將所述體系結(jié)構(gòu)中立格式的指令集編譯成可執(zhí)行的程序代碼。
24. 如權(quán)利要求15所述的計算機可讀介質(zhì),其特征在于,所述將已解碼程序代碼轉(zhuǎn)換成安全且功能上相等的程序代碼包括(a) 選擇所述己解碼程序代碼中的一條指令;以及(b) 生成不能實現(xiàn)惡意軟件功能的功能上相等且安全的可執(zhí)行指令集。
25. 如權(quán)利要求15所述的計算機可讀介質(zhì),其特征在于,執(zhí)行所述安全且功 能上相等的程序代碼的單位是基本塊。
26. 如權(quán)利要求25所述的計算機可讀介質(zhì),其特征在于,所述基本塊的執(zhí)行包括(a) 選擇所述基本塊中的一條指令;(b) 使所述指令由中央處理單元執(zhí)行;以及(c) 確定對所選指令的執(zhí)行是否導致中斷條件。
27. 如權(quán)利要求25所述的計算機可讀介質(zhì),其特征在于,當對所選指令的執(zhí) 行使所述基本塊中被調(diào)度來在所選指令之后執(zhí)行的程序代碼被更改時,所述基本塊 被拆分成兩個基本塊。
28. 如權(quán)利要求25所述的計算機可讀介質(zhì),其特征在于,所執(zhí)行的安全且功 能上相等的程序代碼被配置成(a) 檢測在執(zhí)行期間發(fā)生的出錯;(b) 中斷執(zhí)行并調(diào)用異常處理程序;以及(c) 使所述異常處理程序完成執(zhí)行之后恢復執(zhí)行所必需的信息被存儲。
29. —種用于在計算設(shè)備上安全地執(zhí)行潛在惡意軟件的軟件系統(tǒng),所述軟件系統(tǒng)包括(a) 用于確定加載到存儲器中的程序代碼是否是惡意軟件的掃描器;(b) 用于將源語言轉(zhuǎn)換成體系結(jié)構(gòu)中立格式的功能上相等且安全的程序代碼 的轉(zhuǎn)換引擎;(C)用于將所述體系結(jié)構(gòu)中立程序代碼編譯成可執(zhí)行程序代碼的編譯引擎;以及(d)跟蹤所述潛在惡意軟件的基本塊之間的程序執(zhí)行流的塊管理器。
30. 如權(quán)利要求29所述的軟件系統(tǒng),其特征在于,還包括執(zhí)行由所述編譯引擎編譯的程序代碼的中央處理單元。
31. 如權(quán)利要求29所述的軟件系統(tǒng),其特征在于,還包括被配置成當加載到 存儲器中的程序代碼被更改時與所述塊管理器通信的虛擬環(huán)境。
32. 如權(quán)利要求29所述的軟件系統(tǒng),其特征在于,所述轉(zhuǎn)換引擎被配置成支持用于將源語言轉(zhuǎn)換成體系結(jié)構(gòu)中立格式的程序代碼的插件模塊。
33. 如權(quán)利要求29所述的軟件系統(tǒng),其特征在于,所述編譯引擎被配置成支 持用于將所述體系結(jié)構(gòu)中立格式的程序代碼編譯成可在所述計算設(shè)備上執(zhí)行的程 序代碼的插件模塊。
34. 如權(quán)利要求29所述的軟件系統(tǒng),其特征在于,所述塊管理器被配置成將 跳轉(zhuǎn)指令插入到不以跳轉(zhuǎn)指令結(jié)束的基本塊中,其中所述跳轉(zhuǎn)指令使執(zhí)行控制在所 述基本塊執(zhí)行之后返回給所述塊管理器或后續(xù)基本塊;以及將跳轉(zhuǎn)指令插入到被拆 分的基本塊中。
35. 如權(quán)利要求29所述的軟件系統(tǒng),其特征在于,所述轉(zhuǎn)換引擎被配置成將 所述潛在惡意軟件中的跳轉(zhuǎn)指令轉(zhuǎn)換成在基本塊執(zhí)行完成之后將程序控制返回給 所述塊管理器或?qū)?zhí)行控制轉(zhuǎn)移給所述后續(xù)基本塊的指令。
全文摘要
本發(fā)明包括用于將潛在惡意軟件設(shè)備轉(zhuǎn)換成安全程序代碼的系統(tǒng)和方法。潛在惡意軟件從多個不同類型的源語言,包括但不限于本機CPU程序代碼、平臺無關(guān).NET字節(jié)代碼、腳本程序代碼等中的任何一種轉(zhuǎn)換。經(jīng)轉(zhuǎn)換的程序代碼被編譯成可由本機CPU理解并執(zhí)行的程序代碼。在執(zhí)行之前和/或期間,本發(fā)明使掃描器搜索存儲器中存儲的潛在惡意軟件。如果未檢測到惡意軟件,則計算設(shè)備使CPU執(zhí)行經(jīng)轉(zhuǎn)換的程序代碼。然而,如果存儲潛在惡意軟件的計算機存儲器在執(zhí)行期間被更改,則對惡意軟件的執(zhí)行和/或分析可能被中斷。在這種情況中,現(xiàn)在存儲在存儲器中的潛在惡意軟件在執(zhí)行之前被轉(zhuǎn)換成安全程序代碼。
文檔編號H04L9/32GK101438529SQ200580038599
公開日2009年5月20日 申請日期2005年12月5日 優(yōu)先權(quán)日2004年12月6日
發(fā)明者A·E·史蒂芬, A·M·馬里斯庫, G·M·格奧爾蓋斯庫 申請人:微軟公司