摘 要:隨著日益增加的系統(tǒng)安全脆弱性以及廣泛使用的因特網(wǎng)技術(shù),病毒等破壞性代碼也日益猖獗,嚴(yán)重威脅著網(wǎng)絡(luò)安全。本文介紹一種靜態(tài)分析可執(zhí)行程序代碼的新方法,針對(duì)程序中使用的API函數(shù)及庫(kù)函數(shù)序列靜態(tài)地分析程序的行為,實(shí)現(xiàn)在不運(yùn)行程序的前提下預(yù)警防范一些不安全行為,并基于此提出了一種基于函數(shù)識(shí)別的主動(dòng)防御技術(shù)。
關(guān)鍵詞:函數(shù)識(shí)別;靜態(tài)分析;主動(dòng)防御
中圖分類號(hào):TP393.08
計(jì)算機(jī)技術(shù)的不斷發(fā)展使得信息系統(tǒng)的安全性變得更加脆弱,正是這些安全脆弱性導(dǎo)致病毒等不安全代碼的產(chǎn)生與泛濫。不安全代碼不僅給企業(yè)及用戶帶來(lái)巨大經(jīng)濟(jì)損失,而且使國(guó)家的安全面臨著嚴(yán)重威脅。
隨著Internet的開(kāi)放性以及信息共享的進(jìn)一步增強(qiáng),惡意代碼編寫者的水平越來(lái)越高,他們利用各種隱藏加密技術(shù)、模糊變換技術(shù)等提高代碼的生存能力。目前大多數(shù)商用反病毒軟件使用基于“特征匹配”方法的檢測(cè)系統(tǒng),這種技術(shù)依賴于對(duì)已知病毒的專屬信息特征的分析和提取,因而對(duì)未知或變形的惡意代碼無(wú)法適用。基于語(yǔ)義的靜態(tài)分析技術(shù)通??梢詽M足分析代碼的任何要求,但由于分析過(guò)程相當(dāng)復(fù)雜耗時(shí),通常較難實(shí)現(xiàn)。本文描述的基于可識(shí)別函數(shù)序列的代碼靜態(tài)分析方法則是一種粗粒度的基于函數(shù)語(yǔ)義的惡意代碼主動(dòng)防御技術(shù),能比較高效準(zhǔn)確地識(shí)別程序行為,從而檢測(cè)出未知惡意代碼及一些變形代碼。
1 代碼分析方法
代碼的分析方法主要有兩種:靜態(tài)分析和動(dòng)態(tài)分析。靜態(tài)分析是在不執(zhí)行代碼的前提下檢查代碼以確定動(dòng)態(tài)執(zhí)行時(shí)的屬性,通常分為源代碼分析、反匯編分析、二進(jìn)制統(tǒng)計(jì)分析三種情況。動(dòng)態(tài)分析則通過(guò)檢測(cè)代碼運(yùn)行情況以檢測(cè)程序行為,因此它依賴于代碼的運(yùn)行環(huán)境和不同的監(jiān)測(cè)目標(biāo),也導(dǎo)致動(dòng)態(tài)分析的不完全。
靜態(tài)分析相比于動(dòng)態(tài)分析具有自身優(yōu)勢(shì),首先它并不受限于代碼的一次執(zhí)行過(guò)程因此能由代碼推導(dǎo)出所有執(zhí)行的特性。而動(dòng)態(tài)分析技術(shù)得到的特征是由代碼一次執(zhí)行或多次執(zhí)行的特性。此外,靜態(tài)分析能在代碼中惡意行為被激活之前檢測(cè)出以防止進(jìn)一步破壞系統(tǒng),起到提前預(yù)警防護(hù)的作用。但是靜態(tài)分析可能會(huì)得到大量冗余信息,分析結(jié)果也容易被代碼分析得到的冗余信息迷惑,動(dòng)態(tài)分析則可以確切地,有針對(duì)性地得到分析所需要的具體數(shù)據(jù)。
雖然兩種分析技術(shù)有很大差別,但并不是相互對(duì)立的,代碼的程序和行為之間有著強(qiáng)烈的依賴關(guān)系,決定了動(dòng)態(tài)和靜態(tài)分析相結(jié)合能達(dá)到更好的分析效果??梢韵壤渺o態(tài)分析技術(shù)獲得基本屬性,對(duì)于無(wú)法靜態(tài)檢測(cè)出的屬性則采用動(dòng)態(tài)監(jiān)控。本文描述的技術(shù)是采用靜態(tài)分析方法,在反匯編的基礎(chǔ)上識(shí)別函數(shù)序列,并以圖形結(jié)構(gòu)形式顯示,通過(guò)分析調(diào)用結(jié)構(gòu)圖來(lái)分析代碼的功能。
2 基本原理
2.1 理論依據(jù)
Windows是一個(gè)分層的操作系統(tǒng),總體架構(gòu)分為應(yīng)用層和核心層。為了保持系統(tǒng)的穩(wěn)定性,防止一些惡意行為破壞操作系統(tǒng)核心,應(yīng)用層無(wú)法直接訪問(wèn)操作系統(tǒng)資源,而必須通過(guò)核心層提供的接口調(diào)用操作系統(tǒng)提供的功能函數(shù)。Windows核心層是以函數(shù)的方式提供服務(wù)的,這些服務(wù)函數(shù)統(tǒng)稱為Application Programming Interface,簡(jiǎn)稱API函數(shù)。
惡意代碼與一般程序的區(qū)別在于執(zhí)行一些特殊的動(dòng)作來(lái)破壞系統(tǒng),這就必然要通過(guò)調(diào)用API函數(shù)達(dá)到隱藏、復(fù)制等目的。因此通過(guò)分析惡意代碼調(diào)用的API函數(shù)序列就可以基本判定程序執(zhí)行的功能和動(dòng)機(jī),比如要讀寫文件就必然調(diào)用CreateFile(),OpenFile(),NtOpenFile(),ZwOpenFile()等函數(shù),要訪問(wèn)網(wǎng)絡(luò)就必然要使用Socket函數(shù)。用戶在實(shí)際編寫應(yīng)用程序時(shí)通常不直接調(diào)用API函數(shù)而是通過(guò)編程環(huán)境自帶的庫(kù)函數(shù)實(shí)現(xiàn)各項(xiàng)功能,在靜態(tài)編譯的情況下,庫(kù)函數(shù)直接存在于執(zhí)行體的反匯編代碼中,因此我們可以通過(guò)庫(kù)函數(shù)來(lái)識(shí)別可執(zhí)行程序的部分功能。
2.2 API函數(shù)調(diào)用方式
API函數(shù)調(diào)用分為靜態(tài)調(diào)用和動(dòng)態(tài)調(diào)用兩種,前者是在啟動(dòng)程序的時(shí)候裝入動(dòng)態(tài)鏈接庫(kù)和API函數(shù),在使用函數(shù)的時(shí)候直接使用CALL指令調(diào)用函數(shù)。動(dòng)態(tài)調(diào)用則是在程序運(yùn)行的過(guò)程中再裝入動(dòng)態(tài)鏈接庫(kù)文件和執(zhí)行函數(shù),然后調(diào)用該API函數(shù)的方法。
2.2.1 靜態(tài)調(diào)用
高級(jí)語(yǔ)言編寫的代碼通常采用靜態(tài)調(diào)用API函數(shù)的方式,即使用call指令調(diào)用相應(yīng)的API函數(shù)。調(diào)用過(guò)程又分為直接調(diào)用和間接調(diào)用兩種情況,直接使用call指令調(diào)用引入表中相應(yīng)的地址或先將引入表中的地址轉(zhuǎn)存到一個(gè)寄存器中然后通過(guò)寄存器調(diào)用API函數(shù)。
2.2.2 動(dòng)態(tài)調(diào)用
動(dòng)態(tài)鏈接機(jī)制使得程序可以在運(yùn)行時(shí)鏈接函數(shù)庫(kù),函數(shù)庫(kù)存在于自身的可執(zhí)行文件里而不是像靜態(tài)鏈接那樣被拷貝到程序可執(zhí)行文件里。這些動(dòng)態(tài)函數(shù)庫(kù)(DLL)只在被加載和執(zhí)行階段才鏈接到程序里而不是在鏈接階段。動(dòng)態(tài)調(diào)用實(shí)現(xiàn)模式如下:
3 方法描述
3.1 結(jié)構(gòu)框架
系統(tǒng)主體由反匯編工具、規(guī)則庫(kù)、函數(shù)識(shí)別、匹配判定器四部分構(gòu)成,規(guī)則庫(kù)和待測(cè)程序是系統(tǒng)的輸入部分。規(guī)則庫(kù)是整個(gè)分析過(guò)程的基礎(chǔ),是描述代碼功能的特征庫(kù),其中的每一個(gè)特征項(xiàng)都是可識(shí)別函數(shù)的函數(shù)序列。規(guī)則庫(kù)規(guī)定了代碼分析系統(tǒng)的分析范圍和功能模型,為了提高分析的準(zhǔn)確性及擴(kuò)展分析系統(tǒng)的功能,用戶可以自定義規(guī)則庫(kù)中的特定函數(shù)序列。
待測(cè)程序即為分析對(duì)象,它具有多種表現(xiàn)形態(tài),而本文介紹的只是一種方法,可以適用于所有的代碼分析。具體實(shí)現(xiàn)時(shí)可以根據(jù)實(shí)際情況選擇合適的輔助工具,例如若選擇dcc工具則可以分析Dos下的EXE文件和COM文件。當(dāng)選擇IDA Pro工具可以分析Windows的PE文件,包括DLL文件和EXE文件。由于IDA Pro的跨平臺(tái)性,我們只需對(duì)系統(tǒng)稍作調(diào)整便可以分析Linux系統(tǒng)的可執(zhí)行程序。目標(biāo)程序經(jīng)過(guò)反匯編工具解析成匯編代碼并提取出可識(shí)別函數(shù)之后,構(gòu)造相應(yīng)的函數(shù)調(diào)用圖,最后根據(jù)規(guī)則庫(kù)中的函數(shù)序列與目標(biāo)程序的函數(shù)序列進(jìn)行匹配驗(yàn)證以得出分析報(bào)告進(jìn)行響應(yīng)。
3.2 函數(shù)識(shí)別
本文論述的方法是基于目標(biāo)程序的可識(shí)別函數(shù)序列基礎(chǔ)之上的靜態(tài)驗(yàn)證,將代碼的執(zhí)行體看作是一個(gè)程序流程圖,可識(shí)別函數(shù)是圖的節(jié)點(diǎn),通過(guò)分析判定函數(shù)調(diào)用過(guò)程獲得程序的功能、意圖等信息從而達(dá)到檢測(cè)防護(hù)目的。
分析系統(tǒng)中庫(kù)函數(shù)的識(shí)別流程如圖3所示,編譯器的確定是整個(gè)識(shí)別過(guò)程的前提,動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)分別采用不同的技術(shù)進(jìn)行分析匹配。偽函數(shù)結(jié)構(gòu)就是把匯編代碼中出現(xiàn)的函數(shù)模塊識(shí)別出來(lái),根據(jù)匯編代碼的特征函數(shù)模塊最終都是以“CALL 地址 A”的形式出現(xiàn)在地址A開(kāi)始地址處,所以識(shí)別函數(shù)模塊即把“CALL 地址 A”中地址A開(kāi)始的模塊識(shí)別出來(lái)。又由于匯編代碼形式的函數(shù)最后都是以“ret n ”的形式返回的,所以可以構(gòu)造算法將匯編代碼中的所有CALL指令中出現(xiàn)的函數(shù)模塊識(shí)別出來(lái)。
3.3 函數(shù)調(diào)用圖
函數(shù)調(diào)用關(guān)系圖以直觀的圖形方式描述一個(gè)應(yīng)用程序中各個(gè)函數(shù)的調(diào)用和被調(diào)用關(guān)系,它是有向圖,而且通常屬于無(wú)環(huán)圖(當(dāng)代碼中沒(méi)有直接或間接的遞歸)。正規(guī)定義如下:
P={p1,p2,…..}是一個(gè)程序的有窮子程序集,定義函數(shù)調(diào)用圖C是一個(gè)三元組(N,E,h),N表示子程序集合,N中的每個(gè)ni代表程序中的一個(gè)子程序,E是邊的集合,(ni,nj)∈E表示子程序pi與pj之間的調(diào)用與被調(diào)用關(guān)系,其中每條邊都是有向邊,h表示主程序。
4 結(jié)束語(yǔ)
基于可識(shí)別函數(shù)序列的代碼分析方法是一種非常有應(yīng)用前景的網(wǎng)絡(luò)安全技術(shù),它根據(jù)程序利用的一系列函數(shù)從語(yǔ)義上分析目標(biāo)程序的意圖和功能。由于這種方法檢測(cè)的是一般的可疑邏輯而不是特定的程序特征,因此從理論上說(shuō)是可以非??煽康仡A(yù)防惡意行為尤其是未知惡意行為的攻擊。本文在研究和應(yīng)用開(kāi)發(fā)實(shí)踐的基礎(chǔ)上提出了一種可行的主動(dòng)防御系統(tǒng)實(shí)現(xiàn)方案,給出整體結(jié)構(gòu)框架,并詳細(xì)了描述各功能模塊的工作原理。
參考文獻(xiàn):
[1]虞震.免疫聯(lián)想記憶及其在計(jì)算機(jī)病毒檢測(cè)中的應(yīng)用研究[D].中國(guó)科學(xué)技術(shù)大學(xué),2004.
[2]文偉平.惡意代碼機(jī)理與防范技術(shù)研究[D].中國(guó)科學(xué)院研究生院,2004.
[3]陳月玲,賈小珠.基于程序行為的計(jì)算機(jī)病毒檢測(cè)方法[J].青島大學(xué)學(xué)報(bào),2006.
[4]賴英旭,李征.未知病毒檢測(cè)技術(shù)的研究[J].計(jì)算機(jī)科學(xué),2006.
作者簡(jiǎn)介:馬文巖(1979.07-),男,河北涿州人,工程師,學(xué)士學(xué)位,研究方向:網(wǎng)絡(luò)安全。
作者單位:電子工程學(xué)院,北京 102488