王曙燕,趙鵬飛,孫家澤
(西安郵電大學(xué) 計(jì)算機(jī)學(xué)院,西安 710121)
隨著計(jì)算機(jī)技術(shù)及計(jì)算機(jī)網(wǎng)絡(luò)的迅猛發(fā)展,軟件已經(jīng)成為日常生活中不可或缺的一部分,它不僅為生活帶來了極大的便利而且為社會(huì)帶來了數(shù)以億萬記的經(jīng)濟(jì)效益。然而軟件作為一種數(shù)字產(chǎn)品在有著傳輸便利性的同時(shí)也為其版權(quán)保護(hù)帶來了相當(dāng)?shù)碾y度,許多別有用心的人可以輕易地在網(wǎng)絡(luò)上獲得目標(biāo)軟件并且通過一些技術(shù)手段來將其破解并且以低廉的價(jià)格再發(fā)行出去,為軟件的開發(fā)者帶來重大損失。
程序胎記(BirthMark)這一概念較早是在由劍橋大學(xué)出版社出版的《程序識(shí)別》[1]一書中提到的。軟件胎記之所以被稱為“胎記”,是指在程序中一些“與生俱來”的東西,即使經(jīng)過了軟件混淆或加密也會(huì)保持不變的東西。
而靜態(tài)軟件胎記提取技術(shù)與其他軟件抄襲檢測(cè)和軟件保護(hù)技術(shù)相比主要有以下兩點(diǎn)優(yōu)勢(shì):第一,其技術(shù)主要是對(duì)源碼或中間碼進(jìn)行分析而無需額外插入任何代碼,減少人為插入代碼導(dǎo)致程序被惡意分析的可能性;第二,與動(dòng)態(tài)提取軟件胎記技術(shù)相比,這種方法可以更全面地覆蓋軟件的執(zhí)行路徑,而動(dòng)態(tài)執(zhí)行通常只能覆蓋軟件的一部分執(zhí)行路徑,增強(qiáng)了胎記的可信度,并且若軟件需要頻繁交互,提取動(dòng)態(tài)胎記所花費(fèi)的時(shí)間與用戶體驗(yàn)代價(jià)要比靜態(tài)胎記大得多。這兩方面的優(yōu)勢(shì)使靜態(tài)軟件胎記技術(shù)在盜版檢測(cè)、代碼抄襲等方面更具有實(shí)用性。
通過程序胎記進(jìn)行抄襲檢測(cè)主要可分為兩個(gè)步驟:第一步從程序中提取某些特征形成胎記;第二步通過比較兩個(gè)胎記來確定程序之間是否存在抄襲行為。文獻(xiàn)[2]提出了一種使用k-gram算法得到軟件胎記的算法,這種算法使用軟件的指令序列作為胎記提取的特征,首先提取Java程序中的字節(jié)碼指令序列,隨后使用k-gram算法對(duì)字節(jié)碼指令序列進(jìn)行分割形成胎記,通過對(duì)這種胎記的對(duì)比來確定兩軟件之間是否存在抄襲行為;文獻(xiàn)[3]研究了利用程序的應(yīng)用程序接口(Application Programming Interface, API)生成軟件胎記,通過提取不同層級(jí)包、類、方法的API調(diào)用形成API調(diào)用流圖和調(diào)用序列進(jìn)而生成軟件胎記。
然而,以上方法存在以下兩個(gè)缺陷:1)使用k-gram算法產(chǎn)生的靜態(tài)軟件胎記的彈性較弱,因?yàn)樵撍惴▽?duì)軟件指令序列是機(jī)械切割分片的,所以由這種算法產(chǎn)生的胎記存在嚴(yán)重的語義丟失,導(dǎo)致其彈性弱。2)使用程序調(diào)用的API生成軟件胎記可信性較弱,由于這種胎記僅由程序的API特征生成,沒有考慮多特征,故而該胎記的可信性較弱,并且這種胎記也需要考慮源程序與待測(cè)程序之間是否是同一系統(tǒng)平臺(tái)編寫,故也存在一定的局限性。
文獻(xiàn)[4]研究了一種基于系統(tǒng)函數(shù)調(diào)用頻率與指令基本塊的軟件胎記的方法,并且驗(yàn)證了其效果不弱于傳統(tǒng)的k-gram胎記,說明了使用多特征生成軟件胎記是可行的。
本文采用一種新的算法生成軟件胎記,可以克服原有程序胎記的缺點(diǎn)。在從程序中提取胎記時(shí),綜合了API和指令序列兩方面特征,使提取到的胎記可信性比原有胎記更強(qiáng),并且在提取軟件的指令序列特征使用了最長公共子串(Longest Common SubString, LCS)算法,使胎記的彈性比使用k-gram算法提取的胎記更強(qiáng)。
一個(gè)完整的軟件對(duì)比程序主要使用以下兩個(gè)公式[5]:
(1)
其中:extracte是軟件胎記提取公式;BP表示程序P的胎記,由程序P通過特征提取函數(shù)所得到的。sim是兩軟件胎記的相似度計(jì)算公式[6],程序P和程序Q之間的相似度則需要通過對(duì)比BP和BQ來得到。
衡量一個(gè)軟件胎記的好壞有以下兩個(gè)標(biāo)準(zhǔn)。定義[2,7]如下:
定義1 軟件胎記的彈性。令P′表示對(duì)P使用語義保留的混淆技術(shù)生成的派生程序,BP為P的胎記,BP′為P′的胎記,sim()表示胎記的相似性計(jì)算函數(shù),如果sim(BP,BP′)≥1-θ,則表明該軟件胎記具有很好的彈性,其中θ表示相似性閾值。
定義2 軟件胎記的可信性。令P和Q表示兩個(gè)完全獨(dú)立的軟件,如果sim(BP,BQ)<θ,則表明稱該軟件胎記具有很好的可信性。
為了方便說明算法,以下使用字符串來舉例,假定有兩個(gè)字符串A和B:
可發(fā)現(xiàn)其中有3個(gè)相同的長度大于1的字串。
表1 串A與串B的所有公共子串Tab. 1 All common substrings of string A and B
根據(jù)文獻(xiàn)[8-9]提出的一種計(jì)算最長公共子串的算法,對(duì)算法步驟描述如下:
記字符串A的長度為l1,字符串B的長度為l2,構(gòu)建一個(gè)規(guī)模為l1×l2的矩陣,矩陣的值按照以下兩條規(guī)則填寫:
規(guī)則1 若矩陣該元素對(duì)應(yīng)位置上兩字符不相同,則置矩陣元素值為0。
規(guī)則2 若矩陣元素對(duì)應(yīng)位置上兩字符相同,且不在第一行、列上,則矩陣該元素值為其左上角元素值加1;若在第一行、列上,則將該元素值置為1。
按照以上規(guī)則填充矩陣,得到記錄了串比較信息的矩陣(圖1)。
圖1 LCS算法動(dòng)態(tài)規(guī)劃矩陣 Fig. 1 Dynamic planning matrix generated by LCS algorithm
其中2,4,4三個(gè)數(shù)字表明了公共子串的長度,而從這三個(gè)元素出發(fā)向其左上角一直追溯到元素值為1的元素的橫縱坐標(biāo)表明了這個(gè)公共子串在串A和串B中的起始位置。
k-gram軟件胎記(StaticK-gram Birthmark, SKB)提取算法最早是受到自然語言處理中n-gram算法[10]的啟發(fā)而產(chǎn)生的算法,其定義[11]如下:
定義3k-gram碎片集。記A={a1,a2,…,an}是一個(gè)序列,(aj+1,aj+2,…,aj+k)是A中的一個(gè)k-gram碎片,則序列A的k-gram碎片集記為seg(A,k)={(aj+1,aj+2,…,aj+k)|0≤j≤n-k},其中k為k-gram算法中滑動(dòng)窗口的長度。
定義4 SKB。記p為一個(gè)程序,A(p)為p的操作碼序列,那么p的靜態(tài)k-gram胎記為SKB(p,k)=seg(A(p),k)。
提取一個(gè)k-gram胎記的步驟為:
步驟1 提取程序中的操作碼序列;
步驟2 對(duì)操作碼序列進(jìn)行k-gram分割得到長度為k的操作碼子序列,稱為k-gram碎片;
步驟3 將程序中k-gram 碎片的集合作為軟件胎記。
例如,對(duì)于Java程序字節(jié)碼指令序列{aload_0,iload_1,invokevirtual,aload_0,invokevirtual,return},其k-gram胎記中k取值為3時(shí)軟件胎記為:
{(aload_0,iload_1,invokevirtual),(iload_1,invokevirtual,aload_0),(invokevirtual,aload_0,invokevirtual),(aload_0,invokevirtual,return)}
當(dāng)我們計(jì)算兩個(gè)k-gram胎記的相似度時(shí),其公式如下:
一個(gè)程序P可以提取的特征包括:API調(diào)用集合、程序控制流結(jié)構(gòu)、程序指令序列、程序調(diào)用棧依賴關(guān)系等,在使用extracte函數(shù)時(shí)可以選擇提取其中的某些特征,本文所用的程序胎記的特征包含程序指令序列和API調(diào)用集合。
程序?qū)嵸|(zhì)上是對(duì)數(shù)據(jù)的處理和變換,而一個(gè)程序的語義就體現(xiàn)在對(duì)數(shù)據(jù)的處理過程中,通過分析程序的指令序列,就可以很好地把握程序的功能和語義。而在現(xiàn)代軟件開發(fā)中,幾乎所有的程序都需要調(diào)用底層或其他人開發(fā)的程序,通過分析程序的API調(diào)用,可以快速地模糊定性一個(gè)程序的功用,這一點(diǎn)在大型的開發(fā)軟件中體現(xiàn)得尤為明顯。而想要通過分析程序的控制流結(jié)構(gòu)或棧依賴關(guān)系來確定兩個(gè)程序是否相似時(shí),不可避免地要用到圖或樹的對(duì)比算法,而這一類算法的時(shí)間復(fù)雜度是指數(shù)級(jí)的。
針對(duì)現(xiàn)有軟件胎記可信性弱、彈性弱的特點(diǎn),本文提出一種新的軟件胎記提取算法。該算法首先將程序進(jìn)行分析得到程序元信息,通過元信息提取程序的API調(diào)用集合和指令序列,再將API調(diào)用集合和指令序列作為輸出生成程序的程序胎記。通過構(gòu)建比較模型,將源程序與可疑程序的程序胎記進(jìn)行對(duì)比得到兩程序胎記之間的相似度,根據(jù)相似度判斷源程序與可疑程序之間是否存在抄襲行為。由以上算法提取的胎記記為多特征胎記(Multiple Feature Birthmark, MFB)。
圖2 融合雙特征的軟件胎記生成與比較模型 Fig. 2 Dual-feature-birthmark generation and comparison model
使用軟件胎記進(jìn)行程序抄襲檢測(cè)可分為兩大步驟[12]。第一步是軟件胎記的生成,而一個(gè)軟件胎記的質(zhì)量主要決定于如何對(duì)特征進(jìn)行處理,針對(duì)不同的特征我們采用的特征提取算法是不同的,而對(duì)同一特征我們使用不同的提取算法提取出的胎記也是不同的。本文提出的多特征軟件胎記提取算法主要對(duì)以前的胎記有以下兩點(diǎn)改進(jìn);
一是本文在提取API和指令序列特征時(shí)都進(jìn)行了解引用處理:對(duì)于API特征,若類A引用了類B,而類B引用了類C和D,那么類A的API特征不僅包含B,也會(huì)包含C和D。而對(duì)于指令序列特征;若一個(gè)方法MA的指令序列為a、b、c、d而b指令引用了方法MB,MB的指令序列為e、f、g,則最終MA的指令序列特征會(huì)被記錄為a、b、e、f、g、c、d。
二是本文在構(gòu)建軟件胎記比較模型時(shí)沒有使用k-gram算法而使用了LCS算法。使用k-gram算法比較兩個(gè)指令序列時(shí),是將兩個(gè)指令序列進(jìn)行機(jī)械固定粒度切割然后比較相同碎片在總碎片中的占比;而LCS算法因?yàn)槭潜容^指令序列,存在語義關(guān)系,兩個(gè)相同的片段保留了一定的語義信息。
本文提出一種Java程序的API特征提取算法,描述如下:
步驟1 由用戶在工程P中選定待提取特征的類C,設(shè)定迭代深度為d,建立集合SetAPI用于存儲(chǔ)類C的引用類。
步驟2 找到類C除了本類和父類以外的所有引用類,將其添加至SetAPI中。
步驟3 遍歷SetAPI中所有的項(xiàng),記遍歷過程中正在遍歷的類為Ctemp,若Ctemp是一個(gè)在工程P中存在的類,則將Ctemp除了本類和父類以外的所有引用類添加至SetAPI中,并將其標(biāo)記為已添加。遍歷結(jié)束時(shí)d=d-1。
步驟4 重復(fù)步驟3,直到SetAPI中不存在未標(biāo)記為已添加的類或d=0時(shí),將SetAPI輸出。
例如,在迭代深度為3時(shí),對(duì)以下Java程序進(jìn)行API特征提取。
class A {
public void function(int index) {
new B().function(index);
}
}
class B {
public double function(int index) {
return 1+
new C().function(index)/new D().function(index);
}
}
class C {
public long function(int index) {
return 2*index;
}
}
class D {
public long function(int index) {
return 3-index;
}
}
步驟3 重復(fù)步驟2,直到d=0或Arrayinstruction中任意一項(xiàng)的指令序列中都不包含指向工程P中存在的方法的指令時(shí),將Arrayinstruction輸出。
例如,圖2中的類A,B,C,D中的function方法操作序列碼分別為:
A.function(){new,dup,invokespecial,iload_1,invokevirtual,pop2,return}
B.function(){lconst_1,new,dup,invokespecial,iload_1,invokevirtual,new,dup,invokespecial,iload_1,invokevirtual,ldiv,ladd,l2d,dreturn}
C.function() {iconst_2,iload_1,imul,i2l,lreturn}
D.function() {iconst_3,iload_1,isub,i2l,lreturn}
在迭代深度為3時(shí),最終得到類A中function方法的指令序列特征為:
public void A.function(int index) {
new,dup,invokespecial
void
//B的構(gòu)造函數(shù)
aload_0,invokespecial,return
}
iload_1,invokevirtual
public double B.function(int index) {
lconst_1,new,dup,invokespecial
void
//C的構(gòu)造函數(shù)
aload_0,invokespecial,return
}
iload_1,invokevirtual
public long C.function(int index) {
iconst_2,iload_1,imul,i2l,lreturn
}
new,dup,invokespecial
void
//D的構(gòu)造函數(shù)
aload_0,invokespecial,return
}
iload_1,invokevirtual
public long D.function(int para1) {
iconst_3,iload_1,isub,i2l,lreturn
}
ldiv,ladd,l2d,dreturn
}
pop2,return
}
根據(jù)文獻(xiàn)[13]提出的一種BP(Back Propagation)神經(jīng)元輸出模型,提出當(dāng)待比較程序P和Q提取了n方面特征時(shí),其相似度計(jì)算公式:
(2)
(3)
其中,API相似度的計(jì)算公式[14]為:
(4)
在比較兩個(gè)程序胎記的指令序列特征時(shí):
本文提出一種計(jì)算指令序列相似度的方法:
步驟1 用戶輸入本次處理的閾值為threshold,對(duì)源程序和可疑程序的指令序列,使用LCS算法尋找源程序和可疑程序的公共子串,將所有長度大于閾值的公共子串記錄到集合Set中,其中Seti記錄了一個(gè)子串的長度lengthi,其規(guī)模為n。
(5)
綜上,最終得到比較兩個(gè)提取了API和指令序列特征的軟件胎記的比較公式:
(6)
其中:w1,w2分別為相似度在API特征和在指令序列特征方面的權(quán)重。
檢測(cè)程序P和程序Q是否存在盜版現(xiàn)象[15]步驟如下:
步驟3 設(shè)置檢測(cè)閾值γ1、γ2,其中γ1>γ2。若simP,Q≥γ1,認(rèn)為兩程序之間是拷貝關(guān)系;若simP,Q≤γ2,認(rèn)為兩程序之間是獨(dú)立開發(fā);否則將認(rèn)定為無法判定。最后輸出兩程序盜版檢測(cè)結(jié)果。
對(duì)于盜版程序Q:
class FakeA {
public void f(int i) {new FakeB().f(i);}
}
class FakeB {
public double f(int i) {
return 1+
new C().function(i)/new D().function(i);
}
}
class C {
public long function(int i) {return 2*i;}
}
class D {
public long function(int i) {return 3-i;}
}
實(shí)驗(yàn)將驗(yàn)證多特征胎記的可信性和彈性,并與SKB進(jìn)行對(duì)比。實(shí)驗(yàn)在Windows 7系統(tǒng)下完成,迭代深度d=3,API和指令序列的特征權(quán)重分別為w1=0.3,w2=0.7,修正參數(shù)α=8,使用多特征胎記時(shí)LCS算法閾值為threshold=5,使用SKB將k-gram算法粒度為gram=5。設(shè)置檢測(cè)閾值γ1為0.8,γ2為0.5。
本文實(shí)驗(yàn)使用Junit4.0-4.5,checkstyle4.2-5.2,findbugs4.2-4.7,soot-2.5.0共計(jì)19個(gè)jar包,6 720個(gè)類用于驗(yàn)證比較,其中Junit、checkstyle、findbugs均為代碼測(cè)試工具,soot為代碼分析工具。
本文選擇驗(yàn)證Junit、checkstyle、findbugs不同大小版本之間的同一類的相似度和Junit、checkstyle、findbugs與Soot之間隨機(jī)抽取的類之間的相似度。同一程序的不同版本,對(duì)比版本1和版本2之間的軟件胎記,應(yīng)該得到較高的相似度;而由兩支團(tuán)隊(duì)分別獨(dú)立開發(fā)的程序,對(duì)比其軟件胎記應(yīng)得到較低的相似度。
以下用首字母代稱驗(yàn)證程序。根據(jù)可信性定義,當(dāng)兩程序是獨(dú)立開發(fā)的程序時(shí),其胎記應(yīng)不同,得到的相似度應(yīng)低于檢測(cè)閾值的下界。由實(shí)驗(yàn)數(shù)據(jù)可知,多特征胎記在判定兩個(gè)獨(dú)立開發(fā)的程序時(shí),得到的相似度均低于0.5,即判定為獨(dú)立開發(fā);而對(duì)于同一程序的不同版本之間對(duì)比得到的相似度均高于0.8,即判定為抄襲程序。這說明由本文提出的軟件胎記具有可信性。
表2 使用多特征胎記得到的相似度Tab. 2 Similarity obtained by using multiple feature birthmark
本次實(shí)驗(yàn)驗(yàn)證多特征胎記和SKB對(duì)相似程序和獨(dú)立開發(fā)程序的識(shí)別效果。
Junit4.0到Junit4.5版本之間BaseTestRnuuer.class是一個(gè)幾乎沒有改動(dòng)的類(以下簡稱BTR類),將Junit4.0版本的BTR類作為源程序,分別與Junit4.0到4.5版本的BTR類進(jìn)行比對(duì),首先使用多特征胎記進(jìn)行比對(duì),再使用SKB進(jìn)行比對(duì),由兩種胎記對(duì)同一對(duì)類同程序的檢測(cè)結(jié)果均為判定抄襲,說明多特征胎記在檢測(cè)類同程序上的效果是不弱于SKB的。由兩種胎記得到的相似度對(duì)比如圖3所示。
Junit和Soot是兩個(gè)完全獨(dú)立開發(fā)的程序,將Soot-2.5.0-ByteType.class作為源類,分別與Junit4.0到4.5版本的Version.class類進(jìn)行比對(duì),首先使用多特征胎記進(jìn)行比對(duì),再使用SKB進(jìn)行比對(duì),由兩種胎記得到的相似度對(duì)比如圖4。
圖3 兩種胎記在檢測(cè)類同程序上的表現(xiàn) Fig. 3 Performance of two kinds of birthmarks in detecting similar programs
圖4 兩種胎記在檢測(cè)獨(dú)立開發(fā)程序上的表現(xiàn) Fig. 4 Performance of two kinds of birthmarks in detecting independent development programs
使用代碼混淆工具proGuard對(duì)程序進(jìn)行加密混淆,記源程序中的類C經(jīng)過proGuard混淆過的類為C′,對(duì)比由C和C′產(chǎn)生的胎記,應(yīng)得到較高的相似度。本次實(shí)驗(yàn)選取Junit中6個(gè)類與其對(duì)應(yīng)混淆類分別使用多特征胎記和SKB進(jìn)行對(duì)比,相似度對(duì)比如表3。
SKB在對(duì)比C和C′時(shí)相似度平均值為0.52,多特征胎記對(duì)比C和C′時(shí)相似度平均值為0.84,可以看出多特征胎記在彈性上優(yōu)于傳統(tǒng)的SKB。
表3 兩種胎記的彈性對(duì)比Tab. 3 Resilience comparison of two kinds of birthmarks
圖5 兩種胎記的彈性對(duì)比測(cè)試 Fig. 5 Resilience of two kinds of birthmarks
實(shí)驗(yàn)首先驗(yàn)證了多特征胎記的可信性,驗(yàn)證類同程序得到較高的相似度,驗(yàn)證獨(dú)立開發(fā)程序得到較低的相似度,以上兩點(diǎn)說明使用多特征胎記進(jìn)行抄襲檢測(cè),其結(jié)果是可靠的。
隨后對(duì)比了多特征胎記與SKB在抄襲檢測(cè)上的表現(xiàn),在對(duì)比抄襲程序和獨(dú)立開發(fā)程序時(shí),兩種胎記得到的結(jié)論是一致的。這說明多特征胎記在抄襲檢測(cè)方面的可信性不弱于SKB。
最后驗(yàn)證了多特征胎記的彈性,由多特征胎記得到源程序C與其迷惑程序C′的相似度均值為0.84,而由SKB得到C與C′之間相似度均值只有0.52。由這兩種胎記得到的檢測(cè)結(jié)果完全不同,由SKB得到的相似度我們只能得出兩程序的關(guān)系是無法判定的,而由多特征胎記得到的相似度可以得出兩程序之間存在抄襲關(guān)系。這說明多特征胎記在檢測(cè)經(jīng)過迷惑的抄襲程序上表現(xiàn)要優(yōu)于傳統(tǒng)的SKB,即多特征胎記的彈性比SKB要強(qiáng)。
本文提出了使用兩個(gè)特征生成的多特征軟件胎記MFB,MFB能夠直接分析Java的字節(jié)碼而無需使用源代碼。通過提取程序中的API調(diào)用信息和指令序列信息來生成軟件胎記,驗(yàn)證了多特征融合生成軟件胎記這一模型的有效性。本文提出的算法主要側(cè)重于克服SKB彈性弱的缺點(diǎn),通過更換指令序列特征提取算法來克服由k-gram算法所帶來的語義丟失問題,使得胎記的彈性增強(qiáng),并且加入其他特征保證胎記的可信性,因此MFB對(duì)于語義保留的代碼混淆和抄襲有很好的檢測(cè)能力。下一步可以嘗試融合其他方面特征來生成可信性與彈性更優(yōu)的多特征胎記。
參考文獻(xiàn)(References)
[1] GROVER D. Program Identification [M]. London:Cambridge University Press,1989: 119-150.
[2] MYLES G, COLLBERG C.K-gram based software birthmarks [C]// Proceedings of the 2005 ACM Symposium on Applied Computing. New York: ACM, 2005: 314-318.
[3] PARK H, CHOI S, LIM H, et al. Detecting Java theft based on static API trace birthmark [C]// Proceedings of the 3rd International Workshop on Security: Advances in Information and Computer Security. Berlin: Springer, 2008: 121-135.
[4] 張杏,徐江峰,李曉陽. 基于系統(tǒng)函數(shù)調(diào)用頻率與指令基本塊的軟件胎記[J].計(jì)算機(jī)工程,2016,42(10):86-90.(ZHANG X, XU J F, LI X Y. Software birthmark based on system function call frequency and instruction basic block [J]. Computer Engineering, 2016,42(10): 86-90.).
[5] 王勇.基于Java平臺(tái)的靜態(tài)軟件胎記技術(shù)研究[D].鄭州:信息工程大學(xué),2013: 4-6.(WANG Y. Study on static software birthmarking based on Java platform [D]. Zhengzhou: Information Engineering University, 2013: 4-6.)
[6] 黃壽孟,高華玲,潘玉霞. 軟件相似性分析算法的研究綜述[J]. 計(jì)算機(jī)科學(xué),2016,43(S1):467-470.(HUANG S M, GAO H L, PAN Y X. Summary of research on similarity analysis of software [J]. Computer Science, 2016,43(S1): 467-470.)
[7] 范銘,劉均,鄭慶華,等. 基于棧行為動(dòng)態(tài)胎記的軟件抄襲檢測(cè)方法[J]. 山東大學(xué)學(xué)報(bào)(理學(xué)版),2014,49(9):9-16.(FAN M, LIU J, ZHENG Q H, et al. SODB: a novel method for software plagiarism detection based on stack operation dynamic birthmark [J]. Journal of Shandong University (Natural Science), 2014, 49(9): 9-16.)
[8] 王開云,孔思淇,付云生,等.兩種基于雙向比較的最長公共子串算法[J].計(jì)算機(jī)研究與發(fā)展,2013,50(11):2444-2454.(WANG K Y, KONG S Q, FU Y S, et al. Two longest common substring algorithms based on bi-directional comparison [J]. Journal of Computer Research and Development, 2013, 50(11): 2444-2454.)
[9] 張毅超,車玫,馬駿. 求最長公共子串問題的算法分析[J]. 計(jì)算機(jī)仿真,2007,24(12):97-100.( ZHANG Y C, CHE M, MA J. Analysis of the longest common substring algorithm [J]. Computer Simulation, 2007, 24(12): 97-100.)
[10] 馬志強(qiáng),張澤廣,閆瑞,等.基于N-Gram模型的蒙古語文本語種識(shí)別算法的研究[J].中文信息學(xué)報(bào),2016,30(1):133-139.(MA Z Q, ZHANG Z G, YAN R, et al. N-Gram based language identification for Mongolian text [J]. Journal of Chinese Information Processing, 2016, 30(1): 133-139.)
[11] 陳林,劉粉林,蘆斌,等.基于k-gram頻數(shù)的靜態(tài)軟件胎記[J].計(jì)算機(jī)工程,2011,37(4):46-48.(CHEN L, LIU F L, LU B, et al. Static software birthmark based onk-gram frequency [J]. Computer Engineering, 2011, 37(4): 46-48.)
[12] 田振洲,劉烴,鄭慶華,等.軟件抄襲檢測(cè)研究綜述[J].信息安全學(xué)報(bào),2016,1(3):52-76.(TIAN Z Z, LIU T, ZHENG Q H, et al. Software plagiarism detection: a survey [J]. Journal of Cyber Security, 2016, 1(3): 52-76.)
[13] 喻寶祿,段迅,吳云. BP神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)預(yù)測(cè)模型的建立及應(yīng)用[J].計(jì)算機(jī)與數(shù)字程,2016,44(3):482-486.(YU B L, DUAN X, WU Y. Establishment and application of data prediction model based on BP neural network [J] . Computer and Digital Engineering, 2016, 44(3): 482-486.)
[14] 王廣南.基于系統(tǒng)調(diào)用依賴圖的程序相似性研究[D].長沙:湖南大學(xué),2009:27-29.(WANG G N. Similarity of programs based on system call dependency graphs [D]. Changsha:Hunan University, 2009: 27-29.)
[15] SCHULER D, DALLMEIER V, LINDIG C. A dynamic birthmark for Java [EB/OL]. [2017- 03- 02]. https://www.st.cs.uni-saarland.de/birthmarking/schuler-ase-2007.pdf.
This work is partially supported by Science and Technology Department of Shaanxi Province (2017GY-092).
WANGShuyan, born in 1964, Ph. D., professor. Her research intererts include software testing, data mining.
ZHAOPengfei, born in 1993, M. S. candidate. His research intererts include computer software and theory.
SUNJiaze, born in 1980, Ph. D. candidate, associate professor. His research intererts include intelligent optimization algorithm.