本發(fā)明屬于計算機軟件應(yīng)用
技術(shù)領(lǐng)域:
,特別涉及一種基于代碼指紋的代碼同源性檢測方法及其裝置。
背景技術(shù):
:隨著各類互聯(lián)網(wǎng)應(yīng)用需求的增長與代碼迭代速度的增加,對程序員的開發(fā)效率與速度提出了更高的需求。在軟件開發(fā)流水線上,基于模板的二次開發(fā)與現(xiàn)有組件的重用是常見現(xiàn)象;同時為了解決新的需求,開發(fā)人員通常會借鑒互聯(lián)網(wǎng)中開源代碼倉庫中的代碼。這就造成了具有同源性的代碼通過不同渠道不斷增長,代碼中隱藏的缺陷與錯誤也廣泛傳播。同時隨著計算機安全技術(shù)的不斷發(fā)展與病毒檢測技術(shù)的不斷提高,互聯(lián)網(wǎng)上現(xiàn)有的宏病毒、惡意vbs腳本、惡意javascript腳本等惡意代碼被檢測到的可能性越來越高,攻擊者需要在原有代碼的基礎(chǔ)上通過修改代碼內(nèi)容、變換代碼形式等手段繞過檢測,提高惡意代碼的生存能力。同種惡意代碼的各個版本之間有著內(nèi)生的同源性,是對其進(jìn)行檢測的重要依據(jù)。作為計算機程序研究的一個重要方面,現(xiàn)階段針對軟件源代碼的同源性檢測技術(shù)主要分為以下幾種類型:基于文本的軟件同源性檢測、基于結(jié)構(gòu)分析的軟件同源性檢測與基于語義的軟件同源性檢測。一)基于文本的軟件同源性檢測技術(shù),檢測的對象是源代碼的文本,例如基于文本相似度與基于文本屬性的代碼相似性檢測。將程序源代碼當(dāng)作文本分析的一個好處是不受制于分析對象所使用的編程語言,但也正因為其沒有考慮代碼的語言特性,這類方法對代碼混淆的抵抗力普遍較弱。簡單的代碼混淆手段如:替換變量函數(shù)名、插入垃圾代碼、在不影響功能的前提下打亂語句順序等就能夠較大的影響檢測效果。因此這類技術(shù)只能從文本層面進(jìn)行簡單的同源性檢測,存在較大的局限性。二)基于結(jié)構(gòu)分析的軟件同源性檢測技術(shù),通過對代碼結(jié)構(gòu)進(jìn)行分析并用其他可比較的中間形式表達(dá)出來,常見的有基于token、基于樹和基于圖的檢測方法等。這類技術(shù)相比基于文本的檢測方法而言具有更好的檢測效果,對于常見的混淆手段具有一定的抵抗能力。但是其計算復(fù)雜度取決于中間表示的方法,復(fù)雜的結(jié)構(gòu)會在檢測過程中帶來較大的性能開銷。三)基于語義的軟件同源性檢測技術(shù),在靜態(tài)語義分析的基礎(chǔ)上抽取控制流、數(shù)據(jù)流、標(biāo)準(zhǔn)api流等特征,從不同角度刻畫程序行為;或者對源代碼進(jìn)行編譯并執(zhí)行,記錄程序指令流與系統(tǒng)調(diào)用序列以刻畫程序行為。這類技術(shù)本質(zhì)上都是刻畫程序的語義和行為特征,能夠更有效地應(yīng)對各類代碼混淆對同源性檢測帶來的挑戰(zhàn)。但基于語義的方法不能有效涵蓋代碼自身特征,同時開展準(zhǔn)確的語義分析難度較大。技術(shù)實現(xiàn)要素:針對現(xiàn)有技術(shù)中的不足,本發(fā)明提供一種基于代碼指紋的代碼同源性檢測方法及其裝置,解決在軟件源代碼檢測過程中,抗混淆干擾能力不強,檢測效率不高的問題,能夠較為準(zhǔn)確的提取代碼特征,有效應(yīng)對常見代碼混淆手法帶來的影響,提高同源性檢測的效率及檢測的準(zhǔn)確性,有效防范惡意代碼的傳播。按照本發(fā)明所提供的設(shè)計方案,一種基于代碼指紋的代碼同源性檢測方法,包含如下步驟:步驟1、對兩份輸入代碼s和t進(jìn)行依賴關(guān)系分析,獲取原始程序依賴圖pdg;并對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化、嵌套移除和著色處理,獲取簡化程序依賴圖spdg;步驟2、基于抽象語法樹解析代碼關(guān)鍵語法信息;步驟3、抽取代碼執(zhí)行路徑的系統(tǒng)調(diào)用序列,獲取目標(biāo)代碼的全路徑參數(shù)向量集合,構(gòu)建代碼指紋;步驟4、計算代碼指紋部件間的同源性系數(shù),該同源性系數(shù)包含簡化程序依賴圖spdg同構(gòu)系數(shù)ps,t、語法信息重合系數(shù)cs,t以及系統(tǒng)調(diào)用序列相似系數(shù)as,t;步驟5、根據(jù)同源性系數(shù)計算兩份代碼s和t的同源性指數(shù),通過該同源性指數(shù)判定代碼雙方存在的同源關(guān)系。上述的,步驟1中的對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化、嵌套移除和著色處理,獲取簡化程序依賴圖spdg,包含如下內(nèi)容:步驟11、依據(jù)簡化原則對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化;步驟12、對于包含嵌套關(guān)系的節(jié)點,移除其內(nèi)部所嵌套的輸入節(jié)點與輸出節(jié)點,并將其對應(yīng)依賴關(guān)系的邊移除到外層函數(shù)調(diào)用節(jié)點上;步驟13、按照語句類型對節(jié)點進(jìn)行分類并著色,獲取簡化程序依賴圖spdg。上述的,步驟11中的簡化原則,包含:去除只有一個傳出邊而沒有任何傳入邊的頂點,去除只有一個傳入邊而沒有任何外向邊的頂點;去除只有一個輸入和一個輸出邊的頂點,并引入從其輸入頂點指向輸出頂點;去除沒有任何傳入或傳出邊緣頂點。上述的,步驟2中基于抽象語法樹解析代碼關(guān)鍵語法信息,包含如下內(nèi)容:步驟21、記錄指定代碼域中的全局變量、局部變量及其屬性,組成四元組,該四元組包含變量的作用域、鏈接屬性、存儲類型及名稱;步驟22、解析并記錄宏定義及其對應(yīng)內(nèi)容,組成三元組,該三元組包含宏定義標(biāo)識、內(nèi)容類型及名稱;步驟23、基于抽象語法樹ast解析代碼中的關(guān)鍵數(shù)據(jù)結(jié)構(gòu),以序列形式記錄代碼中自定義結(jié)構(gòu)體。上述的,步驟3包含如下內(nèi)容:步驟31、從入口函數(shù)開始,生成函數(shù)f的調(diào)用圖和后序支配樹,提取出單條執(zhí)行路徑中的系統(tǒng)調(diào)用序列k,記錄所有可能的執(zhí)行路徑中系統(tǒng)調(diào)用序列集合k;步驟32、對于每條系統(tǒng)調(diào)用序列k中的函數(shù)f,定位其所在函數(shù)域d,解析抽象語法樹中函數(shù)f的所有參數(shù),通過靜態(tài)污點分析確定f中各個參數(shù)的數(shù)據(jù)來源s,判定參數(shù)值的來源,并結(jié)合參數(shù)的數(shù)據(jù)類型t構(gòu)成函數(shù)f的參數(shù)向量ef=(d,f,t,s);得到系統(tǒng)調(diào)用序列k的參數(shù)向量集ek;步驟33、對系統(tǒng)調(diào)用序列集合k中每條序列k執(zhí)行步驟32,獲取目標(biāo)代碼的全路徑參數(shù)向量集合ek;步驟34、根據(jù)目標(biāo)代碼的全路徑參數(shù)向量集合ek,構(gòu)建代碼指紋。上述的,所述的步驟3包含如下內(nèi)容:步驟31、分別計算推薦者初始集中推薦者的領(lǐng)域相關(guān)度、推薦響應(yīng)率及推薦滿意率;步驟32、設(shè)定推薦響應(yīng)率、推薦滿意率及領(lǐng)域相關(guān)度接受閾值,針對推薦者初始集中的所有推薦者,通過接受閾值進(jìn)行篩選,將低于接受閾值的推薦者從推薦者初始集中移除;步驟33、通過篩選得到推薦者候選集。上述的,步驟4包含如下內(nèi)容:步驟41、對于目標(biāo)代碼的簡化程序依賴圖spdg,通過漸進(jìn)式圖同構(gòu)求解算法尋求簡化程序依賴圖spdg之間的最大同構(gòu)子圖,并計算簡化程序依賴圖spdg之間的同構(gòu)系數(shù)ps,t;步驟42、根據(jù)步驟2獲取的關(guān)鍵語法信息,通過jaccard算法計算重合系數(shù)cs,t;步驟43、根據(jù)步驟3中的目標(biāo)代碼的全路徑參數(shù)向量集合ek,通過jaccard求解ek子集合的相似性系數(shù),取最高值作為系統(tǒng)調(diào)用序列相似系數(shù)as,t。優(yōu)選的,步驟41中,原始程序依賴圖pdg表示為有向圖g=(v,e),節(jié)點集合v表示一組謂詞表達(dá)式或語句,e表示各部分之間存在的數(shù)據(jù)依賴與控制依賴,令g1=(v1,e1),g2=(v2,e2)分別表示簡化程序依賴圖spdg,通過評估函數(shù):,計算簡化程序依賴圖spdg之間的同構(gòu)系數(shù)p。優(yōu)選的,步驟42包含內(nèi)容如下:單種語法信息α的重合系數(shù)其中,分別是兩份代碼s和t對應(yīng)的語法信息α的序列;計算關(guān)鍵語法信息重合系數(shù)wα是語法信息α的權(quán)重。上述的,步驟5中,通過公式:計算兩份代碼s和t的同源性指數(shù),其中,wp為spdg圖同構(gòu)系數(shù)的權(quán)重,wc為語法信息重合系數(shù)的權(quán)重,wa為系統(tǒng)調(diào)用序列相似系數(shù)的權(quán)重。一種基于代碼指紋的代碼同源性檢測裝置,包含:程序簡化模塊、語法解析模塊、指紋構(gòu)建模塊、同源性系數(shù)獲取模塊、同源性判定模塊;程序簡化模塊,用于對兩份輸入代碼s和t進(jìn)行依賴關(guān)系分析,獲取原始程序依賴圖pdg;并對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化、嵌套移除和著色處理,獲取簡化程序依賴圖spdg;語法解析模塊,用于基于抽象語法樹解析代碼關(guān)鍵語法信息,包含變量解析單元、宏定義解析單元及關(guān)鍵數(shù)據(jù)結(jié)構(gòu)解析單元,其中,變量解析單元用于記錄指定代碼域中的全局變量、局部變量及其對應(yīng)的作用域、鏈接屬性和存儲類型,宏定義解析單元用于記錄宏定義及其對應(yīng)的內(nèi)容類型,關(guān)鍵數(shù)據(jù)結(jié)構(gòu)解析單元用于解析目標(biāo)代碼域中所有類和函數(shù)內(nèi)定義的結(jié)構(gòu)體;指紋構(gòu)建模塊,用于抽取代碼執(zhí)行路徑的系統(tǒng)調(diào)用序列,獲取目標(biāo)代碼的全路徑參數(shù)向量集合,構(gòu)建代碼指紋;同源性系數(shù)獲取模塊,用于根據(jù)程序簡化模塊、語法解析模塊及指紋構(gòu)建模塊獲取的信息,計算代碼指紋部件間的同源性系數(shù),該同源性系數(shù)包含簡化程序依賴圖spdg同構(gòu)系數(shù)ps,t、語法信息重合系數(shù)cs,t以及系統(tǒng)調(diào)用序列相似系數(shù)as,t;同源性判定模塊,用于根據(jù)同源性系數(shù)獲取模塊得到的同源性系數(shù)計算兩份代碼s和t的同源性指數(shù),并通過該同源性指數(shù)判定代碼雙方存在的同源關(guān)系本發(fā)明的有益效果:本發(fā)明針對源代碼同源性判定方法,能夠在相似性的基礎(chǔ)上兼顧代碼語義與行為,利用輕量級的特征與簡化機制提高檢測效率,多角度衡量代碼間存在的同源關(guān)系;解決現(xiàn)有技術(shù)中存在:a)不能有效應(yīng)對使用格式更改、重命名修改、垃圾代碼插入、語句重新排序等多種手段復(fù)合的代碼混淆方法;b)基于復(fù)雜結(jié)構(gòu)與算法的檢測方法的檢測方式可以得到較高準(zhǔn)確性,但檢測過程中存在求解計算量大,檢測效率低的問題,在提高準(zhǔn)確性的同時不能很好兼顧檢測效率,等的問題;能夠在保證準(zhǔn)確性的同時,提高檢測效率。本發(fā)明通過代碼指紋抽象出代碼的邏輯與特征,在通過程序依賴圖表現(xiàn)數(shù)據(jù)流與控制流關(guān)系的同時融入代碼的語法特征與行為特征,解決現(xiàn)有代碼同源性檢測側(cè)重于分析代碼文本與特征相似性時,反映代碼之間內(nèi)在邏輯與深層關(guān)聯(lián)的能力不足的問題,在保持高準(zhǔn)確率的同時大大提高了同源性檢測的效率,有效防范惡意代碼的傳播,為計算機程序源代碼的同源性檢測與判定提供技術(shù)支撐,對計算機網(wǎng)絡(luò)安全技術(shù)及病毒檢測技術(shù)具有重要指導(dǎo)意義。附圖說明:圖1為本發(fā)明的方法流程示意圖;圖2為實施例中同源性分析方法流程示意圖;圖3為實施例中獲取簡化程序依賴圖spdg的流程示意圖;圖4為實施例中基于抽象語法樹解析代碼關(guān)鍵語法信息的流程示意圖;圖5為實施例中構(gòu)建代碼指紋的流程示意圖;圖6為實施例中計算代碼指紋部件間同源性系數(shù)的流程示意圖;圖7為本發(fā)明的裝置示意圖;圖8為實施例中輸入代碼示意;圖9為實施例中原始程序依賴圖結(jié)構(gòu)簡化部分效果示意;圖10為實施例中嵌套移除過程示意;圖11為實施例中基于抽象語法樹解析示意;圖12為實施例中目標(biāo)代碼系統(tǒng)調(diào)用參數(shù)提取示意。具體實施方式:為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚、明白,下面結(jié)合附圖和技術(shù)方案對本發(fā)明作進(jìn)一步詳細(xì)的說明?,F(xiàn)階段針對代碼同源性檢測的方法研究,大多基于單種類型開展。粗粒度的特征檢測可以提高檢測效率但是會降低檢測準(zhǔn)確性,細(xì)粒度的特征在提高檢測準(zhǔn)確性的同時又帶來了計算量大的性能瓶頸。如何在高效檢測的條件下有效應(yīng)對復(fù)雜的代碼混淆手段,準(zhǔn)確抽象代碼邏輯與歸納代碼特征,是當(dāng)前需要研究的重要內(nèi)容。實施例,提供一種基于代碼指紋的代碼同源性檢測方法,參見圖1所示,包含如下步驟:步驟1、對兩份輸入代碼s和t進(jìn)行依賴關(guān)系分析,獲取原始程序依賴圖pdg;并對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化、嵌套移除和著色處理,獲取簡化程序依賴圖spdg;步驟2、基于抽象語法樹解析代碼關(guān)鍵語法信息;步驟3、抽取代碼執(zhí)行路徑的系統(tǒng)調(diào)用序列,獲取目標(biāo)代碼的全路徑參數(shù)向量集合,構(gòu)建代碼指紋;步驟4、計算代碼指紋部件間的同源性系數(shù),該同源性系數(shù)包含簡化程序依賴圖spdg同構(gòu)系數(shù)ps,t、語法信息重合系數(shù)cs,t以及系統(tǒng)調(diào)用序列相似系數(shù)as,t;步驟5、根據(jù)同源性系數(shù)計算兩份代碼s和t的同源性指數(shù),通過該同源性指數(shù)判定代碼雙方存在的同源關(guān)系。本實施例能夠較為準(zhǔn)確的提取代碼特征,有效應(yīng)對常見代碼混淆手法帶來的影響,提高同源性檢測準(zhǔn)確性的同時,又大大提高其檢測的效率。對于待檢測的兩份輸入代碼文件,根據(jù)其編程語言編譯原理進(jìn)行程序分析,獲取代碼的原始程序依賴圖pdg,作為代碼指紋的基礎(chǔ),在本發(fā)明的另一個實施例中,參見圖3所示,對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化、嵌套移除和著色處理,獲取簡化程序依賴圖spdg,包含如下內(nèi)容:步驟11、依據(jù)簡化原則對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化;步驟12、對于包含嵌套關(guān)系的節(jié)點,移除其內(nèi)部所嵌套的輸入節(jié)點與輸出節(jié)點,并將其對應(yīng)依賴關(guān)系的邊移除到外層函數(shù)調(diào)用節(jié)點上;步驟13、按照語句類型對節(jié)點進(jìn)行分類并著色,獲取簡化程序依賴圖spdg。本發(fā)明的又一實施例中,對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化,包括按照簡化原則對圖中節(jié)點進(jìn)行如下簡化操作:去除只有一個傳出邊而沒有任何傳入邊的頂點,去除只有一個傳入邊而沒有任何外向邊的頂點;去除只有一個輸入和一個輸出邊的頂點,并引入從其輸入頂點指向輸出頂點;去除沒有任何傳入或傳出邊緣頂點;重復(fù)上述簡化操作,直到?jīng)]有符合簡化原則的節(jié)點存在為止。按照語句類型對節(jié)點進(jìn)行分類,然后對不同類型節(jié)點進(jìn)行按照不同的顏色進(jìn)行著色,并用著色編號來標(biāo)識每種類型以便于比較。使用的分類實例如下:函數(shù)調(diào)用、控制語句、聲明語句、運算語句、switch語句、邏輯表達(dá)式、跳轉(zhuǎn)語句以及返回語句等等。具體描述見表1。類型節(jié)點表示信息著色編號函數(shù)調(diào)用調(diào)用函數(shù)與系統(tǒng)api1控制語句if,switch,while,for.2聲明語句變量聲明或格式化參數(shù)3運算語句變量操作,自增/減運算4switch語句case,default5跳轉(zhuǎn)語句goto,break,continue6條件語句<,>,==,?。?返回語句return8其他其他0表1使用llvm或clang構(gòu)建源代碼的抽象語法樹(abstractsyntaxtree,ast),本發(fā)明的再一實施例中,基于抽象語法樹解析代碼關(guān)鍵語法信息,作為代碼指紋的組成部分,參見圖4所示,包含如下內(nèi)容:步驟21、記錄指定代碼域中的全局變量、局部變量及其屬性,組成四元組,該四元組包含變量的作用域、鏈接屬性、存儲類型及名稱;步驟22、解析并記錄宏定義及其對應(yīng)內(nèi)容,組成三元組,該三元組包含宏定義標(biāo)識、內(nèi)容類型及名稱;步驟23、基于抽象語法樹ast解析代碼中的關(guān)鍵數(shù)據(jù)結(jié)構(gòu),以序列形式記錄代碼中自定義結(jié)構(gòu)體。本發(fā)明的又一個實施例中,抽取代碼執(zhí)行路徑的系統(tǒng)調(diào)用序列,獲取目標(biāo)代碼的全路徑參數(shù)向量集合e,構(gòu)建代碼指紋,參見圖5所示,包含如下內(nèi)容:步驟31、從入口函數(shù)開始,生成函數(shù)f的調(diào)用圖和后序支配樹,提取出單條執(zhí)行路徑中的系統(tǒng)調(diào)用序列k,記錄所有可能的執(zhí)行路徑中系統(tǒng)調(diào)用序列集合k;步驟32、對于每條系統(tǒng)調(diào)用序列k中的函數(shù)f,定位其所在函數(shù)域d,解析抽象語法樹中函數(shù)f的所有參數(shù),通過靜態(tài)污點分析確定f中各個參數(shù)的數(shù)據(jù)來源s,判定參數(shù)值的來源,并結(jié)合參數(shù)的數(shù)據(jù)類型t構(gòu)成函數(shù)f的參數(shù)向量ef=(d,f,t,s);得到系統(tǒng)調(diào)用序列k的參數(shù)向量集ek;步驟33、對系統(tǒng)調(diào)用序列集合k中每條序列k執(zhí)行步驟32,獲取目標(biāo)代碼的全路徑參數(shù)向量集合ek;步驟34、根據(jù)目標(biāo)代碼的全路徑參數(shù)向量集合ek,構(gòu)建代碼指紋。代碼指紋進(jìn)行同源性判定時,本發(fā)明的又一個實施例中,計算代碼指紋部件間的同源性系數(shù),參見圖6所示,包含如下內(nèi)容:步驟41、對于目標(biāo)代碼的簡化程序依賴圖spdg,通過漸進(jìn)式圖同構(gòu)求解算法尋求簡化程序依賴圖spdg之間的最大同構(gòu)子圖,并計算簡化程序依賴圖spdg之間的同構(gòu)系數(shù)ps,t;步驟42、根據(jù)步驟2獲取的關(guān)鍵語法信息,通過jaccard算法計算重合系數(shù)cs,t;步驟43、根據(jù)步驟3中的目標(biāo)代碼的全路徑參數(shù)向量集合ek,通過jaccard求解ek子集合的相似性系數(shù),取最高值作為系統(tǒng)調(diào)用序列相似系數(shù)as,t。另一個實施例中,目標(biāo)代碼的原始程序依賴圖pdg表示為有向圖g=(v,e),節(jié)點集合v表示一組謂詞表達(dá)式或語句,e表示各部分之間存在的數(shù)據(jù)依賴與控制依賴,令g1=(v1,e1),g2=(v2,e2)分別表示簡化程序依賴圖spdg,根據(jù)漸進(jìn)式圖同構(gòu)求解算法的求解結(jié)果,通過評估函數(shù):,計算簡化程序依賴圖spdg之間的同構(gòu)系數(shù)p,p=0則表示g1是g2的完全子圖。對于獲取的代碼關(guān)鍵語法信息序列,本發(fā)明的又一實施例中,通過jaccard算法計算重合系數(shù),包含內(nèi)容如下:單種語法信息α的重合系數(shù)其中,分別是兩份代碼s和t對應(yīng)的語法信息α的序列;計算關(guān)鍵語法信息重合系數(shù)wα是語法信息α的權(quán)重。針對兩份輸入代碼s和t,計算出spdg圖同構(gòu)系數(shù)ps,t、語法信息重合系數(shù)cs,t以及系統(tǒng)調(diào)用序列相似系數(shù)as,t,本發(fā)明的其他實施例中,通過公式:計算兩份代碼s和t的同源性指數(shù),其中,wp為spdg圖同構(gòu)系數(shù)的權(quán)重,wc為語法信息重合系數(shù)的權(quán)重,wa為系統(tǒng)調(diào)用序列相似系數(shù)的權(quán)重。homology(s,t)越大,說明輸入樣本間存在越明顯的同源關(guān)系。與上述方法對應(yīng),本發(fā)明實施例還提供了一種基于代碼指紋的代碼同源性檢測裝置,如圖7所示,包含:程序簡化模塊201、語法解析模塊202、指紋構(gòu)建模塊203、同源性系數(shù)獲取模塊204、同源性判定模塊205;程序簡化模塊201,用于對兩份輸入代碼s和t進(jìn)行依賴關(guān)系分析,獲取原始程序依賴圖pdg;并對原始程序依賴圖pdg進(jìn)行結(jié)構(gòu)簡化、嵌套移除和著色處理,獲取簡化程序依賴圖spdg;語法解析模塊202,用于基于抽象語法樹解析代碼關(guān)鍵語法信息,包含變量解析單元、宏定義解析單元及關(guān)鍵數(shù)據(jù)結(jié)構(gòu)解析單元,其中,變量解析單元用于記錄指定代碼域中的全局變量、局部變量及其對應(yīng)的作用域、鏈接屬性和存儲類型,宏定義解析單元用于記錄宏定義及其對應(yīng)的內(nèi)容類型,關(guān)鍵數(shù)據(jù)結(jié)構(gòu)解析單元用于解析目標(biāo)代碼域中所有類和函數(shù)內(nèi)定義的結(jié)構(gòu)體;指紋構(gòu)建模塊203,用于抽取代碼執(zhí)行路徑的系統(tǒng)調(diào)用序列,獲取目標(biāo)代碼的全路徑參數(shù)向量集合,構(gòu)建代碼指紋;同源性系數(shù)獲取模塊204,用于根據(jù)程序簡化模塊、語法解析模塊及指紋構(gòu)建模塊獲取的信息,計算代碼指紋部件間的同源性系數(shù),該同源性系數(shù)包含簡化程序依賴圖spdg同構(gòu)系數(shù)ps,t、語法信息重合系數(shù)cs,t以及系統(tǒng)調(diào)用序列相似系數(shù)as,t;同源性判定模塊205,用于根據(jù)同源性系數(shù)獲取模塊得到的同源性系數(shù)計算兩份代碼s和t的同源性指數(shù),并通過該同源性指數(shù)判定代碼雙方存在的同源關(guān)系。下面通過具體舉例進(jìn)一步說明本發(fā)明的有效性,參見圖8所示,兩份輸入程序代碼文件中部分內(nèi)容示意,根據(jù)編程語言編譯原理進(jìn)行程序分析,獲取原始程序依賴圖pdg,原始程序依賴圖pdg表示為有向圖g=(v,e),節(jié)點集合v表示一組謂詞表達(dá)式或語句,e表示各部分之間存在的數(shù)據(jù)依賴與控制依賴,原始程序依賴圖pdg作為代碼指紋的基礎(chǔ);對原始程序依賴圖進(jìn)行結(jié)構(gòu)簡化,簡化后的部分效果示意如圖9所示;對結(jié)構(gòu)簡化后的程序依賴圖進(jìn)行嵌套移除,嵌套移除過程如圖10所示;對通過結(jié)構(gòu)簡化、嵌套移除后的程序依賴圖進(jìn)行著色處理,得到簡化程序依賴圖spdg;使用llvm或clang構(gòu)建源代碼的抽象語法樹,基于抽象語法樹解析代碼關(guān)鍵語法信息,作為代碼指紋的組成部分,兩份輸入文件的解析示意如圖11所示。提取目標(biāo)代碼中系統(tǒng)調(diào)用的參數(shù)序列,構(gòu)成完整的代碼指紋,如圖12所示,從main等入口函數(shù)開始,生成函數(shù)f的調(diào)用圖和后序支配樹,提取出單條執(zhí)行路徑中的系統(tǒng)調(diào)用序列k,記錄所有可能的執(zhí)行路徑中系統(tǒng)調(diào)用序列集合k,對于每條系統(tǒng)調(diào)用序列k中的函數(shù)f,定位其所在函數(shù)域d,解析抽象語法樹中函數(shù)f的所有參數(shù),通過靜態(tài)污點分析確定f中各個參數(shù)的數(shù)據(jù)來源s,判定參數(shù)的值由外部傳入或是來自函數(shù)內(nèi)部,最終結(jié)合參數(shù)的數(shù)據(jù)類型t構(gòu)成函數(shù)f的一個參數(shù)向量ef=(d,f,t,s)。對一條系統(tǒng)調(diào)用序列k進(jìn)行上述操作后得到序列k的參數(shù)向量集ek,對系統(tǒng)調(diào)用序列集合k中每條序列k進(jìn)行上述步驟,獲得目標(biāo)代碼的全路徑參數(shù)向量集合ek。為緩解ek規(guī)模過大或無效路徑太多的問題,只保留其中滿足參數(shù)向量集元素個數(shù)|ek|≥5的路徑。對于目標(biāo)代碼的簡化程序依賴圖spdg,采用漸進(jìn)式圖同構(gòu)求解算法尋找spdg之間的最大同構(gòu)子圖,根據(jù)結(jié)果計算spdg圖同構(gòu)系數(shù)。令g1=(v1,e1),g2=(v2,e2)分別表示兩份輸入代碼文件的簡化程序依賴圖spdg,算法如下:算法開始前先確定步數(shù)n和每一步擴展的大小mi,其中,mi和n滿足且mi≥1。利用vflib開源圖同構(gòu)判定框架實現(xiàn)isomorph(g1,i,g2)函數(shù)對子圖g1,i和g2同構(gòu)的判定,最終得到g1中和g2同構(gòu)的最大子圖。根據(jù)漸進(jìn)式圖同構(gòu)求解算法求解結(jié)果,使用如下評估函數(shù)計算兩個圖之間不同邊的數(shù)量與較小圖中邊的數(shù)量之比例。計算結(jié)果p表示簡化程序?qū)傩詧Dspdg圖同構(gòu)系數(shù)。p=0則表示g1是g2的完全子圖。對于獲取的代碼關(guān)鍵語法信息序列,包括變量四元組序列、宏定義三元組序列以及結(jié)構(gòu)體序列,采用jaccard算法計算重合系數(shù)c,具體如下:單種語法信息α的重合系數(shù)其中,分別是兩份代碼s和t對應(yīng)的語法信息α的序列,定義當(dāng)均為空的時候hα=0;計算關(guān)鍵語法信息重合系數(shù)wα是語法信息α的權(quán)重。本實例中設(shè)定變量信息權(quán)重為0.4,宏定義信息權(quán)重為0.2,結(jié)構(gòu)體信息權(quán)重為0.4。對于目標(biāo)代碼的全路徑參數(shù)向量集合ek,采用jaccard算法求ek子集合的相似性系數(shù),取最高值作為系統(tǒng)調(diào)用序列相似系數(shù)a。算法如下:針對代碼s和t計算出spdg圖同構(gòu)系數(shù)ps,t、語法信息重合系數(shù)cs,t以及系統(tǒng)調(diào)用序列相似系數(shù)as,t,通過如下公式計算兩份代碼s和t的同源性指數(shù):,其中,wp為spdg圖同構(gòu)系數(shù)的權(quán)重,wc為語法信息重合系數(shù)的權(quán)重,wa為系統(tǒng)調(diào)用序列相似系數(shù)的權(quán)重。homology(s,t)越大,說明輸入樣本間存在越明顯的同源關(guān)系。本說明書中各個實施例采用遞進(jìn)的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似部分互相參見即可。對于實施例公開的裝置而言,由于其與實施例公開的方法相對應(yīng),所以描述的比較簡單,相關(guān)之處參見方法部分說明即可。結(jié)合本文中所公開的實施例描述的各實例的單元及方法步驟,能夠以電子硬件、計算機軟件或者二者的結(jié)合來實現(xiàn),為了清楚地說明硬件和軟件的可互換性,在上述說明中已按照功能一般性地描述了各示例的組成及步驟。這些功能是以硬件還是軟件方式來執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計約束條件。本領(lǐng)域普通技術(shù)人員可以對每個特定的應(yīng)用來使用不同方法來實現(xiàn)所描述的功能,但是這種實現(xiàn)不認(rèn)為超出本發(fā)明的范圍。本領(lǐng)域普通技術(shù)人員可以理解上述方法中的全部或部分步驟可通過程序來指令相關(guān)硬件完成,所述程序可以存儲于計算機可讀存儲介質(zhì)中,如:只讀存儲器、磁盤或光盤等。可選地,上述實施例的全部或部分步驟也可以使用一個或多個集成電路來實現(xiàn),相應(yīng)地,上述實施例中的各模塊/單元可以采用硬件的形式實現(xiàn),也可以采用軟件功能模塊的形式實現(xiàn)。本發(fā)明不限制于任何特定形式的硬件和軟件的結(jié)合。對所公開的實施例的上述說明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本申請。對這些實施例的多種修改對本領(lǐng)域的專業(yè)技術(shù)人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本申請的精神或范圍的情況下,在其它實施例中實現(xiàn)。因此,本申請將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。當(dāng)前第1頁12