摘要:伴隨Internet的飛速發展,軟件版權面臨著巨大挑戰。軟件水印是保護軟件版權的有效手段之一。因此,軟件水印也就成為盜版者攻擊的主要目標。如何對軟件水印實施有效保護成為亟待解決的問題。混淆技術可以降低程序的可分析性、增強軟件水印的隱蔽性能,從而起到保護軟件水印的作用。編排變換、控制流程變換、數據變換是混淆技術的主要方式。
關鍵詞:軟件水印;混淆技術;保持語義;控制流程變換;數據變換
中圖分類號:TP309.2文獻標識碼:A文章編號:1009-3044(2010)02-408-02
Application Research on Confusion Technology in Software Watermark Protection
DONG Xi-wei, WU Hong-jue
(College of Information Science and Technology, Jiujiang University, Jiujiang 332005, China)
Abstract: With the rapid development of Internet, software copyright is facing enormous challenges. Software watermark is one of effective means to protect software. Therefore, software watermark becomes the main attack target of pirates. How to implement effective protection for software watermark is a problem demanding prompt solution. Confusion technology can reduce the procedure's analyzability and enhance the software watermark hidden capability, so that it plays a role in protecting software watermark. Layout change, control flow transformation, data conversion are the main form of confusion technology.
Key words: software watermark; confusion technology; maintain semantic; control flow transformation; data conversion
隨著Internet的發展,軟件(Software)作為互聯網上最為普遍且典型數字產品之一,如何保護其知識產權以及避免其由于遭受外界攻擊而受到破壞,已經成為近年來國際上的一個研究熱點,更是信息安全領域的一個重要分支。軟件水印是一種特殊的數字水印,是通過把程序的版權信息和用戶身份信息嵌入到程序中來實現保護軟件所有者權益的有效技術。盡管軟件水印概念的提出時間并不長,但是其思想卻由來已久。例如,軟件中通常都含有“××公司 版權所有”等信息,以提醒銷售以及使用該軟件的個人或企業,該軟件的知識產權是受保護的。軟件水印問題逐漸成為軟件保護領域的一個重要的研究課題,得到了更加廣泛的研究[1-3]。不同于多媒體(圖像、音頻、視頻)水印技術,軟件水印技術在水印的隱蔽性和防篡改等方面都存在較大問題[4-5]。其原因是由于其行為確定性、行為自明性、執行環境依賴性等軟件自身的一些特征決定的[6]。
1 混淆技術
混淆(Confusion)技術最初是一種比較典型的軟件水印的攻擊方法,但是,隨著跨平臺語言的出現,混淆技術也開始應用于反逆向工程。所謂混淆技術就是一種轉換技術,也就是將一段程序作為輸入,進行轉換,輸出另一段程序,這兩段程序在運行時具有相同的行為,而混淆后的程序較混淆前更加難以理解。對軟件而言,混淆通常泛指對軟件實行保持語義等價的一些變換,這些變換通常使得軟件的形式語義功能等價不變而執行效率和可維護性、可閱讀性相對于變換之前有較大的變化,這一點與軟件編譯生成時由編譯器所做的優化比較相似,但是,混淆與優化相比還具有不同之處,混淆的目的通常是降低軟件的可分析性,而優化軟件通常是提高軟件的執行效率。
1.1 混淆技術的概念
以下給出混淆的一個描述[7]:
P′=T(P)表示一種由源程序P到目標程序P′的轉換。如果P′=T(P)是混淆轉換,則P和P′具有相同的可觀察到的運行結果,且P,P′應該滿足如下條件:
1)P′和P在輸入和執行環境相同時,輸出也必須相同,一般來說,只要語義保持不變,這個條件自然滿足。
2)不存在由P′向P的逆變換,或者很難構造一個工具自動完成這種逆變換,或者這種逆變換的代價非常高。比如說,逆向工程P′的時間要遠大于逆向工程P的時間。
3)如果P終止時發生錯誤或異常終止,則P′或者終止,或者繼續執行;否則,P′必須終止,而且產生與P相同的執行結果。
在以上定義中,“有相同的執行結果”是使用者所觀察到的,這就意味著,P′還可以有一些“附加結果”,只要對使用者“透明”就行了。另外,定義中沒有要求P與P′具有相同的執行效率。實際上,P′的執行效率一般都低于P。由上述定義不難看出,真正好的混淆是不容易構造的,同時,由于軟件的復雜性和靈活的表現形式,很難量化地評價一個混淆究竟是否能夠達到要求。
1.2 常用混淆技術
針對軟件水印系統的特點,設計了幾種代碼混淆算法,這些算法中有些是借用了編譯器中的代碼優化或軟件重建的算法,有些則是專門設計的混淆算法。這些算法的目的都是為了使程序難以分析,嵌入的代碼和源代碼更加協調,同時對源程序的性能影響盡量降到最小。根據算法對程序變換目標的不同,可以把混淆算法分成三種:編排變換、控制流程變換和數據變換。對于控制流程變換和數據變換,前者主要影響代碼水印的檢測,后者主要影響數據水印的檢測。通常,這三種算法結合在一起使用。
1)編排變換
編排變換的主要方法有攪亂標識符、刪除注釋和改變編排格式。通常,標識符含有比較多的程序信息,例如,在編寫程序的時候,選擇的變量名通常都會有一定的含義,表明其在程序中所表示的意義,所以攪亂標識符是一種比較有用的變換方法;改變編排格式的作用不是很明顯,因為程序格式不會包含有很多的程序信息;刪除注釋對于要經過反編譯和重編譯的程序來說更是毫無意義。
2)控制流程變換
控制流程變換是通過改變程序的控制流程使程序更加難以分析進而達到保護軟件水印的目的。控制流程變換主要包含以下六種:
① 插入支路變換[8]
假設基本模塊S=S1, …,Sn,如圖1所示。在圖1(a)中,插入一個永真謂詞PT,把S分割成兩部分。謂詞PT是不相關代碼,因為它始終為TRUE。在圖1(b)中,先把S分割成兩部分,然后把第二部分復制成兩個版本Sa和Sb,這兩個版本其實具有相同的功能,只是在表現形式上不同,根據判斷條件P?,來選擇Sa和Sb。圖1(c)對圖1(b)做了一下修改,把條件P成條件PT。
② 增加冗余操作數
假設有如下語句:
(1)X=Y+Z; (1′)X=M×(Y+Z)/3
(2)X=Y+1; (2′)X=Y+logNM
設M和N為冗余操作數。在語句(l′)中,令M=3;語句(2′)中,令M=N>0,則表達式1和1′,2和2′具有相同的意思。
③ 模塊并行化
在多處理器系統中,并行化可以提高系統的運行和處理效率。這里的模塊并行化不是為了提高效率,而是為了擾亂程序原來的流程。例如,可以創建一個執行不相關任務的虛構進程與原進程并行,或者將原來前后不相關的幾個模塊并行處理。
④ 簡單流程圖復雜化
通過附加一些判斷條件PF和QF(如圖2所示),把原來比較簡單的流程圖復雜化為a和b。
⑤ 循環語句變換
這種變換是改變循環語句的書寫方式,將一層循環變為多層循環或者將多層循環變為一層循環等。
⑥ 內嵌技術
內嵌(Inline)可以改變程序的調用關系。內嵌是將子函數體中的全部內容拷貝到調用該子函數的主函數中,當程序經過內嵌優化后,在程序中將不會再找到有關該子函數的任何信息。與此相反,輪廓(Outline)技術是將主函數中的一部分代碼提取出來作為子函數,供主函數調用。
3)數據變換
數據變換是改變程序中變量或常量屬性的變換。數據變換同樣可以增加分析程序的難度達到保護軟件水印的目的。數據變換的方式主要有如下三種:
① 改變變量的存儲方式和生存周期
在一個函數內部定義的變量是局部變量,它只在本函數范圍內有效,或者說,只有在本函數內部才能使用它,此函數以外是不能使用這些變量的。而在函數外定義的變量是全局變量,它可以在本文件的其它函數中使用,其生存周期是從定義變量的位置開始到本文件結束。因此,可以把一個局部變量改為全局變量,這不會影響程序的運行。
② 數據編碼
這種方法是將變量進行編碼,例如,用j=d1*k+d2代替i,其中d1和d2是常量。如圖3所示的兩段程序,它們語義相同,但是變量的表達形式不一樣。
③ 拆分變量
拆分變量就是把一個變量分成幾個變量來處理。布爾變量和其它取值范圍有限的變量都可以分解成兩個或多個變量。將一個類型為T的變量v分解成兩個類型為U的變量p和q,必須足以下3個條件:
第一,存在一個函數f,使得f:(p,q)→v;
第二,存在一個函數g,使得g:v→(p,q);
第三,對T類型變量進行的運算能轉化為對U類型變量進行的運算。
2 小結
上述各種變換都可能影響水印的檢測,但它不會影響程序的語義,這類似于多媒體水印不影響圖像、視頻和音頻的視覺和聽覺效果一樣。對于軟件水印來說,關鍵問題是如何準確地將嵌入到應用程序中的水印提取出來。經過控制流程變換和數據變換的程序將變得難以分析,這將增加水印的隱蔽性。另外,經過控制流程變換和數據變換的程序其水印數據信息或水印定位信息也可能遭到破壞,導致水印無法檢測,或者檢測出來的水印面目全非,起不到版權保護的作用;但是,從其它角度來看,也可以利用這些變換設計其它種類水印。
參考文獻:
[1] 羅養霞,馬君,等.基于門限方案的動態圖軟件水印算法[J].計算機工程,2009,35(1):153-155.
[2] 朱建啟,劉衍珩,等.基于中國剩余定理動態圖軟件水印方案[J].吉林大學學報,2008,38(S2):198-201.
[3] 蘆斌.軟件水印及其相關技術研究[D].鄭州:解放軍信息工程大學,2007.
[4] 周立國,熊小兵,孫潔.基于自封閉代碼塊的軟件保護技術[J].計算機應用,2009,29(3):817-822.
[5] 王祥根.一種基于自修改代碼技術的軟件保護方法[J].中國科學院研究生院學報,2009,26(5):688-694.
[6] 來林靜.數字水印在軟件保護中的應用研究[D].武漢:華中科技大學,2007.
[7] 楊義先,鈕心忻.數字水印理論與技術[M].北京:高等教育出版社,2006.
[8] 張立和,楊義先,鈕心忻,等.軟件水印綜述[J].軟件學報,2003,14(2):268-277.