本發(fā)明屬于二進制軟件識別檢測,尤其涉及一種二進制軟件分發(fā)結構自動識別方法與系統(tǒng)。
背景技術:
1、分發(fā)結構是一種用于對消息序列中包含的全部消息依據(jù)其具體的類別分別進行計算處理的程序結構。從控制流圖的角度看,該結構一般表現(xiàn)為一個主體為多分支分發(fā)處理的循環(huán)結構,每次循環(huán)迭代時,依據(jù)當前消息對應的消息碼,分別選擇對應的分支進行處理計算。該結構常見于包含事件循環(huán)的網(wǎng)絡服務程序、編譯器、解釋器等軟件系統(tǒng)中。
2、對二進制程序靜態(tài)分析,識別出其中存在的分發(fā)結構,可以輔助安全分析人員強化對軟件的理解認知,并為智能化軟件漏洞挖掘、分析、利用、修補等技術研究提供支撐。
3、二進制程序分析是信息安全領域的一個研究熱點。當前分析手段可以分為控制流分析、數(shù)據(jù)流分析兩類??刂屏鞣治鲋ΧM制程序內(nèi)的控制流結構進行分析,當前分析手段可以識別出二進制程序內(nèi)包含的各個函數(shù)、函數(shù)內(nèi)包含的循環(huán)結構,并且能夠計算出各個函數(shù)內(nèi)部的基本塊構成、基本塊間轉(zhuǎn)移關系及函數(shù)之間的調(diào)用關系。數(shù)據(jù)流分析旨在對函數(shù)內(nèi)部每個程序點處各個程序變量計算對應的數(shù)據(jù)定值,到達定值分析即為當前較為典型的一種數(shù)據(jù)流分析方法。
4、盡管控制流分析和數(shù)據(jù)流分析技術在二進制程序安全分析領域得到了廣泛應用,對于二進制程序內(nèi)包含的分發(fā)結構,當前缺乏有效的分析方法,難以自動化地從二進制程序內(nèi)識別出所含分發(fā)結構,并將該結構信息提取出來。
技術實現(xiàn)思路
1、針對上述問題,本發(fā)明提出一種二進制軟件分發(fā)結構自動識別方案。在該方案中,依據(jù)分發(fā)結構包含的控制流、數(shù)據(jù)流結構特征,首先以分發(fā)結構控制流特征匹配技術識別出其中與分發(fā)結構控制流特征相匹配的代碼區(qū)域;隨之以分發(fā)結構數(shù)據(jù)流約束檢查技術檢查這些代碼區(qū)域是否滿足分發(fā)結構數(shù)據(jù)流特征。如果確定可以滿足,這些代碼區(qū)域即可被判定為分發(fā)結構,并最終由分發(fā)結構元數(shù)據(jù)提取技術將分發(fā)結構的元數(shù)據(jù)信息自動轉(zhuǎn)儲為磁盤文件,安全分析人員可以基于該分析結果,自動獲取目標二進制程序內(nèi)所含分發(fā)結構的分發(fā)點程序位置、分發(fā)消息碼程序變量等關鍵信息。
2、本發(fā)明第一方面公開了一種二進制軟件分發(fā)結構自動識別方法,在給定待分析的目標二進制程序的情況下,所述方法包括:
3、調(diào)用分發(fā)結構控制流特征匹配組件,對目標二進制程序進行靜態(tài)分析,識別出其中與分發(fā)結構控制流特征相匹配的代碼區(qū)域;
4、調(diào)用分發(fā)結構數(shù)據(jù)流約束檢查組件,檢查識別出的代碼區(qū)域是否滿足分發(fā)結構數(shù)據(jù)流特征,若是,則將所述代碼區(qū)域判定為分發(fā)結構;
5、調(diào)用分發(fā)結構轉(zhuǎn)儲組件,從所述分發(fā)結構中提取出元數(shù)據(jù)信息;
6、其中,分發(fā)結構的特征包括控制流特征和數(shù)據(jù)流特征;
7、其中,所述控制流特征包括:
8、分發(fā)結構是一個循環(huán)結構;
9、分發(fā)結構包含順序執(zhí)行的一個基本塊序列,所述基本塊序列內(nèi)的基本塊按順序執(zhí)行,且尾部指令為jz或jnz形式的條件跳轉(zhuǎn)指令;
10、其中,所述數(shù)據(jù)流特征包括:
11、存在至少一條順序分支序列,所述順序分支序列內(nèi)的所有基本塊的尾部的jz或jnz形式的條件跳轉(zhuǎn)指令的跳轉(zhuǎn)條件取決于兩個操作數(shù),一個為常數(shù),另一個為特定程序位置的程序變量,所述程序變量為分發(fā)結構的消息碼。
12、根據(jù)本發(fā)明第一方面的方法,調(diào)用分發(fā)結構控制流特征匹配組件,具體執(zhí)行:以所述目標二進制程序的執(zhí)行映像為輸入,利用循環(huán)分析技術識別出目標二進制程序內(nèi)包含的循環(huán)結構,對每個循環(huán)結構進行靜態(tài)分析,進一步篩選得到目標二進制程序內(nèi)存在的順序分支序列。
13、根據(jù)本發(fā)明第一方面的方法,對每個循環(huán)結構進行靜態(tài)分析,進一步篩選得到目標二進制程序內(nèi)存在的順序分支序列,具體包括:
14、對于所述循環(huán)結構,首先獲取循環(huán)結構內(nèi)所有基本塊的拓撲排序序列,將拓撲排序序列的第一個節(jié)點加入工作隊列并展開分析;其中,為每個基本塊關聯(lián)一個從循環(huán)首部節(jié)點到基本塊的程序路徑上累積的順序分支序列,對于入口節(jié)點,其對應的入口位置順序分支序列被設置為空,以predseqs列表收集計算得到的全部順序分支序列;
15、在獲取工作隊列首部元素存儲的基本塊節(jié)點node和其入口位置對應的順序分支序列cur_predseq后,調(diào)用run_on_node函數(shù)對基本塊節(jié)點node進行分析,累積發(fā)現(xiàn)的新的順序分支序列入predseqs列表,將后繼基本塊和對應的順序分支序列累積到工作隊列node_queue中,用于在循環(huán)迭代中得到調(diào)度計算;其中,當工作隊列為空時,循環(huán)迭代終止,由predseqs列表返回已經(jīng)計算得到的順序分支隊列;
16、將當前基本塊節(jié)點node標記為已分析,調(diào)用check_eqpredicate過程對基本塊節(jié)點node內(nèi)包含的最后一條匯編指令進行分析,檢查最后一條匯編指令是否為jz或jnz形式的條件跳轉(zhuǎn)指令;
17、若是,將is_eq_pred標志設置為true;
18、否則,將is_eq_pred標志設置為false;
19、以eq_branch、neq_branch變量分別存儲等于情況下和不等于情況下對應的分支地址,以cmp_addr存儲條件跳轉(zhuǎn)指令的前一條cmp或test指令對應的虛擬地址,以pred_operand、constant變量分別記錄參與比較運算的程序變量和常數(shù)信息;
20、獲取is_eq_pred的標志狀態(tài);
21、當is_eq_pred為false時,當前基本塊節(jié)點node最后一條指令不是對應的條件跳轉(zhuǎn)指令;
22、終結當前基本塊節(jié)點node入口位置的順序分支序列,將該順序分支序列累積到predseqs列表中;同時,對于當前基本塊節(jié)點node的各個后繼基本塊succ,不再繼承當前基本塊節(jié)點node入口位置的順序分支序列,將succ對應的入口位置順序分支序列設置為空;
23、當is_eq_pred為true時,當前基本塊節(jié)點node最后一條指令是對應的條件跳轉(zhuǎn)指令;
24、在等于情況下,對應的后繼基本塊將不再進行消息碼查詢匹配操作,設置該后繼基本塊succ對應的順序分支序列為空;
25、同時,由于不等于情況下對應的后繼基本塊之后還存在對消息碼的查詢匹配操作,在當前基本塊節(jié)點node對應的順序分支序列pred_seq后添加當前基本塊分支相關信息。
26、調(diào)用run_on_node函數(shù)得到基本塊節(jié)點node的后繼基本塊對應的順序分支序列,將其添加到工作隊列中,在循環(huán)迭代中得到調(diào)度執(zhí)行,完成循環(huán)結構內(nèi)所有分發(fā)結構的自動識別。
27、根據(jù)本發(fā)明第一方面的方法,調(diào)用分發(fā)結構數(shù)據(jù)流約束檢查組件,具體執(zhí)行:
28、對給定的順序分支序列進行分析,檢查順序分支序列內(nèi)各個分支節(jié)點對應的變量操作數(shù)是否指向同一內(nèi)存單元;若是,判定該順序分支序列所位循環(huán)為分發(fā)結構;具體包括:
29、計算順序分支序列所位循環(huán)結構內(nèi)各個程序位置所有程序變量的到達定值;
30、從順序分支序列內(nèi)的第 i個特定分支節(jié)點開始,沿著定值鏈表反向追溯該分支節(jié)點對應的變量操作數(shù)的到達定值;當追溯到位于循環(huán)結構外部的變量定值,或位于循環(huán)結構內(nèi)所有節(jié)點拓撲排序中最高位置基本塊的變量定值,終止追溯過程,并以該變量定值作為的程序點處對應的變量操作數(shù)的根定值;
31、在為順序分支序列內(nèi)每個分支節(jié)點的程序點處對應的變量操作數(shù)分別計算根定值后,檢查根定值是否相同;相同時判定給定的順序分支序列所位循環(huán)為分發(fā)結構;否則,為非分發(fā)結構。
32、根據(jù)本發(fā)明第一方面的方法,調(diào)用分發(fā)結構轉(zhuǎn)儲組件,具體執(zhí)行:
33、分發(fā)結構的元數(shù)據(jù)信息包括:分發(fā)結構所位函數(shù)的起始、終止地址、分發(fā)結構的第一個操作碼比較位置的虛擬地址及在所述虛擬地址處存儲消息碼的操作數(shù)類型、大小、消息碼的所有取值;
34、除消息碼的所有取值以外的其它元數(shù)據(jù)信息由分發(fā)結構直接得到;對于消息碼的所有取值,通過整合分發(fā)結構包含的順序分支序列內(nèi)各個分支位置對應的比較常量來進行收集;并以lua腳本的形式轉(zhuǎn)儲到磁盤文件上。
35、本發(fā)明第二方面公開了一種二進制軟件分發(fā)結構自動識別系統(tǒng),所述系統(tǒng)包括:分發(fā)結構控制流特征匹配組件、分發(fā)結構數(shù)據(jù)流約束檢查組件、分發(fā)結構轉(zhuǎn)儲組件;其中,在給定待分析的目標二進制程序的情況下:
36、分發(fā)結構控制流特征匹配組件被配置為:對目標二進制程序進行靜態(tài)分析,識別出其中與分發(fā)結構控制流特征相匹配的代碼區(qū)域;
37、分發(fā)結構數(shù)據(jù)流約束檢查組件被配置為:檢查識別出的代碼區(qū)域是否滿足分發(fā)結構數(shù)據(jù)流特征,若是,則將所述代碼區(qū)域判定為分發(fā)結構;
38、分發(fā)結構轉(zhuǎn)儲組件被配置為:從所述分發(fā)結構中提取出元數(shù)據(jù)信息;
39、其中,分發(fā)結構的特征包括控制流特征和數(shù)據(jù)流特征;
40、其中,所述控制流特征包括:
41、分發(fā)結構是一個循環(huán)結構;
42、分發(fā)結構包含順序執(zhí)行的一個基本塊序列,所述基本塊序列內(nèi)的基本塊按順序執(zhí)行,且尾部指令為jz或jnz形式的條件跳轉(zhuǎn)指令;
43、其中,所述數(shù)據(jù)流特征包括:
44、存在至少一條順序分支序列,所述順序分支序列內(nèi)的所有基本塊的尾部的jz或jnz形式的條件跳轉(zhuǎn)指令的跳轉(zhuǎn)條件取決于兩個操作數(shù),一個為常數(shù),另一個為特定程序位置的程序變量,所述程序變量為分發(fā)結構的消息碼。
45、本發(fā)明第三方面公開了一種電子設備。所述電子設備包括存儲器和處理器,所述存儲器存儲有計算機程序,所述處理器執(zhí)行所述計算機程序時,實現(xiàn)本公開第一方面所述的一種二進制軟件分發(fā)結構自動識別方法。
46、本發(fā)明第四方面公開了一種計算機可讀存儲介質(zhì)。所述計算機可讀存儲介質(zhì)上存儲有計算機程序,所述計算機程序被處理器執(zhí)行時,實現(xiàn)本公開第一方面所述的一種二進制軟件分發(fā)結構自動識別方法。
47、綜上,本發(fā)明提出的技術方案針對給定二進制程序計算出其內(nèi)包含的所有分發(fā)結構,并將該結構的描述信息轉(zhuǎn)儲到磁盤文件上。該方案可以與靜態(tài)二進制分析、動態(tài)模糊測試等技術相結合,進一步輔助安全分析人員對二進制程序的功能理解和逆向分析,并強化自動化漏洞挖掘、分析、利用工具的能力水平。