專利名稱:基于摘要語法樹和語義匹配的軟件同源性檢測方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及信息安全中的軟件安全技術(shù)領(lǐng)域,尤其涉及一種基于摘要語法樹和語 義匹配的軟件同源性檢測方法及裝置。
背景技術(shù):
軟件同源性檢測技術(shù)是計算機(jī)編程語言研究的一個重要方面,根據(jù)其檢測的 方法不同,這個領(lǐng)域現(xiàn)存在以下主流研究領(lǐng)域基于文本的軟件同源性檢測和基于標(biāo)記 (Token)的軟件同源性檢測。基于文本的軟件同源性檢測技術(shù)方案是基于文本層次進(jìn)行軟件同源性檢測,而目 前軟件源代碼抄襲的過程一般都是整塊復(fù)制,或者在此基礎(chǔ)上加以改動,比如替換變量名、 在不影響程序功能的情況下打亂語句順序、更改函數(shù)名或者函數(shù)位置等等,因此,基于文本 的軟件同源性檢測技術(shù)方案僅僅在文本層次進(jìn)行軟件同源性檢測,已經(jīng)不能滿足軟件同源 性檢測的需求。而且,基于文本層次的軟件同源性檢測完全忽略了軟件源代碼的語法含義, 因而有很大的局限性,對于上述軟件源代碼抄襲手段都無法正確檢測出來?;跇?biāo)記Token的軟件同源性檢測技術(shù)方案主要是用來進(jìn)行軟件源代碼克隆檢 測,也可以用來做軟件同源性檢測。這種技術(shù)方案一定程度上考慮了語言特點(diǎn),但其原理是 查找軟件源代碼中最長的相似子串,所以不能應(yīng)對軟件源代碼順序調(diào)換這樣的抄襲情況。目前,還沒有一種成熟可靠的軟件同源性檢測技術(shù)方案,在語法層次上結(jié)合語義 對軟件源代碼進(jìn)行有效而準(zhǔn)確的同源性檢測。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明實(shí)施例的目的是提供了一種基于摘要語法樹和語義匹配的軟件 同源性檢測方法及裝置,從而有效而準(zhǔn)確的進(jìn)行軟件同源性檢測,以應(yīng)對各種軟件源代碼 抄襲行為,促進(jìn)了軟件評估工作和保護(hù)軟件版權(quán)的推進(jìn)。為了達(dá)到上述目的,本發(fā)明實(shí)施例提供了一種基于摘要語法樹和語義匹配的軟件 同源性檢測方法,包括生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配相同語義特征規(guī) 則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算所述摘要語法樹中子樹的哈希值;通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。優(yōu)選的,上述方法中,所述生成軟件源代碼對應(yīng)的摘要語法樹包括將所述軟件源代碼中的文件包含指令、注釋和多余的空白符刪除;查找所述軟件 源代碼中被宏定義指令所替換的字符串,并換回原來的字符串;判斷所述軟件源代碼中的 條件編譯指令中的判斷條件是否成立,然后選擇刪除或保留對應(yīng)的軟件源代碼段。優(yōu)選的,上述方法中,所述語義特征規(guī)則至少為下列特征中的一種條件表達(dá)式為 比較表達(dá)式、變量標(biāo)識、函數(shù)調(diào)用。
4
優(yōu)選的,上述方法中,所述計算所述摘要語法樹中子樹的哈希值包括根據(jù)所述摘要語法樹的節(jié)點(diǎn)類型信息,計算得到所述節(jié)點(diǎn)的哈希值,并以線性鏈 表格式保存所述節(jié)點(diǎn)包括哈希值在內(nèi)的信息;將所述摘要語法樹中子樹所包括的節(jié)點(diǎn)的哈希值進(jìn)行累加,得到所述子樹的哈希值。優(yōu)選的,上述方法中,所述將所述摘要語法樹中子樹所包括的節(jié)點(diǎn)的哈希值進(jìn)行 累加,得到所述子樹的哈希值包括將除法、減法和取余運(yùn)算操作前后參與運(yùn)算的元素賦予不同的權(quán)值。優(yōu)選的,上述方法中,所述通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈希值是否一致,進(jìn)行 軟件同源性檢測包括根據(jù)所述摘要語法樹中子樹所包括的節(jié)點(diǎn)數(shù)目,將子樹進(jìn)行分組。本發(fā)明實(shí)施例還提供了一種基于摘要語法樹和語義匹配的軟件同源性檢測裝置, 包括生成模塊,用于生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配 相同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算模塊,用于計算所述生成模塊生成的摘要語法樹中子樹的哈希值檢測模塊,用于根據(jù)所述計算模塊計算獲取的所述哈希值,通過判斷節(jié)點(diǎn)數(shù)目相 同的子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。優(yōu)選的,上述裝置中,所述生成模塊包括預(yù)處理單元,用于將所述軟件源代碼中的文件包含指令、注釋和多余的空白符刪 除;查找所述軟件源代碼中被宏定義指令所替換的字符串,并換回原來的字符串;判斷所 述軟件源代碼中的條件編譯指令中的判斷條件是否成立,然后選擇刪除或保留對應(yīng)的軟件 源代碼段;詞法分析單元,用于依次讀入經(jīng)過所述預(yù)處理單元預(yù)處理后的所述軟件源代碼文 本中字符序列,根據(jù)所述軟件源代碼所采用的編程語言語法規(guī)則,采用對應(yīng)的正則表達(dá)式 將所述字符序列與所述編程語言的匹配規(guī)則對應(yīng)后,返回標(biāo)識所述字符序列的標(biāo)記;語法分析單元,用于根據(jù)所述詞法分析單元返回的所述標(biāo)記,將所述標(biāo)記對應(yīng)的 軟件源代碼序列,與所述軟件源代碼所采用的編程語言語法規(guī)則匹配后,開辟內(nèi)存空間,生 成所述軟件源代碼對應(yīng)的摘要語法樹中的節(jié)點(diǎn)信息,構(gòu)建所述摘要語法樹;語義匹配單元,用于分析所述語法分析單元構(gòu)建的所述摘要語法樹的結(jié)構(gòu)信息, 將匹配相同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu)。優(yōu)選的,上述裝置中,所述計算模塊包括節(jié)點(diǎn)計算單元,用于根據(jù)經(jīng)過所述語義匹配單元調(diào)整之后的所述摘要語法樹中的 節(jié)點(diǎn)類型信息,計算得到所述節(jié)點(diǎn)的哈希值;子樹計算單元,用于根據(jù)所述節(jié)點(diǎn)計算單元計算獲取的節(jié)點(diǎn)哈希值,將所述摘要 語法樹中子樹所包括的節(jié)點(diǎn)的哈希值進(jìn)行累加,得到所述子樹的哈希值。優(yōu)選的,上述裝置中,所述檢測模塊包括分組單元,用于根據(jù)所述摘要語法樹中子樹所包括的節(jié)點(diǎn)數(shù)目,將所述子樹進(jìn)行 分組。
由上述本發(fā)明實(shí)施例提供的技術(shù)方案可以看出,本發(fā)明實(shí)施例中,通過生成軟件 源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配相同語義特征規(guī)則且語義相同的子 樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算所述摘要語法樹中子樹的哈希值;通過判斷節(jié)點(diǎn)數(shù)目相同的子樹 的哈希值是否一致,進(jìn)行軟件同源性檢測。從而在語法層次上,結(jié)合語義進(jìn)行準(zhǔn)確而有效的 進(jìn)行軟件同源性檢測。
圖1為本發(fā)明實(shí)施例提供的所述方法具體實(shí)現(xiàn)示意圖一;圖2為本發(fā)明實(shí)施例提供的所述方法具體實(shí)現(xiàn)示意圖二 ;圖3為本發(fā)明實(shí)施例提供的所述方法具體實(shí)現(xiàn)示意圖三;圖4為本發(fā)明實(shí)施例提供的所述裝置具體實(shí)現(xiàn)結(jié)構(gòu)示意圖一圖5為本發(fā)明實(shí)施例提供的所述裝置具體實(shí)現(xiàn)結(jié)構(gòu)示意圖二圖6為本發(fā)明實(shí)施例提供的所述裝置具體實(shí)現(xiàn)結(jié)構(gòu)示意圖三圖7為本發(fā)明實(shí)施例提供的所述裝置具體實(shí)現(xiàn)結(jié)構(gòu)示意圖四,
具體實(shí)施例方式本發(fā)明實(shí)施例提供了一種基于摘要語法樹和語義匹配的軟件同源性檢測方法,如 附圖1所示,包括步驟11,生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配相同語 義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);步驟12,計算所述摘要語法樹中子樹的哈希(Hash)值;步驟13,通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。通過本發(fā)明實(shí)施例提供的基于摘要語法樹和語義匹配的軟件同源性檢測方法的 實(shí)施,可以在語法層次上,結(jié)合語義進(jìn)行準(zhǔn)確而有效的軟件同源性檢測。為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖對本發(fā)明實(shí)施例作 進(jìn)一步的詳細(xì)描述。本發(fā)明實(shí)施例提供的在語法層次進(jìn)行軟件同源性檢測方法,可以充分考慮軟件源 代碼原有的語義,保證了同源性檢測的正確性。而且,全新提出了一種利用軟件源代碼對應(yīng) 樹形結(jié)構(gòu)一摘要語法樹的檢測手段,將軟件源代碼對應(yīng)摘要語法樹中每一個節(jié)點(diǎn)的哈希值 作為軟件同源性檢測的基準(zhǔn),并針對常見的源代碼抄襲手段提出語義特征規(guī)則匹配檢測方 法,將檢測方法提高到了語義層次,從而提高了同源性檢測的準(zhǔn)確性。同時,將相同節(jié)點(diǎn)數(shù) 目的軟件源代碼摘要語法樹件中的子樹分組進(jìn)行對比檢測,避免了不必要的對比,大大提 高了檢測效率。本發(fā)明實(shí)施例提供的基于摘要語法樹和語義匹配的軟件同源性檢測方法的一個 實(shí)施例在具體實(shí)現(xiàn)過程中,具體可如附圖2所示,可以包括以下步驟 步驟21,獲取目標(biāo)軟件和樣本軟件進(jìn)行同源性檢測所需的檢測參數(shù)。本發(fā)明實(shí)施例中,可以將需要作對比檢測的軟件稱之為目標(biāo)軟件,而作為對比樣 本的軟件稱之為樣本軟件??梢岳斫獾氖牵鲜龇Q謂可根據(jù)需要進(jìn)行更改。在本發(fā)明一個具體實(shí)施例中,步驟21具體可以包括以下具體操作過程
6
步驟211,選擇需要檢測的目標(biāo)軟件源代碼和樣本軟件源代碼;此步驟中,如果事先已經(jīng)獲取并存儲有根據(jù)目標(biāo)或樣本軟件源代碼生成的摘要語 法樹的數(shù)據(jù)庫文件,則可以直接調(diào)取對應(yīng)的數(shù)據(jù)庫文件進(jìn)行后續(xù)的對比檢測,無需獲取目 標(biāo)或樣本軟件的源代碼。步驟212,輸入對比閾值。此步驟中,可以根據(jù)需要進(jìn)行對比檢測的目標(biāo)軟件和樣本軟件所采用的C、C++和 Java等等編程語言,輸入對比的閾值。該閾值即對比的精度,比如用戶將閾值確定為5,則 對比時精確到子節(jié)點(diǎn)數(shù)目大于等于5的摘要語法樹中子樹。當(dāng)然,本發(fā)明實(shí)施例中也可以不進(jìn)行對比閾值的選擇操作,直接進(jìn)行對比檢測,或 者事先制定某一固定數(shù)值,作為默認(rèn)對比閾值。步驟213,確定中間文件的保存路徑。此步驟中,可以確定中間文件,具體可以包括經(jīng)過預(yù)處理之后的軟件源代碼、日志 文件和存儲對比結(jié)果的數(shù)據(jù)庫文件等等的保存路徑。并且,本發(fā)明實(shí)施例在具體實(shí)現(xiàn)過程中,可實(shí)時的進(jìn)行記錄保存軟件同源性檢測 過程中的操作信息,比如軟件同源性檢測開始及結(jié)束時間、數(shù)據(jù)庫文件保存路徑等等。需要說明的是,本發(fā)明實(shí)施例在具體實(shí)現(xiàn)過程中,步驟21并不是必須執(zhí)行的,可 作為選擇性或者默認(rèn)流程進(jìn)行操作。步驟22,生成目標(biāo)軟件和樣本軟件源代碼摘要語法樹,并調(diào)整摘要語法樹結(jié)構(gòu)。本發(fā)明實(shí)施例中,可以根據(jù)目標(biāo)或樣本軟件所用編程語言的語法規(guī)則,生成該軟 件源代碼所對應(yīng)的摘要語法樹。由于摘要語法樹中記錄了該軟件源代碼的語法結(jié)構(gòu)和每一 個代碼片段在軟件源代碼中的具體位置,因此生成摘要語法樹文件是進(jìn)行軟件同源性檢測 時所需要的重要而有效的數(shù)據(jù)。在生成摘要語法樹后,分析該摘要語法樹,通過與語義特征 規(guī)則匹配,調(diào)整摘要語法樹結(jié)構(gòu),將符合相同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一 結(jié)構(gòu)。步驟22具體實(shí)現(xiàn)過程可如附圖3所示,具體可以包括步驟221,對軟件源代碼進(jìn)行預(yù)處理。對軟件源代碼進(jìn)行預(yù)處理,可以將所有軟件源代碼(包括目標(biāo)和樣本軟件源代 碼)統(tǒng)一為同一個規(guī)范格式。對軟件源代碼進(jìn)行預(yù)處理,具體可以包括對軟件源代碼中的文件包含指令、宏定 義指令、條件編譯指令、注釋和多余的空白符進(jìn)行相應(yīng)的處理。其中對文件包含指令、注釋 和多余的空白符采取的處理方式是直接刪除;對宏定義指令的處理是查找軟件源代碼中被 宏定義所替換的字符串,并換回原來的字符串;對條件編譯指令的處理是判斷條件編譯指 令中的判斷條件是否成立,然后選擇該刪除的代碼段和該保留的代碼段。在本發(fā)明一個具體實(shí)施例中,步驟221具體可以包括以下步驟步驟2211,刪除軟件源代碼中多余的空白符和換行符;步驟2212,對軟件源代碼中的續(xù)行符進(jìn)行處理,將分為兩行編寫的代碼接續(xù)到同 一行;步驟2213,將軟件源代碼中的注釋刪除,只留下有意義的代碼段;步驟2214,找到軟件源代碼中的文件包含命令“iiinclude”,直接將其刪除;
7
步驟2215,找到軟件源代碼中的條件編譯指令,判斷條件是否成立,正確保留或者 刪除所包括的代碼段。需要說明的是,上述步驟2211至步驟2215的執(zhí)行可以沒有先后順序。本發(fā)明實(shí)施例提供的基于摘要語法樹和語義匹配的軟件同源性檢測方法,在對軟 件源代碼進(jìn)行預(yù)處理時,完全考慮了其語義,比如軟件源代碼中“typedeffloat FL”語句的 處理就是將軟件源代碼中的所有“FL”替換為“float”,再比如軟件源代碼中條件編譯語句 “#ifdef”的處理則是判斷其條件是否成立,然后對應(yīng)的保留應(yīng)該保留的語句。因此,本發(fā)明 實(shí)施例提供的基于摘要語法樹和語義匹配的軟件同源性檢測方法,可以完全按照語義對軟 件源代碼進(jìn)行預(yù)處理,在最大程度上保持軟件同源性檢測的準(zhǔn)確性。步驟222,對完成預(yù)處理的軟件源代碼進(jìn)行詞法分析。具體的,可以依次讀入經(jīng)過預(yù)處理的軟件源代碼文本中字符序列,然后根據(jù)該軟 件源代碼所采用的編程語言,比如C、C++和Java等等編程語言,采用對應(yīng)的正則表達(dá)式將 特定的字符序列與該編程語言的匹配規(guī)則對應(yīng)后,返回標(biāo)識此字符序列的標(biāo)記(Token,用 來標(biāo)識某一類字符序列的特定字符串)。步驟223,對詞法分析后的軟件源代碼進(jìn)行語法分析,生成摘要語法樹。具體的,當(dāng)步驟222中產(chǎn)生的帶有標(biāo)記Token的軟件源代碼序列,與該軟件源代碼 所采用的編程語言的語法規(guī)則匹配后(比如函數(shù)定義規(guī)則等特定的規(guī)則),就開辟內(nèi)存空 間,生成一個節(jié)點(diǎn),并在此節(jié)點(diǎn)中記錄此時對應(yīng)的節(jié)點(diǎn)類型,以及該節(jié)點(diǎn)對應(yīng)于軟件源代碼 中的位置信息。在生成軟件源代碼所有節(jié)點(diǎn)后,就生成了軟件源代碼所對應(yīng)的摘要語法樹。需要說明的是,如果步驟222分析得到的某一個軟件源代碼的標(biāo)記Token序列,在 步驟223中沒有任何語法規(guī)則可以匹配,則將其所在的語句片段刪除之后,得到新的軟件 源代碼,繼續(xù)步驟222,直到正確生成軟件源代碼對應(yīng)的摘要語法樹。步驟224,根據(jù)語義特征規(guī)則調(diào)整摘要語法樹結(jié)構(gòu)。本發(fā)明實(shí)施例針對if-else語句、while語句等C、C++和Java語言中常見的源代 碼語句,可以摘要出一些對應(yīng)的摘要語法樹的語義特征規(guī)則,例如條件表達(dá)式為比較表達(dá) 式、變量標(biāo)識(ID)、函數(shù)調(diào)用等等。然后遍歷分析軟件源代碼對應(yīng)的摘要語法樹,查找符合 這些語義特征規(guī)則的子樹。比如if-else語句結(jié)構(gòu)的特征是以if類型的節(jié)點(diǎn)作為根節(jié)點(diǎn), 它的第一個子節(jié)點(diǎn)為條件類型的節(jié)點(diǎn),第二個子節(jié)點(diǎn)為else類型的節(jié)點(diǎn)。摘要語法樹中所存儲的軟件源代碼語法結(jié)構(gòu)信息中包含著一定的語義信息,通過 對摘要語法樹中的語義信息進(jìn)行摘要和匹配,可以得到符合相同語義特征規(guī)則但結(jié)構(gòu)不同 的子樹,即這些子樹對應(yīng)的源代碼語法結(jié)構(gòu)不同但具有相同的語義。將匹配相同的語義特征規(guī)則的子樹進(jìn)行結(jié)構(gòu)調(diào)整,即把匹配相同語義規(guī)則的子樹 調(diào)整為統(tǒng)一的結(jié)構(gòu),使符合相同語義特征規(guī)則且語義相同的子樹具有相同的結(jié)構(gòu),從而使 語法結(jié)構(gòu)不同但語義相同的語句統(tǒng)一為語法結(jié)構(gòu)相同的語句。具體調(diào)整可如下舉例當(dāng)匹配if語句的條件表達(dá)式的開始含有“ !”(取反)的規(guī)則時,將“!”忽略并 將if節(jié)點(diǎn)的第二個子樹和else節(jié)點(diǎn)的子樹對換,由于在計算哈希值時采用由下向上累加 的方式,子樹對換不影響最終的哈希值,因此子樹對換的操作可以忽略;當(dāng)匹配if語句的 條件表達(dá)式是比較表達(dá)式的規(guī)則時,判斷條件比較符號的兩端如果是變量名或函數(shù)調(diào)用,就把比較符號統(tǒng)一為“< ”,如果是變量名和數(shù)字,那么將變量名調(diào)整到比較符號前面再進(jìn) 行調(diào)整。通過該步驟的處理,本發(fā)明實(shí)施例提供的所述方法,可以將語法層次上的軟件源 代碼同源性檢測提升為語法結(jié)合語義層次的源代碼同源性檢測,能夠準(zhǔn)確將同義但結(jié)構(gòu)不 同的軟件源代碼抄襲準(zhǔn)確的檢測出來,顯著提高了軟件同源性檢測的效率。步驟225,將調(diào)整后的摘要語法樹進(jìn)行存儲格式轉(zhuǎn)換并儲存。為了方便摘要語法樹相關(guān)信息的存儲和調(diào)取,本發(fā)明實(shí)施例可以在生成及調(diào)整之 后,將摘要語法樹轉(zhuǎn)換為線性鏈表結(jié)構(gòu)并進(jìn)行存儲。步驟23,計算摘要語法樹中子樹的哈希值。步驟23具體實(shí)現(xiàn)過程可以包括步驟231,計算節(jié)點(diǎn)哈希值。在生成軟件源代碼對應(yīng)的摘要語法樹后,可以根據(jù)摘要語法樹中每一個節(jié)點(diǎn)的類 型計算得到每一個節(jié)點(diǎn)的哈希值。該步驟中,還可以以線性鏈表格式保存節(jié)點(diǎn)包括哈希值在內(nèi)的信息。步驟232,計算子樹哈希值。將該摘要語法樹中每一個子樹所包括的所有節(jié)點(diǎn)的哈希值進(jìn)行累加,得到摘要語 法樹中每一個子樹的哈希值。計算摘要語法樹中子樹的哈希值的好處在于,在后續(xù)同源性檢測時,可以有效的 檢測出打亂軟件源代碼順序的抄襲手段。在對從軟件源代碼生成的摘要語法樹進(jìn)行哈希計算時,由于采用累加的方式計算 子樹的哈希值,可能會產(chǎn)生一些誤檢的情況,這些情況都是跟一些特殊的運(yùn)算操作有關(guān),比 如除法、減法和取余等等,如果在這些運(yùn)算操作前后參與運(yùn)算的元素調(diào)換位置的話,整個運(yùn) 算操作的意義就發(fā)生了改變,為了避免將這種情況錯誤的檢測為相似代碼,本發(fā)明實(shí)施例 提供的基于摘要語法樹和語義匹配的軟件同源性檢測方法,對這類特殊的運(yùn)算操作設(shè)計了 特殊的哈希計算方式,在計算這類特殊運(yùn)算操作的哈希值時加入了權(quán)值的概念,將這類特 殊運(yùn)算操作前后參與運(yùn)算的元素賦予不同的權(quán)值,這樣如果調(diào)換前后參與運(yùn)算的元素的位 置,整個運(yùn)算操作的哈希值就會改變,而不會錯誤的將其識別為相似代碼,避免了一些將不 同的代碼誤報為抄襲代碼的情況,降低了誤報率。步驟24,進(jìn)行軟件同源性檢測。根據(jù)步驟23中生成的目標(biāo)軟件源代碼對應(yīng)的摘要語法樹相關(guān)信息,以及樣本軟 件源代碼對應(yīng)的摘要語法樹相關(guān)信息,通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈希值是否一致, 進(jìn)行軟件同源性檢測。從而獲取目標(biāo)軟件和樣本軟件的同源性,即相似度的相關(guān)信息,近而 可以判定目標(biāo)軟件是否進(jìn)行了抄襲。在進(jìn)行同源性檢測之前,為了提高檢測效率和準(zhǔn)確性,可以按照軟件源代碼對應(yīng) 的摘要語法樹中,各個子樹的子節(jié)點(diǎn)數(shù)目,將各個子樹進(jìn)行分組,將線性鏈表結(jié)構(gòu)中存儲的 摘要語法樹轉(zhuǎn)存到數(shù)組鏈表中,保證有著相同子節(jié)點(diǎn)數(shù)目的子樹存放到同一個數(shù)組下標(biāo)對 應(yīng)的鏈表中,比如摘要語法樹中都有著6個子節(jié)點(diǎn)的子樹都會存入到數(shù)組的第6個元素所 存儲的鏈表中。在同源性檢測時,由于已經(jīng)將摘要語法樹相關(guān)信息轉(zhuǎn)換了存儲格式,即數(shù)組鏈表格式,因此,在進(jìn)行同源性檢測時可以根據(jù)兩個數(shù)組鏈表記錄的摘要語法樹所有節(jié)點(diǎn)信息, 進(jìn)行逐節(jié)點(diǎn)遍歷對比檢測。比如,可先從目標(biāo)軟件源代碼數(shù)組元素為1(即子樹包含一個 節(jié)點(diǎn))的數(shù)組中選取某一個子樹,與樣本軟件源代碼數(shù)組元素為1的數(shù)組中的所有子樹逐 一進(jìn)行哈希值比較,通過判斷子樹的哈希值是否一致,以確定是否存在相似源代碼;然后再 從目標(biāo)軟件源代碼數(shù)組元素為1的數(shù)組中,選取另一個子樹,再與樣本軟件源代碼數(shù)組元 素為1的數(shù)組中的所有子樹逐一進(jìn)行哈希值比較。以此類推,直至將目標(biāo)軟件和樣本軟件 源代碼的所有數(shù)組全部完成檢測,從而確定目標(biāo)軟件與樣本軟件源代碼的是否為同源性軟 件。如果目標(biāo)軟件和樣本軟件為非同源性軟件,還可以根據(jù)對比結(jié)果中哈希值相同所 占得比例,確定目標(biāo)軟件和樣本軟件的相似度。由于本發(fā)明實(shí)施例在進(jìn)行同源性檢測之前,按子節(jié)點(diǎn)數(shù)目對摘要語法樹中的子樹 進(jìn)行分組,因此避免了不必要的對比檢測,大大提高了同源性檢測的效率。而且,本發(fā)明實(shí) 施例在進(jìn)行同源性檢測時,采用的是逐節(jié)點(diǎn)遍歷對比檢測方法,即不僅僅是對數(shù)據(jù)結(jié)構(gòu)進(jìn) 行對比檢測,還深入到數(shù)據(jù)結(jié)構(gòu)內(nèi)部進(jìn)行對比檢測。因此,即使數(shù)據(jù)結(jié)構(gòu)不一樣,本發(fā)明實(shí) 施例也能找出其內(nèi)部的抄襲代碼。另外,本發(fā)明實(shí)施例還可以根據(jù)步驟212設(shè)定對比閾值,精確到需要檢測的精度。步驟25,存儲以及輸出同源性檢測結(jié)果。對于同源性檢測結(jié)果,本發(fā)明實(shí)施例可以進(jìn)行存儲,進(jìn)一步還可以根據(jù)需要進(jìn)行 輸出,比如將同源性檢測結(jié)果輸出至Word和Excel文件中。通過上述描述可以看出,本發(fā)明實(shí)施例提供的基于摘要語法樹和語義匹配的軟件 同源性檢測方法,通過生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配相 同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算所述摘要語法樹中子樹的哈希 值;通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。從而在語法層 次上,結(jié)合語義進(jìn)行準(zhǔn)確而有效的進(jìn)行軟件同源性檢測。而且,在本發(fā)明實(shí)施例在對軟件源代碼進(jìn)行預(yù)處理時,完全考慮了軟件源代碼原 有的語義,因此可以在最大程度上保持同源性對比的準(zhǔn)確性。而且,本發(fā)明實(shí)施例計算摘要語法樹節(jié)點(diǎn)哈希值后,對一些特殊的運(yùn)算進(jìn)行了特 殊的處理,比如在對減法、除法等等操作進(jìn)行哈希值計算時,給其前后參與運(yùn)算的元素賦予 不同的權(quán)值,避免了一些將不同的代碼誤報為抄襲代碼的情況,降低了誤報率。而且,本發(fā)明實(shí)施例在生成軟件源代碼摘要語法樹后,將摘要語法樹轉(zhuǎn)換為線性 鏈表結(jié)構(gòu),方便摘要語法樹的存儲和取出。而且,本發(fā)明實(shí)施例在進(jìn)行軟件同源性檢測之前,按節(jié)點(diǎn)數(shù)目對摘要語法樹中的 子樹進(jìn)行分組,避免了不必要的對比檢測,大大提高了對比檢測的效率。而且,本發(fā)明實(shí)施例在進(jìn)行軟件同源性檢測時,采用逐節(jié)點(diǎn)遍歷對比的方法,即不 僅僅是對數(shù)據(jù)結(jié)構(gòu)進(jìn)行對比,還深入到數(shù)據(jù)結(jié)構(gòu)內(nèi)部進(jìn)行對比,因此即使數(shù)據(jù)結(jié)構(gòu)不一樣, 也能找出其內(nèi)部的抄襲代碼,并且還可以改變輸入的對比閾值來調(diào)整對比的精度。而且,本發(fā)明實(shí)施例還可以實(shí)時的保存軟件同源性檢測過程中的信息,以及檢測 結(jié)果,為后續(xù)再次進(jìn)行該軟件同源性檢測提高了方便,大大的提高了實(shí)際工作的效率?;谏鲜鲲@著的技術(shù)特征可以看出,本發(fā)明實(shí)施例提供的基于摘要語法樹和語義匹配的軟件同源性檢測方法可以應(yīng)對多種源代碼抄襲手段,可以方便、高效、準(zhǔn)確的進(jìn)行軟 件同源性檢測。本發(fā)明實(shí)施例提供了一種基于摘要語法樹和語義匹配的軟件同源性檢測裝置,如 附圖4所示,該裝置具體可以包括生成模塊41,計算模塊42,檢測模塊43。其中生成模塊41,用于生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹 配相同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算模塊42,用于計算所述生成模塊41生成的摘要語法樹中子樹的哈希值;檢測模塊43,用于根據(jù)所述計算模塊42計算獲取的所述哈希值,通過判斷節(jié)點(diǎn)數(shù) 目相同的子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。在本發(fā)明實(shí)的一個具體實(shí)施例中,可選的,生成模塊41如附圖5所示,具體可以包 括預(yù)處理單元411,用于將軟件源代碼中的文件包含指令、注釋和多余的空白符刪 除;查找軟件源代碼中被宏定義指令所替換的字符串,并換回原來的字符串;判斷軟件源 代碼中的條件編譯指令中的判斷條件是否成立,然后選擇刪除或保留對應(yīng)的軟件源代碼 段。預(yù)處理單元411的具體操作過程,可以包括刪除軟件源代碼中多余的空白符和換行符;對軟件源代碼中的續(xù)行符進(jìn)行處理,將分為兩行編寫的代碼接續(xù)到同一行;將軟件源代碼中的注釋刪除,只留下有意義的代碼段;找到軟件源代碼中的文件包含命令“iiinclude”,直接將其刪除;找到軟件源代碼中的條件編譯指令,判斷條件是否成立,正確保留或者刪除所包 括的代碼段。詞法分析單元412,用于依次讀入經(jīng)過預(yù)處理單元411預(yù)處理后的軟件源代碼文 本中字符序列,根據(jù)軟件源代碼所采用的編程語言語法規(guī)則,采用對應(yīng)的正則表達(dá)式將該 字符序列與編程語言的匹配規(guī)則對應(yīng)后,返回標(biāo)識該字符序列的標(biāo)記。語法分析單元413,用于根據(jù)詞法分析單元412返回的標(biāo)記,將該標(biāo)記對應(yīng)的軟件 源代碼序列,與軟件源代碼所采用的編程語言語法規(guī)則匹配后,開辟內(nèi)存空間,生成軟件源 代碼對應(yīng)的摘要語法樹的節(jié)點(diǎn)信息,構(gòu)建摘要語法樹。語法分析單元413具體可以將帶有詞法分析單元412產(chǎn)生的標(biāo)記Token的軟件源 代碼序列,與該軟件源代碼所采用的編程語言的語法規(guī)則匹配后(比如函數(shù)定義規(guī)則等特 定的規(guī)則),開辟內(nèi)存空間,生成一個摘要語法樹節(jié)點(diǎn),并在此節(jié)點(diǎn)中記錄此時對應(yīng)的節(jié)點(diǎn) 類型,以及該節(jié)點(diǎn)對應(yīng)于軟件源代碼中的位置信息。在生成軟件源代碼所有節(jié)點(diǎn)后,就生成 了軟件源代碼所對應(yīng)的摘要語法樹。語義匹配單元414,用于分析所述語法分析單元413構(gòu)建的摘要語法樹的結(jié)構(gòu)信 息,將匹配相同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu)。語義匹配單元414具體可以使用深度遍歷的方式遍歷整棵摘要語法樹,分析摘要 語法樹的結(jié)構(gòu)信息。if-else和while語句對應(yīng)的摘要語法樹結(jié)構(gòu)符合一定的語義規(guī)則,通 過匹配這些語義規(guī)則,可以查找具有一定特征的if-else語句和while語句,例如條件表達(dá) 式為比較表達(dá)式、變量ID、函數(shù)調(diào)用等等。對于匹配一定語義規(guī)則的語義相同if-else和
11while語句的條件表達(dá)式,將其對應(yīng)的摘要語法樹整理為統(tǒng)一的結(jié)構(gòu),即具有相同語義的語 句具有相同的摘要語法樹結(jié)構(gòu),從而可以檢測出語法結(jié)構(gòu)修改卻有相同語義的if-else和 while等語句。通過生成模塊41,尤其是語義匹配單元414的具體操作,本發(fā)明實(shí)施例提供的裝 置,可以將語法層次上的軟件源代碼同源性檢測提升為語法結(jié)合語義層次的源代碼同源性 檢測,能夠準(zhǔn)確將同義但結(jié)構(gòu)不同的軟件源代碼抄襲準(zhǔn)確的檢測出來,顯著提高了軟件同 源性檢測的效率。在本發(fā)明實(shí)的一個具體實(shí)施例中,可選的,計算模塊42如附圖6所示,具體可以包 括節(jié)點(diǎn)計算單元421,用于根據(jù)經(jīng)過語義匹配單元414調(diào)整之后的摘要語法樹中的 節(jié)點(diǎn)類型信息,計算得到摘要語法樹中節(jié)點(diǎn)的哈希值。子樹計算單元422,用于根據(jù)節(jié)點(diǎn)計算421單元計算獲取的節(jié)點(diǎn)哈希值,將摘要語 法樹中子樹所包括的節(jié)點(diǎn)的哈希值進(jìn)行累加,得到子樹的哈希值。在對從軟件源代碼生成的摘要語法樹進(jìn)行哈希計算時,由于采用累加的方式計算 子樹的哈希值,可能會產(chǎn)生一些誤檢的情況,這些情況都是跟一些特殊的運(yùn)算操作有關(guān),比 如除法、減法和取余等等,如果在這些運(yùn)算操作前后參與運(yùn)算的元素調(diào)換位置的話,整個運(yùn) 算操作的意義就發(fā)生了改變,為了避免將這種情況錯誤的檢測為相似代碼,本發(fā)明實(shí)施例 提供的基于摘要語法樹和語義匹配的軟件同源性檢測裝置,對這類特殊的運(yùn)算操作設(shè)計了 特殊的哈希計算方式,在計算這類特殊運(yùn)算操作的哈希值時加入了權(quán)值的概念,將這類特 殊運(yùn)算操作前后參與運(yùn)算的元素賦予不同的權(quán)值,這樣如果調(diào)換前后參與運(yùn)算的元素的位 置,整個運(yùn)算操作的哈希值就會改變,而不會錯誤的將其識別為相似代碼,避免了一些將不 同的代碼誤報為抄襲代碼的情況,降低了誤報率。通過計算模塊42的具體操作,本發(fā)明實(shí)施例提供的裝置,可以有效的檢測出打亂 軟件源代碼順序的抄襲手段。在本發(fā)明實(shí)的一個具體實(shí)施例中,可選的,檢測模塊43具體可以包括分組單元431,用于根據(jù)摘要語法樹中子樹所包括的節(jié)點(diǎn)數(shù)目,將子樹進(jìn)行分組。具體的,為了提高檢測效率和準(zhǔn)確性,分組單元具體可以按照軟件源代碼對應(yīng)的 摘要語法樹中,各個子樹的子節(jié)點(diǎn)數(shù)目,將各個子樹進(jìn)行分組,將線性鏈表結(jié)構(gòu)中存儲的摘 要語法樹轉(zhuǎn)存到數(shù)組鏈表中,保證有著相同子節(jié)點(diǎn)數(shù)目的子樹存放到同一個數(shù)組下標(biāo)對應(yīng) 的鏈表中,比如摘要語法樹中都有著6個子節(jié)點(diǎn)的子樹都會存入到數(shù)組的第6個元素所存 儲的鏈表中。在同源性檢測時,由于已經(jīng)將摘要語法樹相關(guān)信息轉(zhuǎn)換了存儲格式,即數(shù)組鏈表 格式,因此,在進(jìn)行同源性檢測時可以根據(jù)數(shù)組鏈表記錄的摘要語法樹所有節(jié)點(diǎn)信息,進(jìn)行 逐節(jié)點(diǎn)遍歷對比檢測。比如,可先從A軟件源代碼數(shù)組元素為1(即子樹包含一個節(jié)點(diǎn))的 數(shù)組中選取某一個子樹,與B軟件源代碼數(shù)組元素為1的數(shù)組中的所有子樹逐一進(jìn)行哈希 值比較,通過判斷子樹的哈希值是否一致,以確定是否存在相似源代碼;然后再從A軟件源 代碼數(shù)組元素為1的數(shù)組中,選取另一個子樹,再與B軟件源代碼數(shù)組元素為1的數(shù)組中的 所有子樹逐一進(jìn)行哈希值比較。以此類推,直至將A軟件和B軟件源代碼的所有數(shù)組全部 完成檢測,從而確定A軟件與B軟件源代碼的是否為同源性軟件。如果軟件為非同源性軟件,還可以根據(jù)對比結(jié)果中哈希值相同所占得比例,確定各個軟件的相似度。由于本發(fā)明實(shí)施例在進(jìn)行同源性檢測之前,按子節(jié)點(diǎn)數(shù)目對摘要語法樹中的子樹 進(jìn)行分組,因此避免了不必要的對比檢測,大大提高了同源性檢測的效率。而且,本發(fā)明實(shí) 施例在進(jìn)行同源性檢測時,采用的是逐節(jié)點(diǎn)遍歷對比檢測方法,即不僅僅是對數(shù)據(jù)結(jié)構(gòu)進(jìn) 行對比檢測,還深入到數(shù)據(jù)結(jié)構(gòu)內(nèi)部進(jìn)行對比檢測。因此,即使數(shù)據(jù)結(jié)構(gòu)不一樣,本發(fā)明實(shí) 施例也能找出其內(nèi)部的抄襲代碼。在本發(fā)明實(shí)的一個具體實(shí)施例中,可選的,基于摘要語法樹和語義匹配的軟件同 源性檢測裝置如附圖7所示,具體還可以包括數(shù)據(jù)庫模塊44,用于實(shí)時保存軟件同源性檢測過程中的信息。具體的,數(shù)據(jù)庫模塊43可以保存生成模塊41輸出地摘要語法樹信息,并將摘要語 法樹信息轉(zhuǎn)換為線性鏈表進(jìn)行保存。另外,數(shù)據(jù)庫模塊44還可以實(shí)時保存計算模塊42以 及檢測模塊43所輸出的信息。等等。輸出模塊45,用于輸出檢測模塊43的檢測結(jié)果。對于同源性檢測結(jié)果,本發(fā)明實(shí)施例可以進(jìn)行存儲,進(jìn)一步還可以根據(jù)需要進(jìn)行 輸出,比如將同源性檢測結(jié)果輸出至Word和Excel文件中。本發(fā)明實(shí)施例提供的基于摘要語法樹和語義匹配的軟件同源性檢測裝置在進(jìn)行 軟件同源性檢測之前,還可以設(shè)定同源性檢測時的對比閾值,以及檢測信息的保存路徑。通過上述描述可以看出,本發(fā)明實(shí)施例提供的基于摘要語法樹和語義匹配的軟件 同源性檢測裝置,通過生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配相 同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算所述摘要語法樹中子樹的哈希 值;通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。從而在語法層 次上,結(jié)合語義進(jìn)行準(zhǔn)確而有效的進(jìn)行軟件同源性檢測。而且,在本發(fā)明實(shí)施例在對軟件源代碼進(jìn)行預(yù)處理時,完全考慮了軟件源代碼原 有的語義,因此可以在最大程度上保持同源性對比的準(zhǔn)確性。而且,本發(fā)明實(shí)施例計算摘要語法樹節(jié)點(diǎn)哈希值后,對一些特殊的運(yùn)算進(jìn)行了特 殊的處理,比如在對減法、除法等等操作進(jìn)行哈希值計算時,給其前后參與運(yùn)算的元素賦予 不同的權(quán)值,避免了一些將不同的代碼誤報為抄襲代碼的情況,降低了誤報率。而且,本發(fā)明實(shí)施例在生成軟件源代碼摘要語法樹后,將摘要語法樹轉(zhuǎn)換為線性 鏈表結(jié)構(gòu),方便摘要語法樹的存儲和取出。而且,本發(fā)明實(shí)施例在進(jìn)行軟件同源性檢測之前,按節(jié)點(diǎn)數(shù)目對摘要語法樹中的 子樹進(jìn)行分組,避免了不必要的對比,大大提高了對比的效率。而且,本發(fā)明實(shí)施例在進(jìn)行軟件同源性檢測時,采用逐節(jié)點(diǎn)遍歷對比的方法,即不 僅僅是對數(shù)據(jù)結(jié)構(gòu)進(jìn)行對比,還深入到數(shù)據(jù)結(jié)構(gòu)內(nèi)部進(jìn)行對比,因此即使數(shù)據(jù)結(jié)構(gòu)不一樣, 也能找出其內(nèi)部的抄襲代碼,并且還可以改變輸入的對比閾值來調(diào)整對比的精度。而且,本發(fā)明實(shí)施例還可以實(shí)時的保存軟件同源性檢測過程中的信息,以及檢測 結(jié)果,為后續(xù)再次進(jìn)行該軟件同源性檢測提高了方便,大大的提高了實(shí)際工作的效率?;谏鲜鲲@著的技術(shù)特征可以看出,本發(fā)明實(shí)施例提供的基于摘要語法樹和語義 匹配的軟件同源性檢測裝置可以應(yīng)對多種源代碼抄襲手段,可以方便、高效、準(zhǔn)確的進(jìn)行軟 件同源性檢測。
通過以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借 助軟件加必需的硬件平臺的方式來實(shí)現(xiàn),當(dāng)然也可以全部通過硬件來實(shí)施,但很多情況下 前者是更佳的實(shí)施方式。基于這樣的理解,本發(fā)明的技術(shù)方案對背景技術(shù)做出貢獻(xiàn)的全部 或者部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機(jī)軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如 ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機(jī)設(shè)備(可以是個人計算機(jī),服務(wù) 器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實(shí)施例或者實(shí)施例的某些部分所述的方法。以上所述,僅為本發(fā)明較佳的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍并不局限于此, 任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換, 都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求的保護(hù)范圍 為準(zhǔn)。
權(quán)利要求
一種基于摘要語法樹和語義匹配的軟件同源性檢測方法,其特征在于,包括生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配相同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算所述摘要語法樹中子樹的哈希值;通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述生成軟件源代碼對應(yīng)的摘要語法樹 包括將所述軟件源代碼中的文件包含指令、注釋和多余的空白符刪除;查找所述軟件源代 碼中被宏定義指令所替換的字符串,并換回原來的字符串;判斷所述軟件源代碼中的條件 編譯指令中的判斷條件是否成立,然后選擇刪除或保留對應(yīng)的軟件源代碼段。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述語義特征規(guī)則至少為下列特征中的 一種條件表達(dá)式為比較表達(dá)式、變量標(biāo)識、函數(shù)調(diào)用。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述計算所述摘要語法樹中子樹的哈希 值包括根據(jù)所述摘要語法樹的節(jié)點(diǎn)類型信息,計算得到所述節(jié)點(diǎn)的哈希值,并以線性鏈表格 式保存所述節(jié)點(diǎn)包括哈希值在內(nèi)的信息;將所述摘要語法樹中子樹所包括的節(jié)點(diǎn)的哈希值進(jìn)行累加,得到所述子樹的哈希值。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述將所述摘要語法樹中子樹所包括的 節(jié)點(diǎn)的哈希值進(jìn)行累加,得到所述子樹的哈希值包括將除法、減法和取余運(yùn)算操作前后參與運(yùn)算的元素賦予不同的權(quán)值。
6.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈 希值是否一致,進(jìn)行軟件同源性檢測包括根據(jù)所述摘要語法樹中子樹所包括的節(jié)點(diǎn)數(shù)目,將子樹進(jìn)行分組。
7.一種基于摘要語法樹和語義匹配的軟件同源性檢測裝置,其特征在于,包括生成模塊,用于生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配相同 語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算模塊,用于計算所述生成模塊生成的摘要語法樹中子樹的哈希值;檢測模塊,用于根據(jù)所述計算模塊計算獲取的所述哈希值,通過判斷節(jié)點(diǎn)數(shù)目相同的 子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。
8.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述生成模塊包括預(yù)處理單元,用于將所述軟件源代碼中的文件包含指令、注釋和多余的空白符刪除;查 找所述軟件源代碼中被宏定義指令所替換的字符串,并換回原來的字符串;判斷所述軟件 源代碼中的條件編譯指令中的判斷條件是否成立,然后選擇刪除或保留對應(yīng)的軟件源代碼 段;詞法分析單元,用于依次讀入經(jīng)過所述預(yù)處理單元預(yù)處理后的所述軟件源代碼文本中 字符序列,根據(jù)所述軟件源代碼所采用的編程語言語法規(guī)則,采用對應(yīng)的正則表達(dá)式將所 述字符序列與所述編程語言的匹配規(guī)則對應(yīng)后,返回標(biāo)識所述字符序列的標(biāo)記;語法分析單元,用于根據(jù)所述詞法分析單元返回的所述標(biāo)記,將所述標(biāo)記對應(yīng)的軟件 源代碼序列,與所述軟件源代碼所采用的編程語言語法規(guī)則匹配后,開辟內(nèi)存空間,生成所述軟件源代碼對應(yīng)的摘要語法樹中的節(jié)點(diǎn)信息,構(gòu)建所述摘要語法樹;語義匹配單元,用于分析所述語法分析單元構(gòu)建的所述摘要語法樹的結(jié)構(gòu)信息,將匹 配相同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu)。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述計算模塊包括節(jié)點(diǎn)計算單元,用于根據(jù)經(jīng)過所述語義匹配單元調(diào)整之后的所述摘要語法樹中的節(jié)點(diǎn) 類型信息,計算得到所述節(jié)點(diǎn)的哈希值;子樹計算單元,用于根據(jù)所述節(jié)點(diǎn)計算單元計算獲取的節(jié)點(diǎn)哈希值,將所述摘要語法 樹中子樹所包括的節(jié)點(diǎn)的哈希值進(jìn)行累加,得到所述子樹的哈希值。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述檢測模塊包括分組單元,用于根據(jù)所述摘要語法樹中子樹所包括的節(jié)點(diǎn)數(shù)目,將所述子樹進(jìn)行分組。
全文摘要
本發(fā)明涉及一種基于摘要語法樹和語義匹配的軟件同源性檢測方法及裝置,通過生成軟件源代碼對應(yīng)的摘要語法樹,并將所述摘要語法樹中匹配相同語義特征規(guī)則且語義相同的子樹調(diào)整為統(tǒng)一結(jié)構(gòu);計算所述摘要語法樹中子樹的哈希值;通過判斷節(jié)點(diǎn)數(shù)目相同的子樹的哈希值是否一致,進(jìn)行軟件同源性檢測。從而在語法層次上,結(jié)合語義進(jìn)行準(zhǔn)確而有效的軟件同源性檢測。
文檔編號G06F21/00GK101894236SQ201010238409
公開日2010年11月24日 申請日期2010年7月28日 優(yōu)先權(quán)日2010年7月28日
發(fā)明者吳世忠, 崔寶江, 郭濤 申請人:北京華夏信安科技有限公司;中國信息安全測評中心