范 潔 李冬冬 龐巖梅
(北京電子科技學院網絡空間安全系 北京 100070)
隨著計算機和網絡技術的飛速發展,軟件也從傳統的計算機軟件發展到智能手機APP,這給人們的生活帶來了無窮的便利。同時,軟件盜版、軟件篡改、軟件攻擊等事件頻頻發生,嚴重地影響著軟件生產者和使用者的利益。軟件保護技術日益受到政府、企業和研究者的重視。本文綜合運用軟件水印術和軟件特征技術,提出了一種基于靜態水印和軟件指令集的軟件特征值提取方法,并設計了軟件特征值在軟件保護中的具體應用方案。將提取出軟件特征值經軟件開發者對稱加密后隨軟件一起打包發售給使用者,可在軟件運行不正常時,鑒定軟件是否遭受破壞,或在軟件發生盜版時追溯盜版源頭。
軟件特征是程序本身所擁有的軟件屬性。軟件特征源自于程序的所有相關信息,包括程序代碼、API調用頻率、類繼承關系、線程執行序列、數據流等。
軟件胎記(Software Birthmark)是在軟件變化時,該軟件特征保持不變的、可用于標識該軟件的屬性。通過對比兩個軟件胎記特征的相似性,來判斷軟件的相似性,從而檢測出軟件是否存在拷貝或盜版。軟件胎記可分為軟件靜態胎記和動態軟件胎記[1,9]。
定義1軟件靜態胎記(software static Birthmark):設P是軟件的程序集合,Extract是從P中提取特征的一種方法,得到程序P在非執行狀態下的靜態特征集合B,則有Extract(P)→B。
定義2軟件動態胎記(software dynamic Birthmark):設P是軟件的程序集合,I表示對P的一個合法輸入,Extract是從P中提取特征的一種方法,若P運行且I不為空集,則稱此時B為動態胎記,記Extract(P,I)→B。
軟件水印通過向軟件程序中嵌入隱藏信息來實現軟件版權保護。在軟件開發時可以將含有版權保護的信息嵌入到程序的代碼區、數據區及程序的執行過程中。在發生軟件版權糾紛時,嵌入到程序的隱藏信息可以被提取出用于判斷軟件的擁有者或者開發者,協助鑒定軟件版權。
靜態軟件水印是指水印在軟件開發時被添加到軟件的數據區或者代碼區,但不在程序的可執行流程中,是一種與軟件運行狀態無關的水印。動態軟件水印與靜態軟件相反,將水印信息隱藏在程序的執行過程中,但只有程序在特定的輸入序列下運行時,才能提取出的軟件的水印信息[1,9]。
軟件反編譯的結果可以作為軟件的特征。本文使用靜態水印和軟件反編譯得到的指令集作為軟件特征值提取的來源。首先對嵌入在軟件中的字符串水印信息進行摘要值計算得到的摘要值為W;再對軟件進行反編譯得到的軟件指令集合進行統計,得到指令統計結果的集合為P;最后將P和W作為哈希算法的輸入計算出摘要值作為該軟件的特征值。提取流程如圖1所示。

圖1 軟件特征值提取流程圖
數據水印是將水印嵌入到軟件中的最簡單的方法。這種方法將包含數據水印的信息插入軟件中指定的位置。假設軟件的版權者為電科院,軟件出售給A公司使用,可以在軟件代碼中插入版權信息如下:
字符串水印=“版權&電科院&使用者&A公司”
采用此種方法插入的水印信息雖然簡單,但可以被用來識別軟件的開發者和使用者。這種簡單的嵌入與識別水印的方法可以非常容易地應用到軟件中,水印信息由軟件開發方事先嵌入在軟件中。本文提出的基于靜態水印和軟件指令集的軟件特征值提取方法,需要使用水印的摘要值作為提取特征值的輸入之一。本文開發的測試程序在開發過程中嵌入靜態數據水印,水印字符串取值為“電科院”代表軟件的開發者,采用MD5算法對水印值進行哈希計算,得到水印的摘要值。結果如圖2所示。

圖2 靜態數據水印摘要值計算結果
軟件反編譯指的是把二進制代碼翻譯成匯編助記符。目前有很多專業的反匯編工具,如IDA Pro(Interactive Disassembly Pro)、W32Dasm等。 .NET中自帶的反編譯工具Ildasm.exe可以對基于.NET平臺開發的軟件進行反匯編。
本文使用反編譯工具Ildasm.exe對在.NET環境下使用C#語言開發的測試程序test.exe進行反編譯,并將反編譯結果存儲在test.il文件中,并在軟件指令提取模塊編程實現了test.il文件的打開。結果如圖3所示。

圖3 中間碼文件打開結果
由圖3可知,可執行程序經過反編譯得到了指令集,接下來需要對指令集進行統計分析,得出每個指令出現的次數。采用正則表達公式進行多次組合和實驗,找到滿足規律的公式,這也是特征指令提取的關鍵所在。編程完成特征指令的提取及特征指令的統計,結果如圖4所示。

圖4 特征指令提取及統計結果
至此,得到由test.exe反編譯提取出的特征指令集P:
nop:2;
ldstr:1;
call:3;
pop:1;
ret:2;
ldarg:1;
3.1節詳細闡述了水印的賦值及水印的摘要值W的獲取方法,3.2節詳細闡述了軟件指令集的求取過程。將水印摘要值W和軟件指令集P合成后,再次進行摘要計算將得到的摘要值作為軟件的特征值。本文采用MD5算法作為求取軟件特征值的哈希算法,最終以128比特的哈希值作為軟件的特征值,具體結果如圖5所示。

圖5 軟件特征值提取結果
本文提出的軟件特征值提取方法對輸入的變化非常敏感,軟件特征值的提取主要依賴于數據水印值和軟件反編譯后得到的指令集。下面對不同的軟件和不同的水印值產生的軟件特征值進行比較分析。
從表1分析可以看出,相同的軟件,不同的水印,產生的軟件特征值不同;不同的軟件,相同的水印,產生的特征值也不同。當嵌入到軟件中的數據水印信息遭到暴力移出后,將對軟件產生損害,由此產生的軟件指令集與原先的指令集不同,最終產生的軟件特征值與之前的軟件特征值也不同。由軟件特征值對輸入的敏感性可知,結合軟件水印信息和軟件指令集的軟件特征值方法可用于軟件保護。

表1 軟件特征值比較
軟件特征和軟件水印均可用于軟件的版權保護,但是軟件特征技術用于軟件版權保護時一般需要可信第三方的支持[5]。本文提出的基于靜態水印和軟件指令集的軟件特征值提取方法結合對稱加密技術,在不需要可信第三方支持的情況下,即可完成軟件完整性鑒定和軟件版權保護。軟件特征值在軟件保護中的具體應用方案如圖6所示。由軟件開發者使用加密口令和對稱加密算法對軟件特征值進行加密,然后將加密后的軟件特征值文件與可執行程序一起打包發售。

圖6 軟件特征值在軟件保護中的具體應用方案
由于加密后的軟件特征值文件在后續的版權保護和軟件完整性鑒定中非常重要,軟件發行方應當以隱秘的方式將密文的特征值文件與可執行程序一起發行,且保證密文的軟件特征值文件在用戶計算機中隱密存儲。加密密鑰還需用于解密密文的軟件特征值文件,軟件開發者務必妥善保管。
軟件開發者還需要在本地維護一個水印值與軟件特征值映射關系表,以在未來發生版權糾紛或者軟件遭受破壞時使用。軟件發行之前,在軟件中嵌入的數據水印值和計算產生的軟件特征值均需填入表2。

表2 水印與軟件特征值映射關系
軟件被發售并在使用者計算機上安裝運行后,很容易遭受攻擊而導致軟件不能正常運行。本文設計的基于軟件特征值的軟件保護保護方案可以判斷軟件是否遭受到破壞。當懷疑軟件遭受到破壞時,首先由軟件發行者根據用戶信息和水印生成規則,產生水印值,對用戶使用的軟件進行反編譯求得軟件指令集,再根據軟件指令集和水印值產生新的軟件特征值1。接著根據水印值檢索軟件開發者存儲的軟件跟特征值表,提取出表中存儲的軟件特征值,稱為軟件特征值2。比較軟件特征值1和軟件特征值2,如果二者相同,說明軟件沒有遭受到破壞;若二者不相同,說明軟件已遭受到破壞。具體過程如圖7所示。

圖7 軟件特征值和軟件水印在軟件完整性鑒定中的應用
設有軟件開發商A公司將自己開發的軟件A出售給使用者B使用,發售時A在發售軟件中打包了加密后的軟件特征值文件,也稱密文的軟件特征值的文件。B在使用過程中,不小心被C竊取了軟件,并由在C使用,并且任意擴散D、E使用。
A公司發現C、D、E使用的軟件可能是自己開發的軟件的盜版版本時,首先從盜版軟件中提取出隱藏的密文的軟件特征值文件,用自己保管的對稱密鑰解密密文的軟件特征值后,得出軟件特征值。然后檢索自己存儲的軟件特征值表,如找到對應的軟件特征值,再找出對應的水印值,根據水印值中存儲的使用者信息,找到軟件被盜版的源頭。如果C、D、E在盜版時對密文的軟件特征值文件進行了刪除或破壞,此時A公司可以從盜版軟件中嘗試進行水印提取。如能提取成功則根據水印信息判斷軟件的版權及使用者,確定是否是自己開發軟件的盜版。具體過程如圖8所示。

圖8 軟件特征值和軟件水印在軟件盜版追溯中的應用
軟件特征是從軟件本身提取出軟件的特有屬性作為識別軟件的方法。軟件水印是將軟件的版權信息嵌入到軟件中且不影響軟件的正常使用的技術。本文在充分研究軟件特征和軟件水印技術的基礎上,提出了一種基于靜態水印和軟件指令集的軟件特征值提取方法。
該方法首先基于嵌入到軟件中的靜態數據水印計算水印摘要值;然后對軟件進行反編譯得出軟件指令集并對指令集進行統計分析得到有效的指令集合;最后對水印摘要值和軟件指令集進行摘要計算得到最終的軟件特征值。本文對提取的軟件特征值設計了在軟件保護中的具體應用方案,軟件特征值經由軟件開發商對稱加密后以密文的軟件特征值文件的方式隨軟件一起打包發售。當軟件運行不正常或在軟件受到攻擊時,可用于鑒定軟件的完整性是否遭受到破壞。當軟件發生盜版時,可供軟件開發者使用追溯盜版源頭。綜上所述,本文提出的基于靜態水印和軟件指令集的軟件特征值提取方法及其應用方案可用于軟件保護,具有實際應用價值,可在軟件保護領域推廣使用。