1.一種基于二進(jìn)制代碼植入技術(shù)的軟件運(yùn)行時監(jiān)控方法,具體步驟如下:
(1)提取函數(shù)調(diào)用關(guān)系:
利用靜態(tài)二進(jìn)制分析工具,提取被監(jiān)控軟件可執(zhí)行文件及其依賴庫文件中的函數(shù)調(diào)用關(guān)系,并將函數(shù)調(diào)用關(guān)系存儲到函數(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)中每個函數(shù)的基本塊及控制流信息,并將基于基本塊的控制流信息存儲到控制流圖G(B,E)數(shù)據(jù)結(jié)構(gòu)中,其中,E表示有向邊的集合,B表示控制流圖G(B,E)中基本塊的集合;
(3)構(gòu)造一個有限狀態(tài)機(jī):
(3a)將狀態(tài)0添加到有限狀態(tài)機(jī)的狀態(tài)的非空有限集合S中;
(3b)對函數(shù)調(diào)用圖G(E,F)中的每個函數(shù)進(jìn)行編號,其中,第i個函數(shù)編號為i,記為fi;
(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的下一個狀態(tài),Nextstate[j]表示狀態(tài)j的下一個狀態(tài),i和j分別是函數(shù)fi和函數(shù)fj的編號;
(3f)對于所有的下一狀態(tài)為空的狀態(tài),將其下一狀態(tài)設(shè)置為狀態(tài)0;
(4)初始化表格TABbb:
將函數(shù)調(diào)用圖G(E,F)中的每個函數(shù)對應(yīng)一個控制流圖G(B,E),將函數(shù)調(diào)用圖G(E,F)中的每個函數(shù)對應(yīng)一個初始化的表格TABbb,其中,初始化表格TABbb中的第i行對應(yīng)控制流圖G(B,E)中第i個基本塊;每行包含三個字段index、offset、sucs,字段index表示第i個基本塊的索引,字段offset表示第i個基本塊的入口地址相對于第i個基本塊所在函數(shù)入口地址的相對偏移量,字段sucs表示第i個基本塊的后繼塊基本塊的索引;
(5)初始化表格TABstart和TABret:
(5a)當(dāng)被監(jiān)控軟件加載后,獲取函數(shù)調(diào)用圖G(E,F)中所有函數(shù)的入口地址;
(5b)將第i個函數(shù)的相關(guān)信息添加到表格TABstart的第i行中;其中,表格TABstart中的第i行對應(yīng)函數(shù)調(diào)用圖G(E,F)中的第i個函數(shù),每行包含三個字段addr、index、ptr,字段addr表示第i個函數(shù)的入口地址,字段index表示第i個函數(shù)的函數(shù)編號,字段ptr表示第i個函數(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ù)的編號1賦給整型變量Cur_F,將該main(·)函數(shù)中第一個基本塊的編號1賦給整型變量Cur_B;
(7)植入代碼:
(7a)利用二進(jìn)制代碼的靜態(tài)植入工具,將包含監(jiān)控代碼的動態(tài)庫加載到被監(jiān)控軟件的進(jìn)程地址空間中;
(7b)根據(jù)函數(shù)名查找動態(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)中某個函數(shù)的入口位置,若是,則執(zhí)行步驟(8b),否則,執(zhí)行步驟(8f);
(8b)根據(jù)函數(shù)入口地址查表格TABstart,判斷函數(shù)入口地址是否在表格TABstart中,若是,則將對應(yīng)的函數(shù)編號和正整數(shù)0傳給有限狀態(tài)機(jī),執(zhí)行步驟(8c),否則,執(zhí)行步驟(9);
(8c)判斷有限狀態(tài)機(jī)接收的函數(shù)編號是否為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)遷移到接收編號對應(yīng)的狀態(tài),若是,則有限狀態(tài)機(jī)遷移到接收編號對應(yīng)的狀態(tài),并將步驟(8b)中所獲得的函數(shù)編號值賦給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ù)的編號、所在基本塊的索引添加到TABret中,執(zhí)行步驟(8a);
(8h)判斷被監(jiān)控軟件是否執(zhí)行到函數(shù)調(diào)用圖G(E,F)中函數(shù)的出口點(diǎn),若是,則執(zhí)行步驟(8i),否則,執(zhí)行步驟(8l);
(8i)判斷表格TABret中最后一行中存儲的地址值是否為0,如是,則執(zhí)行步驟(9),否則,執(zhí)行步驟(8j);
(8j)判斷函數(shù)返回指令ret中返回地址值是否與表格TABret中最后一行中存儲的地址值一致,若是,則執(zhí)行步驟(8k),否則,執(zhí)行步驟(9);
(8k)將表格TABret最后一行對應(yīng)函數(shù)的編號和正整數(shù)1傳給有限狀態(tài)機(jī),判斷有限狀態(tài)機(jī)能否從當(dāng)前狀態(tài)遷移到接收編號對應(yīng)的狀態(tài),若是,則有限狀態(tài)機(jī)遷移到接收編號對應(yīng)的狀態(tài),并將表格TABret最后一行對應(yīng)函數(shù)的編號賦給整型變量Cur_F,表格TABret中最后一行中存儲的基本塊索引值賦給整型變量Cur_B,刪除表格TABret中的最后一條記錄,執(zhí)行步驟(8a),否則,有限狀態(tài)機(jī)遷移到無效狀態(tài)0,執(zhí)行步驟(9);
(8l)當(dāng)被監(jiān)控軟件執(zhí)行到控制流圖G(B,E)中基本塊的入口位置,計算該基本塊入口點(diǎn)相對于包含該基本塊的函數(shù)的入口點(diǎn)的相對偏移量;
(8m)判斷計算出來的偏移量是否為0,若是,則執(zhí)行步驟(8n),否則,執(zhí)行步驟(8o);
(8n)將正整數(shù)1賦給變量Cur_B,執(zhí)行步驟(8a);
(8o)判斷該偏量是否是Cur_B對應(yīng)基本塊的后繼塊中一個的偏移量,若是,則將該后繼塊的編號賦給整型變量Cur_B,執(zhí)行步驟(8a),否則執(zhí)行步驟(9);
(9)結(jié)束監(jiān)控。