本發(fā)明屬于計(jì)算機(jī)技術(shù)領(lǐng)域,更進(jìn)一步涉及軟件安全技術(shù)領(lǐng)域中的一種基于二進(jìn)制代碼植入的軟件運(yùn)行時(shí)監(jiān)控方法。本發(fā)明用于windows環(huán)境下的PE格式文件或linux環(huán)境下的ELF格式文件,使用靜態(tài)二進(jìn)制代碼植入技術(shù),對軟件的運(yùn)行軌跡進(jìn)行有效的監(jiān)控。
背景技術(shù):
隨著計(jì)算機(jī)技術(shù)的發(fā)展,計(jì)算機(jī)軟件已經(jīng)滲透到國民經(jīng)濟(jì)的各個(gè)領(lǐng)域,一些關(guān)鍵軟件一旦遭到破壞,會(huì)對用戶造成經(jīng)濟(jì)和安全上的威脅,因此軟件的安全性問題越來越凸顯其重要性。針對特定軟件的安全漏洞,運(yùn)行惡意代碼能夠獲得訪問非法數(shù)據(jù)的權(quán)限。典型的安全漏洞包括緩沖區(qū)溢出漏洞。
軟件運(yùn)行時(shí)監(jiān)控方法是一種在軟件實(shí)際運(yùn)行階段,通過獲得軟件的運(yùn)行狀態(tài)信息和軌跡,并與事先分析出的預(yù)期運(yùn)行軌跡進(jìn)行比較,判斷軟件運(yùn)行時(shí)安全性的一種技術(shù)。
通??衫渺o態(tài)分析工具提取軟件的控制流信息,比如函數(shù)調(diào)用圖、控制流圖等。根據(jù)擬分析目標(biāo)代碼的類型,軟件靜態(tài)分析可分為基于源代碼的分析和基于二進(jìn)制碼的分析。針對源代碼分析直接對源代碼程序表達(dá)式及數(shù)據(jù)結(jié)構(gòu)進(jìn)行分析;二進(jìn)制分析在機(jī)器代碼級(jí)上進(jìn)行,分析可執(zhí)行代碼的中間表達(dá)式。基于源代碼的分析只能分析出源代碼文件所包含的控制流信息,無法分析出該軟件所依賴的靜態(tài)庫和動(dòng)態(tài)庫文件包含的控制流信息。基于二進(jìn)制碼的分析,不僅可以分析出軟件可執(zhí)行文件內(nèi)的控制流信息,還可以分析出該軟件所依賴的動(dòng)態(tài)庫文件包含的一些控制流信息。
軟件運(yùn)行時(shí)的軌跡可通過代碼植入技術(shù)獲取。代碼植入技術(shù)分為基于源代碼的代碼植入和基于二進(jìn)制的植入。其中,基于二進(jìn)制的植入技術(shù)又分為動(dòng)態(tài)植入和靜態(tài)植入。與動(dòng)態(tài)植入相比,靜態(tài)植入在程序執(zhí)行前完成,因而靜態(tài)植入產(chǎn)生的運(yùn)行時(shí)開銷較小,同時(shí)靜態(tài)植入實(shí)現(xiàn)較為簡單。
北京航空航天大學(xué)在其申請的專利“基于函數(shù)調(diào)用圖的并行化安全漏洞檢測方法”(專利申請?zhí)枺?01110417105.3,申請公布號(hào):102567200A)中公開了一種漏洞檢測方法。該方法使用了基于源代碼的分析方法,生成了源代碼文件對應(yīng)模塊內(nèi)的函數(shù)調(diào)用圖,只對源代碼文件存在的安全漏洞進(jìn)行檢測。該方法的不足之處是,無法分析源代碼所依賴的靜態(tài)庫和動(dòng)態(tài)庫文件對應(yīng)模塊內(nèi)的函數(shù)調(diào)用關(guān)系和函數(shù)內(nèi)的控制流信息,無法對源代碼文件依賴的靜態(tài)庫和動(dòng)態(tài)庫存在的安全漏洞進(jìn)行檢測。
常州云博軟件工程技術(shù)有限公司在其申請的專利“一種軟件探測器的軟件探測方法”(專利申請?zhí)枺?01210054220.3,申請公布號(hào):102646068A)中公開了一種對應(yīng)用軟件運(yùn)行時(shí)程序流程信息進(jìn)行實(shí)時(shí)探測的方法。該方法利用了基于源代碼的代碼植入技術(shù),可以對計(jì)算機(jī)系統(tǒng)內(nèi)的運(yùn)行時(shí)軟件進(jìn)行實(shí)時(shí)監(jiān)控。該方法的不足之處是,新植入的代碼要編譯后才能執(zhí)行,無法避免較大運(yùn)行時(shí)開銷。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于克服上述已有技術(shù)的不足,提出一種基于二進(jìn)制代碼植入的軟件運(yùn)行時(shí)監(jiān)控方法。
為實(shí)現(xiàn)上述目的,本發(fā)明的思路是,利用靜態(tài)二進(jìn)制分析工具分析出被監(jiān)控軟件內(nèi)函數(shù)之間的調(diào)用關(guān)系和函數(shù)內(nèi)部的控制流信息,并生成函數(shù)調(diào)用圖G(E,F)和控制流圖G(B,E),然后利用函數(shù)調(diào)用圖G(E,F)構(gòu)造一個(gè)有限狀態(tài)機(jī)FSM(Z,S,T,S0,A),用控制流圖G(B,E)初始化表格TABbb。狀態(tài)機(jī)中每一個(gè)狀態(tài)分別對應(yīng)函數(shù)調(diào)用圖G(E,F)中的每個(gè)函數(shù),同時(shí)狀態(tài)機(jī)中加入一個(gè)無效狀態(tài)。狀態(tài)機(jī)中任意兩個(gè)有效狀態(tài)之間的遷移關(guān)系代表對應(yīng)函數(shù)之間的有效函數(shù)調(diào)用或函數(shù)返回關(guān)系,任何非法的函數(shù)調(diào)用或返回均導(dǎo)致有限狀態(tài)機(jī)遷移到無效狀態(tài)。表格TABbb包含的行數(shù)與對應(yīng)函數(shù)內(nèi)基本塊數(shù)量相同,每行包含三個(gè)字段:(1)分別代表一個(gè)基本塊的索引,(2)基本塊入口地址相對基本塊所在函數(shù)的入口地址的相對偏移量,(3)基本塊后繼塊的索引。利用靜態(tài)二進(jìn)制代碼植入工具將包含監(jiān)控代碼的依賴庫加載到被監(jiān)控軟件的進(jìn)程地址空間中,并在被監(jiān)控軟件的特定位置植入對監(jiān)控函數(shù)的調(diào)用語句。當(dāng)被監(jiān)控軟件運(yùn)行過程中發(fā)生函數(shù)調(diào)用、函數(shù)返回或函數(shù)內(nèi)控制流變化時(shí),會(huì)調(diào)用依賴庫中的監(jiān)控函數(shù),監(jiān)控函數(shù)通過查有限狀態(tài)機(jī)和TABbb來判斷被監(jiān)控軟件運(yùn)行是否與事先分析預(yù)測的運(yùn)行軌跡一致。
實(shí)現(xiàn)本發(fā)明目的的具體步驟如下:
(1)提取函數(shù)調(diào)用關(guān)系:
利用靜態(tài)二進(jìn)制分析工具,提取被監(jiān)控軟件可執(zhí)行文件及其依賴庫文件中的函數(shù)調(diào)用關(guān)系,并將函數(shù)調(diào)用關(guān)系存儲(chǔ)到函數(shù)調(diào)用圖G(E,F)數(shù)據(jù)結(jié)構(gòu)中,其中,E表示有向邊的集合,F(xiàn)表示函數(shù)調(diào)用圖G(E,F)內(nèi)所有函數(shù)的集合;
(2)提取函數(shù)內(nèi)部控制流信息:
利用靜態(tài)二進(jìn)制分析工具,提取函數(shù)調(diào)用圖G(E,F)中每個(gè)函數(shù)的基本塊及控制流信息,并將基于基本塊的控制流信息存儲(chǔ)到控制流圖G(B,E)數(shù)據(jù)結(jié)構(gòu)中,其中,E表示有向邊的集合,B表示控制流圖G(B,E)中基本塊的集合;
(3)構(gòu)造一個(gè)有限狀態(tài)機(jī):
(3a)將狀態(tài)0添加到有限狀態(tài)機(jī)的狀態(tài)的非空有限集合S中;
(3b)對函數(shù)調(diào)用圖G(E,F)中的每個(gè)函數(shù)進(jìn)行編號(hào),其中,第i個(gè)函數(shù)編號(hào)為i;
(3c)將函數(shù)調(diào)用圖G(E,F)中的main(·)函數(shù)對應(yīng)的狀態(tài)1賦給有限狀態(tài)機(jī)的初始狀態(tài)S0;
(3d)對滿足fi∈F的函數(shù)fi,將狀態(tài)i-分別添加到有限狀態(tài)機(jī)的狀態(tài)集合S和有限狀態(tài)機(jī)的最終狀態(tài)集合A中;
(3e)對fi∈F、fj∈F的fi和fj,如果存在從函數(shù)fi指向函數(shù)fj的一條有向邊,則將以下狀態(tài)遷移添加到狀態(tài)遷移函數(shù)T中:
Z0=0,Z1=j(luò)→Nextstate[i]=狀態(tài)j
Z0=1,Z1=i→Nextstate[j]=狀態(tài)i
其中,Z0和Z1表示有限狀態(tài)機(jī)的輸入字母,Nextstate[i]表示狀態(tài)i的下一個(gè)狀態(tài),Nextstate[j]表示狀態(tài)j的下一個(gè)狀態(tài),i和j分別是函數(shù)fi和函數(shù)fj的編號(hào);
(3f)對于所有的下一狀態(tài)為空的狀態(tài),將其下一狀態(tài)設(shè)置為狀態(tài)0;
(4)初始化表格TABbb:
將函數(shù)調(diào)用圖G(E,F)中的每個(gè)函數(shù)對應(yīng)一個(gè)控制流圖G(B,E),將函數(shù)調(diào)用圖G(E,F)中的每個(gè)函數(shù)對應(yīng)一個(gè)初始化的表格TABbb,其中,初始化表格TABbb中的第i行對應(yīng)控制流圖G(B,E)中第i個(gè)基本塊;每行包含三個(gè)字段index、offset、sucs,字段index表示第i個(gè)基本塊的索引,字段offset表示第i個(gè)基本塊的入口地址相對于第i個(gè)基本塊所在函數(shù)入口地址的相對偏移量,字段sucs表示第i個(gè)基本塊的后繼基本塊的索引;
(5)初始化表格TABstart和TABret:
(5a)當(dāng)被監(jiān)控軟件加載后,獲取函數(shù)調(diào)用圖G(E,F)中所有函數(shù)的入口地址;
(5b)將第i個(gè)函數(shù)的相關(guān)信息添加到表格TABstart的第i行中;其中,表格TABstart中的第i行對應(yīng)函數(shù)調(diào)用圖G(E,F)中的第i個(gè)函數(shù),每行包含三個(gè)字段addr、index、ptr,字段addr表示第i個(gè)函數(shù)的入口地址,字段index表示第i個(gè)函數(shù)的函數(shù)編號(hào),字段ptr表示第i個(gè)函數(shù)對應(yīng)表格TABbb的指針;
(5c)將值0、-1、-1添加到表格TABret的第一行中,表格TABret中的每行對應(yīng)被監(jiān)控軟件執(zhí)行過程中,數(shù)調(diào)用圖G(E,F)中被調(diào)用的的函數(shù);
(6)初始化整型變量Cur_F和Cur_B:
將函數(shù)調(diào)用圖G(E,F)中main(·)函數(shù)的編號(hào)1賦給整型變量Cur_F,將該main(·)函數(shù)中第一個(gè)基本塊的編號(hào)1賦給整型變量Cur_B;
(7)植入代碼:
(7a)利用二進(jìn)制代碼的靜態(tài)植入工具,將包含監(jiān)控代碼的動(dòng)態(tài)庫加載到被監(jiān)控軟件的進(jìn)程地址空間中;
(7b)根據(jù)函數(shù)名查找動(dòng)態(tài)庫中的監(jiān)控函數(shù),并構(gòu)造對監(jiān)控函數(shù)的調(diào)用語句;
(7c)利用代碼植入工具,根據(jù)函數(shù)調(diào)用圖G(E,F)和控制流圖G(B,E)中的信息,分析被監(jiān)控軟件中的代碼植入點(diǎn);
(7d)將構(gòu)造的調(diào)用語句植入到對應(yīng)的代碼植入點(diǎn);
(8)監(jiān)控軟件運(yùn)行狀態(tài):
(8a)判斷被監(jiān)控軟件是否執(zhí)行到函數(shù)調(diào)用圖G(E,F)中某個(gè)函數(shù)的入口位置,若是,則執(zhí)行步驟(8b),否則,執(zhí)行步驟(8f);
(8b)根據(jù)函數(shù)入口地址查表格TABstart,判斷函數(shù)入口地址是否在表格TABstart中,若是,則將對應(yīng)的函數(shù)編號(hào)和正整數(shù)0傳給有限狀態(tài)機(jī),執(zhí)行步驟(8c),否則,執(zhí)行步驟(9);
(8c)判斷有限狀態(tài)機(jī)接收的函數(shù)編號(hào)是否為1,若是,則執(zhí)行步驟(8d),否則,執(zhí)行步驟(8e);
(8d)將有限狀態(tài)機(jī)的當(dāng)前狀態(tài)設(shè)置為初始狀態(tài)S0,執(zhí)行步驟(8a);
(8e)判斷有限狀態(tài)機(jī)能否從當(dāng)前狀態(tài)遷移到接收編號(hào)對應(yīng)的狀態(tài),若是,則有限狀態(tài)機(jī)遷移到接收編號(hào)對應(yīng)的狀態(tài),并將步驟(8b)中所獲得的函數(shù)編號(hào)值賦給Cur_F,執(zhí)行步驟(8a),否則,有限狀態(tài)機(jī)遷移到無效狀態(tài)0,執(zhí)行步驟(9);
(8f)判斷被監(jiān)控軟件是否執(zhí)行到函數(shù)調(diào)用圖G(E,F)中函數(shù)內(nèi)call指令位置,若是,則執(zhí)行步驟(8g),否則,執(zhí)行步驟(8h);
(8g)將函數(shù)調(diào)用call指令后的下一條指令的地址添加到TABret中;將函數(shù)調(diào)用call指令所在函數(shù)的編號(hào)、所在基本塊的索引添加到TABret中,執(zhí)行步驟(8a);
(8h)判斷被監(jiān)控軟件是否執(zhí)行到函數(shù)調(diào)用圖G(E,F)中函數(shù)的出口點(diǎn),若是,則執(zhí)行步驟(8i),否則,執(zhí)行步驟(8l);
(8i)判斷表格TABret中最后一行中存儲(chǔ)的地址值是否為0,如是,則執(zhí)行步驟(9),否則,執(zhí)行步驟(8j);
(8j)判斷函數(shù)返回指令ret中返回地址值是否與表格TABret中最后一行中存儲(chǔ)的地址值一致,若是,則執(zhí)行步驟(8k),否則,執(zhí)行步驟(9);
(8k)將表格TABret最后一行對應(yīng)函數(shù)的編號(hào)和正整數(shù)1傳給有限狀態(tài)機(jī),判斷有限狀態(tài)機(jī)能否從當(dāng)前狀態(tài)遷移到接收編號(hào)對應(yīng)的狀態(tài),若是,則有限狀態(tài)機(jī)遷移到接收編號(hào)對應(yīng)的狀態(tài),并將表格TABret最后一行對應(yīng)函數(shù)的編號(hào)賦給整型變量Cur_F,表格TABret中最后一行中存儲(chǔ)的基本塊索引值賦給整型變量Cur_B,刪除表格TABret中的最后一條記錄,執(zhí)行步驟(8a),否則,有限狀態(tài)機(jī)遷移到無效狀態(tài)0,執(zhí)行步驟(9);
(8l)當(dāng)被監(jiān)控軟件執(zhí)行到控制流圖G(B,E)中基本塊的入口位置,計(jì)算該基本塊入口點(diǎn)相對于包含該基本塊的函數(shù)的入口點(diǎn)的相對偏移量;
(8m)判斷計(jì)算出來的偏移量是否為0,若是,則執(zhí)行步驟(8n),否則,執(zhí)行步驟(8o);
(8n)將正整數(shù)1賦給變量Cur_B,執(zhí)行步驟(8a);
(8o)判斷該偏量是否是Cur_B對應(yīng)基本塊的后繼塊中一個(gè)的偏移量,若是,則將該后繼塊的編號(hào)賦給整型變量Cur_B,執(zhí)行步驟(8a),否則執(zhí)行步驟(9);
(9)結(jié)束監(jiān)控。
本發(fā)明與現(xiàn)有技術(shù)相比具有以下優(yōu)點(diǎn):
第一,由于本發(fā)明采用了靜態(tài)二進(jìn)制分析工具,提取被監(jiān)控軟件文件及其依賴庫文件中的函數(shù)調(diào)用關(guān)系,并將函數(shù)調(diào)用關(guān)系存儲(chǔ)到函數(shù)調(diào)用圖G(E,F)數(shù)據(jù)結(jié)構(gòu)中,提取函數(shù)調(diào)用圖G(E,F)中每個(gè)函數(shù)的基于基本塊的控制流信息,不僅可以監(jiān)控軟件可執(zhí)行文件對應(yīng)的控制流,還可以監(jiān)控軟件所依賴動(dòng)態(tài)庫文件對應(yīng)的控制流。從而克服了現(xiàn)有技術(shù)只能對軟件源代碼文件對應(yīng)控制流進(jìn)行監(jiān)控的不足,使得本發(fā)明的監(jiān)控方法具有更全面的優(yōu)點(diǎn)。
第二,由于本發(fā)明利用二進(jìn)制的靜態(tài)代碼植入工具,將包含監(jiān)控代碼的動(dòng)態(tài)庫加載到被監(jiān)控軟件的進(jìn)程地址空間里,只對軟件代碼進(jìn)行靜態(tài)分析,找出代碼植入點(diǎn),而且靜態(tài)植入過程在軟件執(zhí)行之前就已完成,從而克服了現(xiàn)有技術(shù)產(chǎn)生較高運(yùn)行時(shí)開銷的不足,使得本發(fā)明具有運(yùn)行時(shí)開銷低,實(shí)現(xiàn)較為簡單的特點(diǎn)。
具體實(shí)施方式
附圖說明
圖1為本發(fā)明的整體流程圖;
圖2為本發(fā)明監(jiān)控軟件運(yùn)行狀態(tài)步驟的流程圖。
具體實(shí)施方式
下面結(jié)合附圖對本發(fā)明做進(jìn)一步的描述。
參照附圖1,對本發(fā)明的具體步驟做進(jìn)一步的描述。
步驟1,提取函數(shù)調(diào)用關(guān)系。
利用靜態(tài)二進(jìn)制分析工具,提取被監(jiān)控軟件可執(zhí)行文件及其依賴庫文件中的函數(shù)調(diào)用關(guān)系,并將函數(shù)調(diào)用關(guān)系存儲(chǔ)到函數(shù)調(diào)用圖G(E,F)數(shù)據(jù)結(jié)構(gòu)中,其中,E表示有向邊的集合,F(xiàn)表示函數(shù)調(diào)用圖G(E,F)內(nèi)所有函數(shù)的集合。
步驟2,提取函數(shù)內(nèi)部控制流信息。
利用靜態(tài)二進(jìn)制分析工具,提取函數(shù)調(diào)用圖G(E,F)中每個(gè)函數(shù)的基本塊及控制流信息,并將基于基本塊的控制流信息存儲(chǔ)到控制流圖G(B,E)數(shù)據(jù)結(jié)構(gòu)中,其中,E表示有向邊的集合,B表示控制流圖G(B,E)中基本塊的集合。
步驟3,構(gòu)造一個(gè)有限狀態(tài)機(jī)。
將狀態(tài)0添加到有限狀態(tài)機(jī)的狀態(tài)的非空有限集合S中。
對函數(shù)調(diào)用圖G(E,F)中的每個(gè)函數(shù)進(jìn)行編號(hào),其中,第i個(gè)函數(shù)編號(hào)為i。
將函數(shù)調(diào)用圖G(E,F)中的main(·)函數(shù)對應(yīng)的狀態(tài)1賦給有限狀態(tài)機(jī)的初始狀態(tài)S0。
對滿足fi∈F的函數(shù)fi,將狀態(tài)i-分別添加到有限狀態(tài)機(jī)的狀態(tài)集合S和有限狀態(tài)機(jī)的最終狀態(tài)集合A中。
對fi∈F、fj∈F的fi和fj,如果存在從函數(shù)fi指向函數(shù)fj的一條有向邊,則將以下狀態(tài)遷移添加到狀態(tài)遷移函數(shù)T中:
Z0=0,Z1=j(luò)→Nextstate[i]=狀態(tài)j
Z0=1,Z1=i→Nextstate[j]=狀態(tài)i
其中,Z0和Z1表示有限狀態(tài)機(jī)的輸入字母,Nextstate[i]表示狀態(tài)i的下一個(gè)狀態(tài),Nextstate[j]表示狀態(tài)j的下一個(gè)狀態(tài),i和j分別是函數(shù)fi和函數(shù)fj的編號(hào)。
對于所有的下一狀態(tài)為空的狀態(tài),將其下一狀態(tài)設(shè)置為狀態(tài)0。
對于包含N個(gè)函數(shù)的函數(shù)調(diào)用圖G(E,F),本算法將會(huì)構(gòu)造包含N+1個(gè)狀態(tài)的有限狀態(tài)機(jī)FSM(Z,S,T,S0,A),狀態(tài)0代表無效狀態(tài),其余N個(gè)狀態(tài)分別對應(yīng)函數(shù)調(diào)用圖G(E,F)中的N個(gè)函數(shù),任何兩個(gè)函數(shù)之間的有效函數(shù)調(diào)用或返回關(guān)系會(huì)映射到狀態(tài)機(jī)中對應(yīng)狀態(tài)之間的遷移關(guān)系,任何非法的函數(shù)調(diào)用或返回會(huì)導(dǎo)致有限狀態(tài)機(jī)遷移到無效狀態(tài);其中,Z表示狀態(tài)機(jī)的輸入字母表,S表示狀態(tài)機(jī)的狀態(tài)的非空有限集合,S0表示狀態(tài)機(jī)的初始狀態(tài),A表示狀態(tài)機(jī)的最終狀態(tài)的集合,T表示狀態(tài)機(jī)的狀態(tài)遷移關(guān)函數(shù):S×Z→S,狀態(tài)機(jī)的輸入字母表Z包含兩個(gè)字母Z0和Z1,Z0取0或1,Z1取1到N中的一個(gè)正整數(shù)。
步驟4,初始化表格TABbb。
將函數(shù)調(diào)用圖G(E,F)中的每個(gè)函數(shù)對應(yīng)一個(gè)控制流圖G(B,E),將函數(shù)調(diào)用圖G(E,F)中的每個(gè)函數(shù)對應(yīng)一個(gè)初始化的表格TABbb,其中,初始化表格TABbb中的第i行對應(yīng)控制流圖G(B,E)中第i個(gè)基本塊;每行包含三個(gè)字段index、offset、sucs,字段index表示第i個(gè)基本塊的索引,字段offset表示第i個(gè)基本塊的入口地址相對于第i個(gè)基本塊所在函數(shù)入口地址的相對偏移量,字段sucs表示第i個(gè)基本塊的后繼基本塊的索引。
步驟5,初始化表格TABstart和TABret。
當(dāng)被監(jiān)控軟件加載后,獲取函數(shù)調(diào)用圖G(E,F)中所有函數(shù)的入口地址。
將第i個(gè)函數(shù)的相關(guān)信息添加到表格TABstart的第i行中;其中,表格TABstart中的第i行對應(yīng)函數(shù)調(diào)用圖G(E,F)中的第i個(gè)函數(shù),每行包含三個(gè)字段addr、index、ptr,字段addr表示第i個(gè)函數(shù)的入口地址,字段index表示第i個(gè)函數(shù)的函數(shù)編號(hào),字段ptr表示第i個(gè)函數(shù)對應(yīng)表格TABbb的指針。
將值0、-1、-1添加到表格TABret的第一行中,表格TABret中的每行對應(yīng)被監(jiān)控軟件執(zhí)行過程中,數(shù)調(diào)用圖G(E,F)中被調(diào)用的的函數(shù)。
步驟6,初始化整型變量Cur_F和Cur_B。
將函數(shù)調(diào)用圖G(E,F)中main(·)函數(shù)的編號(hào)1賦給整型變量Cur_F,將該main(·)函數(shù)中第一個(gè)基本塊的編號(hào)1賦給整型變量Cur_B。
步驟7,植入代碼。
利用二進(jìn)制代碼的靜態(tài)植入工具,將包含監(jiān)控代碼的動(dòng)態(tài)庫加載到被監(jiān)控軟件的進(jìn)程地址空間中。
根據(jù)函數(shù)名查找動(dòng)態(tài)庫中的監(jiān)控函數(shù),并構(gòu)造對監(jiān)控函數(shù)的調(diào)用語句。
利用代碼植入工具,根據(jù)函數(shù)調(diào)用圖G(E,F)和控制流圖G(B,E)中的信息,分析被監(jiān)控軟件中的代碼植入點(diǎn)。
代碼植入點(diǎn)包括:函數(shù)調(diào)用圖G(E,F)中函數(shù)的入口點(diǎn)BPatch_entry,函數(shù)出口點(diǎn)BPatch_exit,函數(shù)中包含靜態(tài)call指令點(diǎn)BPatch_subroutine以及控制流圖G(B,E)中基本塊的入口點(diǎn)BPatch_locBasicBlockEntry。
將構(gòu)造的調(diào)用語句植入到對應(yīng)的代碼植入點(diǎn)。
在函數(shù)調(diào)用圖G(E,F)中函數(shù)的入口點(diǎn)BPatch_entry植入對函數(shù)調(diào)用關(guān)系合法性檢驗(yàn)函數(shù)的調(diào)用語句,該函數(shù)的功能是:根據(jù)函數(shù)入口地址查表格TABstart,若該地址在TABstart中則將對應(yīng)的函數(shù)編號(hào)傳給有限狀態(tài)機(jī)FSM,F(xiàn)SM來查是否存在從當(dāng)前狀態(tài)到接受編號(hào)對應(yīng)狀態(tài)的遷移關(guān)系,若有說明函數(shù)調(diào)用是合法。在函數(shù)調(diào)用圖G(E,F)中函數(shù)的入口點(diǎn)BPatch_exit點(diǎn)植入對函數(shù)返回關(guān)系合法性檢驗(yàn)函數(shù)的調(diào)用語句,該函數(shù)的功能是:根據(jù)ret指令中的函數(shù)返回地址查表格TABret,若表格TABret最后一行中所記錄的返回地址是0,說明被監(jiān)控軟件執(zhí)行到函數(shù)調(diào)用圖G(E,F)中main(·)函數(shù)的出口點(diǎn),結(jié)束執(zhí)行,否則,判斷表格TABret最后一行中所記錄的返回地址是否與ret指令中的返回地址相同,若是,則將最后一行對應(yīng)函數(shù)的編號(hào)傳給有限狀態(tài)機(jī)FSM,F(xiàn)SM來查是否存在從當(dāng)前狀態(tài)到接受編號(hào)對應(yīng)狀態(tài)的遷移關(guān)系,若存在說明函數(shù)返回是合法的,否則結(jié)束監(jiān)控。在函數(shù)調(diào)用圖G(E,F)中函數(shù)的call指令點(diǎn)BPatch_subroutine植入對返回信息存儲(chǔ)函數(shù)的調(diào)用語句,當(dāng)執(zhí)行完call指令后,該函數(shù)會(huì)將call指令下一條指令的地址、包含此call指令的函數(shù)編號(hào)、變量Cur_F和Cur_B存儲(chǔ)到表格TABret的最后一行中。在控制流圖G(B,E)中基本塊的入口點(diǎn)BPatch_locBasicBlockEntry植入對函數(shù)內(nèi)部控制流合法性檢驗(yàn)函數(shù)的調(diào)用語句,該函數(shù)的功能是根據(jù)基本塊的入口地址和基本塊所在函數(shù)的入口地址計(jì)算基本塊入口點(diǎn)對于函數(shù)入口點(diǎn)的相對偏移量,再根據(jù)變量Cur_F和Cur_B來查基本塊所在函數(shù)對應(yīng)的表格TABbb,若該偏移量是Cur_B對應(yīng)基本塊的后繼塊中某一個(gè)的相對偏移量,則說明控制流改變是合法的,更新Cur_B的值,否則,監(jiān)控結(jié)束。
參照附圖2,對本發(fā)明監(jiān)控軟件運(yùn)行狀態(tài)步驟的流程做進(jìn)一步的描述。
步驟8,監(jiān)控軟件運(yùn)行狀態(tài)。
(8a)判斷被監(jiān)控軟件是否執(zhí)行到函數(shù)調(diào)用圖G(E,F)中某個(gè)函數(shù)的入口位置,若是,則執(zhí)行步驟(8b),否則,執(zhí)行步驟(8f)。
(8b)根據(jù)函數(shù)入口地址查表格TABstart,判斷函數(shù)入口地址是否在表格TABstart中,若是,則將對應(yīng)的函數(shù)編號(hào)和正整數(shù)0傳給有限狀態(tài)機(jī),執(zhí)行步驟(8c),否則,執(zhí)行步驟9。
(8c)判斷有限狀態(tài)機(jī)接收的函數(shù)編號(hào)是否為1,若是,則執(zhí)行步驟(8d),否則,執(zhí)行步驟(8e)。
(8d)將有限狀態(tài)機(jī)的當(dāng)前狀態(tài)設(shè)置為初始狀態(tài)S0,執(zhí)行步驟(8a)。
(8e)判斷有限狀態(tài)機(jī)能否從當(dāng)前狀態(tài)遷移到接收編號(hào)對應(yīng)的狀態(tài),若是,則有限狀態(tài)機(jī)遷移到接收編號(hào)對應(yīng)的狀態(tài),并將步驟(8b)中所獲得的函數(shù)編號(hào)值賦給Cur_F,執(zhí)行步驟(8a),否則,有限狀態(tài)機(jī)遷移到無效狀態(tài)0,執(zhí)行步驟9;
(8f)判斷被監(jiān)控軟件是否執(zhí)行到函數(shù)調(diào)用圖G(E,F)中函數(shù)內(nèi)call指令位置,若是,則執(zhí)行步驟(8g),否則,執(zhí)行步驟(8h)。
(8g)將函數(shù)調(diào)用call指令后的下一條指令的地址添加到TABret中;將函數(shù)調(diào)用call指令所在函數(shù)的編號(hào)、所在基本塊的索引添加到TABret中,執(zhí)行步驟(8a)。
(8h)判斷被監(jiān)控軟件是否執(zhí)行到函數(shù)調(diào)用圖G(E,F)中函數(shù)的出口點(diǎn),若是,則執(zhí)行步驟(8i),否則,執(zhí)行步驟(8l)。
(8i)判斷表格TABret中最后一行中存儲(chǔ)的地址值是否為0,如是,則執(zhí)行步驟9,否則,執(zhí)行步驟(8j)。
(8j)判斷函數(shù)返回指令ret中返回地址值是否與表格TABret中最后一行中存儲(chǔ)的地址值一致,若是,則執(zhí)行步驟(8k),否則,執(zhí)行步驟9。
(8k)將表格TABret最后一行對應(yīng)函數(shù)的編號(hào)和正整數(shù)1傳給有限狀態(tài)機(jī),判斷有限狀態(tài)機(jī)能否從當(dāng)前狀態(tài)遷移到接收編號(hào)對應(yīng)的狀態(tài),若是,則有限狀態(tài)機(jī)遷移到接收編號(hào)對應(yīng)的狀態(tài),并將表格TABret最后一行對應(yīng)函數(shù)的編號(hào)賦給整型變量Cur_F,表格TABret中最后一行中存儲(chǔ)的基本塊索引值賦給整型變量Cur_B,刪除表格TABret中的最后一條記錄,執(zhí)行步驟(8a),否則,有限狀態(tài)機(jī)遷移到無效狀態(tài)0,執(zhí)行步驟9。
(8l)當(dāng)被監(jiān)控軟件執(zhí)行到控制流圖G(B,E)中基本塊的入口位置,計(jì)算該基本塊入口點(diǎn)相對于包含該基本塊的函數(shù)的入口點(diǎn)的相對偏移量。
(8m)判斷計(jì)算出來的偏移量是否為0,若是,則執(zhí)行步驟(8n),否則,執(zhí)行步驟(8o)。
(8n)將正整數(shù)1賦給變量Cur_B,執(zhí)行步驟(8a)。
(8o)判斷該偏量是否是Cur_B對應(yīng)基本塊的后繼塊中一個(gè)的偏移量,若是,則將該后繼塊的編號(hào)賦給整型變量Cur_B,執(zhí)行步驟(8a),否則執(zhí)行步驟9。
步驟9,結(jié)束監(jiān)控。