一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法【專利摘要】一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法,由部署在服務(wù)器的監(jiān)控控制臺和客戶端的監(jiān)控探頭組成軟件關(guān)鍵行為監(jiān)控系統(tǒng)。監(jiān)控控制臺通過靜態(tài)分析提取被監(jiān)控軟件的行為節(jié)點信息,定義關(guān)鍵行為及行為提取特征信息,采用探頭注入的方式實現(xiàn)對目標(biāo)軟件的監(jiān)控。監(jiān)控探頭利用函數(shù)劫持技術(shù),并采用基于小內(nèi)存管理的堆空間代碼駐留技術(shù)和維持??臻g平衡的容器管理技術(shù),實現(xiàn)關(guān)鍵行為信息的有效提取。本發(fā)明可以針對單線程、多線程及包含復(fù)雜遞歸調(diào)用關(guān)系的軟件關(guān)鍵行為進行有效地跟蹤,具有較高的靈活性和適應(yīng)性,并且考慮了目標(biāo)及其它軟件的正常運行?!緦@f明】一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及信息安全領(lǐng)域,特別是涉及一種基于內(nèi)存管理模式化軟件關(guān)鍵行為跟蹤方法,實現(xiàn)軟件關(guān)鍵行為的靈活管理和有效提取,屬于計算機信息安全領(lǐng)域?!?br>背景技術(shù):
】[0002]隨著信息化建設(shè)不斷深入,軟件應(yīng)用已經(jīng)成為社會、軍事、企業(yè)等大系統(tǒng)中不可分割的重要組成部分。與此同時,由于軟件行為內(nèi)在的脆弱性和“黑盒”特性,軟件應(yīng)用的安全性與可靠性也已成為影響信息化運維的重要問題,亟需得到確認(rèn)與保障。[0003]軟件行為準(zhǔn)確地反映了軟件的運行軌跡,內(nèi)蘊地記錄了軟件的安全性與可靠性信息,對軟件行為進行跟蹤,監(jiān)控軟件的運行過程,發(fā)現(xiàn)軟件行為錯誤,對應(yīng)用軟件的運維至關(guān)重要;與此同時,通過對軟件行為的跟蹤,實時分析軟件容錯能力,確保在容錯范圍內(nèi)軟件應(yīng)用的有效運行,也是保證軟件安全與可靠性的重要組成部分。伴隨著軟件應(yīng)用與領(lǐng)域需求的融合度越來越高,用戶對關(guān)鍵業(yè)務(wù)領(lǐng)域軟件行為安全尤其是對軟件關(guān)鍵行為的保障需求也越來越高。從不同的層次和角度考慮,軟件關(guān)鍵行為的構(gòu)成會有所差異。軟件本身復(fù)雜度的不斷提升和關(guān)鍵行為差異性的客觀存在迫切需求一種能夠?qū)崿F(xiàn)軟件關(guān)鍵行為靈活管理、具有較高適用性和實現(xiàn)有效跟蹤的解決辦法。[0004]在當(dāng)前軟件行為跟蹤領(lǐng)域研究中,靜態(tài)分析軟件代碼和動態(tài)監(jiān)控軟件實例是提取軟件行為軌跡信息兩類主要的方法。基于靜態(tài)分析的軟件行為識別過程中,目標(biāo)軟件無需運行,識別方法以軟件可執(zhí)行程序為數(shù)據(jù)源,從中提取指令序列、控制流圖、函數(shù)調(diào)用序列等信息,這種方法費時長、靈活性差、對分析識別人員的專業(yè)水平要求高,而且隨著目標(biāo)軟件的升級往往需要重新進行識別從而造成維護成本的上升,同時缺乏軟件行為動態(tài)執(zhí)行后的結(jié)果數(shù)據(jù),因此行為對軟件運行安全的影響也就無法進行定量分析?;趧討B(tài)監(jiān)控軟件實例的軟件行為識別過程中,采用插件或探頭的方式,以動態(tài)運行的軟件為目標(biāo),從中提取函數(shù)調(diào)用序列、函數(shù)調(diào)用上下文信息、運行環(huán)境變化等信息,這種方法通常需要知道詳細(xì)的軟件行為節(jié)點信息以便定義大量的回調(diào)函數(shù)去獲取行為節(jié)點信息,這就意味著針對不同的目標(biāo)軟件需要進行二次開發(fā),即事前定制化開發(fā);同時,隨著目標(biāo)軟件的變化缺乏監(jiān)控過程中的及時調(diào)整,降低了靈活性,即事中的不可控。[0005]Hook技術(shù)是Windows平臺下實現(xiàn)動態(tài)提取軟件行為信息的主要技術(shù)。目前,IAT(ImportAddressTable)Hook和InlineHook是最主要的兩種方法。第一種方法利用Windows系統(tǒng)API(ApplicationProgrammingInterface,應(yīng)用程序編程接口)修改PE(PortableExecute,可移植執(zhí)行體)文件中IAT表地址,同時定義與原函數(shù)簽名信息相同的回調(diào)函數(shù),實現(xiàn)對目標(biāo)監(jiān)控節(jié)點的劫持和信息提取。其不足之處在于,面對大量監(jiān)控目標(biāo)函數(shù)時,原函數(shù)簽名信息的獲取在增加工作量的同時也對開發(fā)人員函數(shù)熟悉程度有著較高的要求,另外,大量回調(diào)函數(shù)的定義也增加了開發(fā)人員的工作量,并降低了管理的靈活度。第二種方法利用匯編語言,采取修改函數(shù)入口地址指令的方式實現(xiàn)向監(jiān)控函數(shù)的跳轉(zhuǎn),這種方法實現(xiàn)的監(jiān)控節(jié)點掛載針對當(dāng)前運行的所有進程有效,會影響到其它軟件的正常運行?!?br/>發(fā)明內(nèi)容】[0006]本發(fā)明的技術(shù)解決問題是:克服現(xiàn)有技術(shù)的不足,提供一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法,本方法實現(xiàn)對軟件關(guān)鍵行為節(jié)點的靈活控制;同時利用容器管理函數(shù)調(diào)用返回地址以維持棧幀的平衡,保障了軟件的正常運行,從而有效地跟蹤軟件關(guān)鍵行為的運行軌跡。[0007]一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法包括步驟如下:[0008](I)監(jiān)控控制臺首先加載監(jiān)控目標(biāo)軟件的PE文件,通過靜態(tài)映射的方式分析出PE文件的行為節(jié)點信息;所述行為節(jié)點信息是指PE文件所引用的操作系統(tǒng)及其它用戶自定義的API信息,行為節(jié)點信息存儲在PE文件的IAT導(dǎo)入地址表中;[0009](2)根據(jù)步驟(I)得到的行為節(jié)點信息,通過添加和移除行為節(jié)點組成監(jiān)控軟件關(guān)鍵行為并存入數(shù)據(jù)庫,并確定要提取的關(guān)鍵行為特征信息;所述關(guān)鍵行為特征信息包括參數(shù)、線程屬性、進程屬性、時間屬性、位置屬性;[0010](3)判斷是否首次監(jiān)控目標(biāo)軟件,若是則執(zhí)行步驟(6);若不是則被視為監(jiān)控運行中的調(diào)整,執(zhí)行步驟(4);[0011](4)判斷是否對新的行為節(jié)點進行監(jiān)控,若是則執(zhí)行步驟(7);若不是則[0012]執(zhí)行步驟(5);[0013](5)判斷是否結(jié)束已被監(jiān)控行為節(jié)點的監(jiān)控,若是則執(zhí)行步驟(12);若不是則被視為沒有進行任何操作,進入步驟(14);[0014](6)監(jiān)控控制臺根據(jù)輸入的監(jiān)控目標(biāo)軟件的進程號,采用遠(yuǎn)程注入的方式將監(jiān)控探頭加載到監(jiān)控目標(biāo)軟件進程空間當(dāng)中,并完成監(jiān)控探頭的初始化;所述監(jiān)控探頭的初始化包括建立與監(jiān)控控制臺的通信連接、數(shù)據(jù)庫連接及監(jiān)控探頭啟動參數(shù)配置;[0015](7)監(jiān)控探頭從數(shù)據(jù)庫中提取被監(jiān)控關(guān)鍵行為的行為節(jié)點信息,并由內(nèi)存管理器將行為節(jié)點信息進行數(shù)據(jù)格式轉(zhuǎn)化,形成內(nèi)存中可管理的持久化數(shù)據(jù);所述內(nèi)存管理器為監(jiān)控探頭的功能組成模塊,用于數(shù)據(jù)轉(zhuǎn)化、數(shù)據(jù)初始化及數(shù)據(jù)所占內(nèi)存的分配與釋放;[0016](8)內(nèi)存管理器創(chuàng)建包含控制指令的5字節(jié)內(nèi)存塊,并建立與被監(jiān)控行為節(jié)點的一對一映射關(guān)系;[0017](9)監(jiān)控探頭修改PE文件中的被監(jiān)控行為節(jié)點的IAT導(dǎo)入地址表為與其對應(yīng)的5字節(jié)內(nèi)存塊地址用于實現(xiàn)監(jiān)控行為節(jié)點的監(jiān)控;[0018](10)被監(jiān)控的行為節(jié)點被劫持,監(jiān)控目標(biāo)軟件通過跳轉(zhuǎn)執(zhí)行5字節(jié)小內(nèi)存塊中的控制指令進入跳轉(zhuǎn)控制函數(shù)進行處理;所述的跳轉(zhuǎn)控制函數(shù)處理包括以下步驟:[0019](a)定位被劫持的監(jiān)控行為節(jié)點并提取被劫持的行為節(jié)點的相關(guān)特征信息,同時將監(jiān)控目標(biāo)軟件執(zhí)行的API的返回地址進行修改用于保證API執(zhí)行完畢后返回繼續(xù)提取行為節(jié)點的相關(guān)特征信息,并將未修改的API的返回地址保存在監(jiān)控探頭的棧容器中;;[0020](b)采用CALL指令調(diào)用監(jiān)控目標(biāo)軟件執(zhí)行的API入口地址執(zhí)行API;所述監(jiān)控目標(biāo)軟件執(zhí)行的API入口地址存儲于內(nèi)存管理模塊中被監(jiān)控行為節(jié)點的數(shù)據(jù)結(jié)構(gòu)中;[0021](C)再次提取被劫持的監(jiān)控行為節(jié)點的相關(guān)特征信息,并將保存在棧容器中的未修改的API的返回地址彈出用于保證跳轉(zhuǎn)函數(shù)執(zhí)行完畢后能夠正確恢復(fù)到監(jiān)控目標(biāo)軟件執(zhí)行的邏輯軌道中;[0022](11)根據(jù)監(jiān)控控制臺的指令或者監(jiān)控目標(biāo)軟件是否自動終止,判斷是否結(jié)束監(jiān)控,若是則執(zhí)行步驟(12);若不是則返回執(zhí)行步驟(10);[0023](12)結(jié)束監(jiān)控目標(biāo)軟件的行為節(jié)點的監(jiān)控,并恢復(fù)PE文件中的IAT導(dǎo)入地址表;[0024](13)依據(jù)步驟(12)中結(jié)束監(jiān)控的行為節(jié)點信息,釋放其所占的內(nèi)存及與之映射的5字節(jié)內(nèi)存塊;[0025](14)結(jié)束。[0026]所述步驟(10)中的控制指令是指匯編語言中的CALL指令,該控制指令使得監(jiān)控目標(biāo)軟件行為節(jié)點在被劫持后進入跳轉(zhuǎn)函數(shù)中;所述步驟(9)中的5字節(jié)內(nèi)存塊中,其中CALL指令占一個字節(jié),其十六進制代碼為0xE8,后4字節(jié)為跳轉(zhuǎn)函數(shù)的偏移地址。[0027]所述步驟(10)中的被劫持行為節(jié)點定位的方法如下:[0028](a)執(zhí)行包含CALL指令的5字節(jié)內(nèi)存塊,其地址假設(shè)為addm,在調(diào)用執(zhí)行跳轉(zhuǎn)控制函數(shù)的同時,將返回地址adc^壓入當(dāng)前棧幀;所述地址add^addm+S;[0029](b)在跳轉(zhuǎn)控制函數(shù)中,利用匯編指令取出未修改的API的返回地址addr,計算出5字節(jié)內(nèi)存塊地址addm;[0030](c)依據(jù)內(nèi)存存儲的映射數(shù)據(jù)和步驟(b)得到的5字節(jié)內(nèi)存塊地址addm,查找對應(yīng)的監(jiān)控行為節(jié)點,若存在則返回監(jiān)控行為節(jié)點數(shù)據(jù)的地址;若不存在則返回NULL。[0031]所述步驟(10)中的棧容器管理未修改的API的返回地址方法如下:[0032](a)在跳轉(zhuǎn)控制函數(shù)中,提取未修改的API的返回地址add。;[0033](b)獲取當(dāng)前線程號,判斷監(jiān)控探頭是否存在該線程號對應(yīng)的棧容器,[0034]若不存在則執(zhí)行(C);若存在則執(zhí)行步驟(d);[0035](C)創(chuàng)建新的棧容器;[0036]Cd)將地址add。壓入棧容器;[0037](e)執(zhí)行API;[0038](f)獲取當(dāng)前線程號,在監(jiān)控探頭中定位對應(yīng)的棧容器并提取出地址add。;[0039](g)提取完畢后,判斷當(dāng)前棧容器是否為空,若為空則執(zhí)行步驟(h);若不為空則執(zhí)行步驟(i);[0040](h)銷毀當(dāng)前棧容器,并刪除監(jiān)控探頭中的棧容器紀(jì)錄;[0041](i)恢復(fù)API的返回地址,并進行堆棧平衡。[0042]本發(fā)明與現(xiàn)有技術(shù)相比的有益效果是:[0043](I)本發(fā)明針對軟件關(guān)鍵行為跟蹤的靈活性和適應(yīng)性問題,采用靜態(tài)分析和動態(tài)監(jiān)控實例相結(jié)合的方法,部署在服務(wù)器端的監(jiān)控控制臺通過對目標(biāo)軟件的PE文件得到其調(diào)用的系統(tǒng)API及其它外部API信息,目標(biāo)軟件的PE文件可為其可執(zhí)行文件EXE,也可為其引用的外部接口文件如DLL文件;針對提取的軟件行為節(jié)點信息,用戶可自定義監(jiān)控數(shù)量及被監(jiān)控節(jié)點所要提取的行為特征信息,這些數(shù)據(jù)信息通過探頭注入形成目標(biāo)監(jiān)控軟件內(nèi)存空間中的可管理數(shù)據(jù),并可在監(jiān)控過程中對監(jiān)控數(shù)據(jù)進行管理。這種目標(biāo)軟件節(jié)點自動化分析、掛載、監(jiān)控和管理的模式化流程,避免軟件升級和監(jiān)控目標(biāo)不同而帶來的二次開發(fā),提高了該跟蹤方法的適應(yīng)性;同時,監(jiān)控目標(biāo)行為的自定義及監(jiān)控的動態(tài)管理無疑增強了該跟蹤方法的靈活性。[0044](2)本發(fā)明通過采用全局唯一的跳轉(zhuǎn)監(jiān)控函數(shù),并在其內(nèi)部實現(xiàn)對原函數(shù)的調(diào)用執(zhí)行和行為軌跡信息的提取,實現(xiàn)了被監(jiān)控函數(shù)與跳轉(zhuǎn)監(jiān)控函數(shù)的多對一跳轉(zhuǎn)映射,從而避免了大量回調(diào)函數(shù)的定義,也為提高監(jiān)控的靈活性和適應(yīng)性創(chuàng)造了條件。[0045](3)本發(fā)明采用基于內(nèi)存管理的技術(shù),結(jié)合IATHook與InlineHook方式的各自優(yōu)點,通過兩者結(jié)合的方式實現(xiàn)對監(jiān)控目標(biāo)函數(shù)的掛載。監(jiān)控探頭在注入到目標(biāo)軟件進程空間后,創(chuàng)建與監(jiān)控目標(biāo)函數(shù)一對一對應(yīng)的可管理的5字節(jié)內(nèi)存塊,修改IAT表使其跳轉(zhuǎn)地址指向相應(yīng)的5字節(jié)內(nèi)存塊地址,同時包含控制指令的5字節(jié)內(nèi)存塊保證代碼在調(diào)用目標(biāo)監(jiān)控函數(shù)是能夠跳轉(zhuǎn)到監(jiān)控處理函數(shù)中。這種方式解決了多對一跳轉(zhuǎn)監(jiān)控中的監(jiān)控目標(biāo)函數(shù)定位問題,同時也避免了InlineHook方式中對其它軟件正常運行所產(chǎn)生的影響。[0046](4)本發(fā)明利用棧容器管理被劫持函數(shù)的正確返回地址,以維持跳轉(zhuǎn)監(jiān)控函數(shù)中的堆棧平衡和保證程序邏輯的正確執(zhí)行。棧容器通過在原函數(shù)調(diào)用執(zhí)行前從系統(tǒng)棧中取出并保存原返回地址,繼而在原函數(shù)執(zhí)行完畢并進行事后行為信息提取后,將返回地址恢復(fù)至系統(tǒng)棧中,這種方式既實現(xiàn)監(jiān)控節(jié)點信息的事前和事后信息的提取,又保障了軟件的正常運行。與此同時,由于線程在程序執(zhí)行時其函數(shù)調(diào)用是串行的,且線程號在進程中是唯一的,因此建立與線程號一對一映射的棧容器避免了多線程同時調(diào)用同一監(jiān)控目標(biāo)函數(shù)所形成的混亂?!緦@綀D】【附圖說明】[0047]圖1為本發(fā)明流程圖;[0048]圖2為本發(fā)明行為節(jié)點的監(jiān)控和執(zhí)行邏輯控制示意圖;[0049]圖3為本發(fā)明被劫持行為節(jié)點定位示意圖;[0050]圖4為本發(fā)明棧容器管理未修改的API的返回地址示意圖?!揪唧w實施方式】[0051]下面結(jié)附圖對本發(fā)明的【具體實施方式】進行進一步的詳細(xì)描述。[0052]如圖1所示,本發(fā)明中的一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法,具體實施步驟如下:[0053](I)監(jiān)控控制臺首先加載監(jiān)控目標(biāo)軟件的PE文件,通過靜態(tài)映射的方式分析出PE文件的行為節(jié)點信息;所述行為節(jié)點信息是指PE文件所引用的操作系統(tǒng)及其它用戶自定義的API信息,行為節(jié)點信息存儲在PE文件的IAT導(dǎo)入地址表中;[0054](2)根據(jù)步驟(I)得到的行為節(jié)點信息,通過添加和移除行為節(jié)點組成監(jiān)控軟件關(guān)鍵行為并存入數(shù)據(jù)庫,并確定要提取的關(guān)鍵行為特征信息;所述關(guān)鍵行為特征信息包括參數(shù)、線程屬性、進程屬性、時間屬性、位置屬性;[0055](3)判斷是否首次監(jiān)控目標(biāo)軟件,若是則執(zhí)行步驟(6);若不是則被視為監(jiān)控運行中的調(diào)整,執(zhí)行步驟(4);[0056](4)判斷是否對新的行為節(jié)點進行監(jiān)控,若是則執(zhí)行步驟(7);若不是則[0057]執(zhí)行步驟(5);[0058](5)判斷是否結(jié)束已被監(jiān)控行為節(jié)點的監(jiān)控,若是則執(zhí)行步驟(12);若不是則被視為沒有進行任何操作,進入步驟(14);[0059](6)監(jiān)控控制臺根據(jù)輸入的監(jiān)控目標(biāo)軟件的進程號,采用Windows遠(yuǎn)程注入的方式將監(jiān)控探頭加載到監(jiān)控目標(biāo)軟件進程空間當(dāng)中,并完成監(jiān)控探頭的初始化;所述監(jiān)控探頭的初始化包括建立與監(jiān)控控制臺的通信連接、數(shù)據(jù)庫連接及監(jiān)控探頭啟動參數(shù)配置;[0060]監(jiān)控探頭可以采用DLL文件形式實現(xiàn),當(dāng)一個DLL文件被映射到進程的地址空間時,系統(tǒng)調(diào)用該DLL的DllMain函數(shù),若傳遞給fdwReason參數(shù)為DLL_PROCESS_ATTACH則會自動執(zhí)行該條件下的代碼,且這種調(diào)用只會發(fā)生在第一次映射時;[0061](7)監(jiān)控探頭從數(shù)據(jù)庫中提取被監(jiān)控關(guān)鍵行為的行為節(jié)點信息,并由內(nèi)存管理器將行為節(jié)點信息進行數(shù)據(jù)格式轉(zhuǎn)化,形成內(nèi)存中可管理的持久化數(shù)據(jù);所述內(nèi)存管理器為監(jiān)控探頭的功能組成模塊,用于數(shù)據(jù)轉(zhuǎn)化、數(shù)據(jù)初始化及數(shù)據(jù)所占內(nèi)存的分配與釋放;[0062](8)內(nèi)存管理器創(chuàng)建包含控制指令的5字節(jié)內(nèi)存塊,并建立與被監(jiān)控行為節(jié)點的一對一映射關(guān)系;[0063](9)監(jiān)控探頭修改PE文件中的被監(jiān)控行為節(jié)點的IAT導(dǎo)入地址表為與其對應(yīng)的5字節(jié)內(nèi)存塊地址用于實現(xiàn)監(jiān)控行為節(jié)點的監(jiān)控;如圖2所示,行為節(jié)點的監(jiān)控和執(zhí)行邏輯控制,采用基于內(nèi)存管理的模式以及結(jié)合IATHook和InlineHook技術(shù)各自優(yōu)點來實現(xiàn);[0064](10)被監(jiān)控的行為節(jié)點被劫持,監(jiān)控目標(biāo)軟件通過跳轉(zhuǎn)執(zhí)行5字節(jié)小內(nèi)存塊中的控制指令進入跳轉(zhuǎn)控制函數(shù)進行處理;[0065]控制指令是指匯編語言中的CALL指令,該控制指令使得監(jiān)控目標(biāo)軟件行為節(jié)點在被劫持后進入跳轉(zhuǎn)函數(shù)中;所述步驟(9)中的5字節(jié)內(nèi)存塊中,其中CALL指令占一個字節(jié),其十六進制代碼為0xE8,后4字節(jié)為跳轉(zhuǎn)函數(shù)的偏移地址;[0066]跳轉(zhuǎn)監(jiān)控函數(shù)采用_nakedcall調(diào)用約束方式,該約束方式在編譯器中生成的代碼中不包含Prolog和epilog代碼,即裸函數(shù),這種函數(shù)既方便對堆棧的操作,又可避免某些編譯器在函數(shù)執(zhí)行結(jié)束時由于堆棧檢查而造成的運行錯誤。由于裸函數(shù)沒有開辟新的棧幀,缺乏對內(nèi)部局部變量的保護,因此需要自己開辟和銷毀棧幀。在系統(tǒng)堆棧中,首先將指針寄存器EBP即棧底指針值壓入系統(tǒng)堆棧保存,然后將棧頂指針即指針寄存器ESP值賦給EBP即開辟新的棧幀,同時讓ESP減去OxCC即開辟204字節(jié)局部變量存儲空間;[0067]所述的跳轉(zhuǎn)控制函數(shù)處理包括以下步驟:[0068](a)定位被劫持的監(jiān)控行為節(jié)點并提取被劫持的行為節(jié)點的相關(guān)特征信息,同時將監(jiān)控目標(biāo)軟件執(zhí)行的API的返回地址進行修改用于保證API執(zhí)行完畢后返回繼續(xù)提取行為節(jié)點的相關(guān)特征信息,并將未修改的API的返回地址保存在監(jiān)控探頭的棧容器中;[0069]如圖3所示,被劫持行為節(jié)點定位的方法如下:[0070](aa)執(zhí)行包含CALL指令的5字節(jié)內(nèi)存塊,其地址假設(shè)為addm,在調(diào)用執(zhí)行跳轉(zhuǎn)控制函數(shù)的同時,將返回地址adc^壓入當(dāng)前棧幀;所述地址add^addm+S;[0071](ab)在跳轉(zhuǎn)控制函數(shù)中,利用匯編指令取出未修改的API的返回地址addr,計算出5字節(jié)內(nèi)存塊地址addm;[0072](ac)依據(jù)內(nèi)存存儲的映射數(shù)據(jù)和步驟(b)得到的5字節(jié)內(nèi)存塊地址add^,查找對應(yīng)的監(jiān)控行為節(jié)點,若存在則返回監(jiān)控行為節(jié)點數(shù)據(jù)的地址;若不存在則返回NULL。[0073](b)采用CALL指令調(diào)用監(jiān)控目標(biāo)軟件執(zhí)行的API入口地址執(zhí)行API;所述監(jiān)控目標(biāo)軟件執(zhí)行的API入口地址存儲于內(nèi)存管理模塊中被監(jiān)控行為節(jié)點的數(shù)據(jù)結(jié)構(gòu)中;[0074](c)再次提取被劫持的監(jiān)控行為節(jié)點的相關(guān)特征信息,并將保存在棧容器中的未修改的API的返回地址彈出用于保證跳轉(zhuǎn)函數(shù)執(zhí)行完畢后能夠正確恢復(fù)到監(jiān)控目標(biāo)軟件執(zhí)行的邏輯軌道中;[0075]如圖4所示,棧容器管理未修改的API的返回地址方法如下:[0076](ca)在跳轉(zhuǎn)控制函數(shù)中,提取未修改的API的返回地址add。;[0077](cb)獲取當(dāng)前線程號,判斷監(jiān)控探頭是否存在該線程號對應(yīng)的棧容器,[0078]若不存在則執(zhí)行(C);若存在則執(zhí)行步驟(d);[0079](CC)創(chuàng)建新的棧容器;[0080](cd)將地址add。壓入棧容器;[0081](ce)執(zhí)行API;[0082](Cf)獲取當(dāng)前線程號,在監(jiān)控探頭中定位對應(yīng)的棧容器并提取出地址add。;[0083](eg)提取完畢后,判斷當(dāng)前棧容器是否為空,若為空則執(zhí)行步驟(ch);若不為空則執(zhí)行步驟(ci);[0084](ch)銷毀當(dāng)前棧容器,并刪除監(jiān)控探頭中的棧容器紀(jì)錄;[0085](ci)恢復(fù)API的返回地址,并進行堆棧平衡。[0086](11)根據(jù)監(jiān)控控制臺的指令或者監(jiān)控目標(biāo)軟件是否自動終止,判斷是否結(jié)束監(jiān)控,若是則執(zhí)行步驟(12);若不是則返回執(zhí)行步驟(10);[0087](12)結(jié)束監(jiān)控目標(biāo)軟件的行為節(jié)點的監(jiān)控,并恢復(fù)PE文件中的IAT導(dǎo)入地址表;[0088](13)依據(jù)步驟(12)中結(jié)束監(jiān)控的行為節(jié)點信息,釋放其所占的內(nèi)存及與之映射的5字節(jié)內(nèi)存塊;[0089](14)結(jié)束。[0090]本發(fā)明說明書中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域技術(shù)人員的公知技術(shù)?!緳?quán)利要求】1.一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法,其特征在于步驟如下:(1)監(jiān)控控制臺首先加載監(jiān)控目標(biāo)軟件的PE文件,通過靜態(tài)映射的方式分析出PE文件的行為節(jié)點信息;所述行為節(jié)點信息是指PE文件所引用的操作系統(tǒng)及其它用戶自定義的API信息,行為節(jié)點信息存儲在PE文件的IAT導(dǎo)入地址表中;(2)根據(jù)步驟(1)得到的行為節(jié)點信息,通過添加和移除行為節(jié)點組成監(jiān)控軟件關(guān)鍵行為并存入數(shù)據(jù)庫,并確定要提取的關(guān)鍵行為特征信息;所述關(guān)鍵行為特征信息包括參數(shù)、線程屬性、進程屬性、時間屬性、位置屬性;(3)判斷是否首次監(jiān)控目標(biāo)軟件,若是則執(zhí)行步驟(6);若不是則被視為監(jiān)控運行中的調(diào)整,執(zhí)行步驟(4);(4)判斷是否對新的行為節(jié)點進行監(jiān)控,若是則執(zhí)行步驟(7);若不是則執(zhí)行步驟(5);(5)判斷是否結(jié)束已被監(jiān)控行為節(jié)點的監(jiān)控,若是則執(zhí)行步驟(12);若不是則被視為沒有進行任何操作,進入步驟(14);(6)監(jiān)控控制臺根據(jù)輸入的監(jiān)控目標(biāo)軟件的進程號,采用遠(yuǎn)程注入的方式將監(jiān)控探頭加載到監(jiān)控目標(biāo)軟件進程空間當(dāng)中,并完成監(jiān)控探頭的初始化;所述監(jiān)控探頭的初始化包括建立與監(jiān)控控制臺的通信連接、數(shù)據(jù)庫連接及監(jiān)控探頭啟動參數(shù)配置;(7)監(jiān)控探頭從數(shù)據(jù)庫中提取被監(jiān)控關(guān)鍵行為的行為節(jié)點信息,并由內(nèi)存管理器將行為節(jié)點信息進行數(shù)據(jù)格式轉(zhuǎn)化,形成內(nèi)存中可管理的持久化數(shù)據(jù);所述內(nèi)存管理器為監(jiān)控探頭的功能組成模塊,用于數(shù)據(jù)轉(zhuǎn)化、數(shù)據(jù)初始化及數(shù)據(jù)所占內(nèi)存的分配與釋放;(8)內(nèi)存管理器創(chuàng)建包含控制指令的5字節(jié)內(nèi)存塊,并建立與被監(jiān)控行為節(jié)點的一對一映射關(guān)系;(9)監(jiān)控探頭修改PE文件中的被監(jiān)控行為節(jié)點的IAT導(dǎo)入地址表為與其對應(yīng)的5字節(jié)內(nèi)存塊地址用于實現(xiàn)監(jiān)控行為節(jié)點的監(jiān)控;(10)被監(jiān)控的行為節(jié)點被劫持,監(jiān)控目標(biāo)軟件通過跳轉(zhuǎn)執(zhí)行5字節(jié)小內(nèi)存塊中的控制指令進入跳轉(zhuǎn)控制函數(shù)進行處理;所述的跳轉(zhuǎn)控制函數(shù)處理包括以下步驟:Ca)定位被劫持的監(jiān)控行為節(jié)點并提取被劫持的行為節(jié)點的相關(guān)特征信息,同時將監(jiān)控目標(biāo)軟件執(zhí)行的API的返回地址進行修改用于保證API執(zhí)行完畢后返回繼續(xù)提取行為節(jié)點的相關(guān)特征信息,并將未修改的API的返回地址保存在監(jiān)控探頭的棧容器中;;(b)采用CALL指令調(diào)用監(jiān)控目標(biāo)軟件執(zhí)行的API入口地址執(zhí)行API;所述監(jiān)控目標(biāo)軟件執(zhí)行的API入口地址存儲于內(nèi)存管理模塊中被監(jiān)控行為節(jié)點的數(shù)據(jù)結(jié)構(gòu)中;(c)再次提取被劫持的監(jiān)控行為節(jié)點的相關(guān)特征信息,并將保存在棧容器中的未修改的API的返回地址彈出用于保證跳轉(zhuǎn)函數(shù)執(zhí)行完畢后能夠正確恢復(fù)到監(jiān)控目標(biāo)軟件執(zhí)行的邏輯軌道中;(11)根據(jù)監(jiān)控控制臺的指令或者監(jiān)控目標(biāo)軟件是否自動終止,判斷是否結(jié)束監(jiān)控,若是則執(zhí)行步驟(12);若不是則返回執(zhí)行步驟(10);(12)結(jié)束監(jiān)控目標(biāo)軟件的行為節(jié)點的監(jiān)控,并恢復(fù)PE文件中的IAT導(dǎo)入地址表;(13)依據(jù)步驟(12)中結(jié)束監(jiān)控的行為節(jié)點信息,釋放其所占的內(nèi)存及與之映射的5字節(jié)內(nèi)存塊;(14)結(jié)束。2.根據(jù)權(quán)利要求1中所述的一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法,其特征在于:所述步驟(10)中的控制指令是指匯編語言中的CALL指令,該控制指令使得監(jiān)控目標(biāo)軟件行為節(jié)點在被劫持后進入跳轉(zhuǎn)函數(shù)中;所述步驟(9)中的5字節(jié)內(nèi)存塊中,其中CALL指令占一個字節(jié),其十六進制代碼為0xE8,后4字節(jié)為跳轉(zhuǎn)函數(shù)的偏移地址。3.根據(jù)權(quán)利要求1中所述的一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法,其特征在于:所述步驟(10)中的被劫持行為節(jié)點定位的方法如下:Ca)執(zhí)行包含CALL指令的5字節(jié)內(nèi)存塊,其地址假設(shè)為addm,在調(diào)用執(zhí)行跳轉(zhuǎn)控制函數(shù)的同時,將返回地址ad4壓入當(dāng)前棧幀;所述地址add^addm+S;(b)在跳轉(zhuǎn)控制函數(shù)中,利用匯編指令取出未修改的API的返回地址addp計算出5字節(jié)內(nèi)存塊地址addm;(c)依據(jù)內(nèi)存存儲的映射數(shù)據(jù)和步驟(b)得到的5字節(jié)內(nèi)存塊地址addm,查找對應(yīng)的監(jiān)控行為節(jié)點,若存在則返回監(jiān)控行為節(jié)點數(shù)據(jù)的地址;若不存在則返回NULL。4.根據(jù)權(quán)利要求1中所述的一種基于內(nèi)存管理的模式化軟件關(guān)鍵行為跟蹤方法,其特征在于:所述步驟(10)中的棧容器管理未修改的API的返回地址方法如下:Ca)在跳轉(zhuǎn)控制函數(shù)中,提取未修改的API的返回地址add。;(b)獲取當(dāng)前線程號,判斷監(jiān)控探`頭是否存在該線程號對應(yīng)的棧容器,若不存在則執(zhí)行(C);若存在則執(zhí)行步驟(d);(C)創(chuàng)建新的棧容器;(d)將地址add。壓入棧容器;(e)執(zhí)行API;(f)獲取當(dāng)前線程號,在監(jiān)控探頭中定位對應(yīng)的棧容器并提取出地址add。;(g)提取完畢后,判斷當(dāng)前棧容器是否為空,若為空則執(zhí)行步驟(h);若不為空則執(zhí)行步驟⑴;(h)銷毀當(dāng)前棧容器,并刪除監(jiān)控探頭中的棧容器紀(jì)錄;(i)恢復(fù)API的返回地址,并進行堆棧平衡?!疚臋n編號】G06F9/46GK103631712SQ201310502650【公開日】2014年3月12日申請日期:2013年10月23日優(yōu)先權(quán)日:2013年10月23日【發(fā)明者】袁野,范志強申請人:北京信息控制研究所