摘要:應用程序設計技術實現軟件水印,比較了兩種當前主流的軟件水印實現方式,研究了一種與軟件開發過程同步的軟件水印技術,從軟件水印的嵌入和提取兩個方面對這種新的軟件水印技術進行描述和形式化證明,開發出一個同步嵌入軟件水印的示例程序來演示軟件開發商信息的嵌入和提取過程。結果表明采用程序設計實現的軟件水印技術可以很好地完成軟件版權信息的隱藏和提取工作,是一種用于版權保護工作的有效方法。
關鍵詞:軟件水印;程序設計;版權保護;同步嵌入
中圖分類號:TP309文獻標識碼:A文章編號:1009-3044(2009)27-7725-03
Research on Key Technology of Software Watermark Based on Programming
CHEN Zhong-long, CHENG Jiu-jun
(College of Electronics and Information Engineering, Tongji University, Shanghai 201804, China)
Abstract: This paper studied software watermark implemented by programming. After comparing the two main ways to implement software watermark, a new kind of software watermark developed together with software itself was researched in this paper. The processes of embedding and extracting and the formal proof of the new software watermark were described. A demonstration of synchronous embedding software watermark showed how to embed and extract the declaration of the ownership. The result indicate that software watermark based on programming could well complete the mission of hiding and extracting the software copyright information and could be an effective method of copyright protection.
Key words: software watermark; programming; copyright protection; synchronous embedding
數字水印(Digital watermark)是永久鑲嵌在其它數據(宿主數據)中的具有可鑒別性的數字信號或模式,并且不影響宿主數據的可用性。根據宿主數據的不同,數字水印可以分為圖像水印,音頻水印、視頻水印、軟件水印和文檔水印等。軟件水印[1](Software watermark)是將數字水印應用于軟件宿主的技術,是數字水印技術的一種。
軟件水印技術主要有兩部分構成,即水印嵌入和水印提取/檢測[2]。軟件水印的嵌入過程是指將所有者水印通過某種嵌入算法添加到軟件產品中。這樣所有者水印就可以伴隨軟件的傳播過程,依附在軟件產品中忠實地記錄著該軟件的所有者信息。一旦對于某個軟件產品的版權產生爭議,就可以通過水印的提取(檢測),對產品的所有者和版權聲明進行確認。軟件水印的提取與檢測最大的不同是水印提取不需要所有者水印,而直接提取出該軟件內嵌的水印信息;水印檢測需要所有者提供其水印,然后檢測軟件產品中是否包含有該水印。
1 軟件水印的實現方式
根據軟件水印的嵌入時間不同可以將軟件水印的實現方式主要分為兩種:一種是在軟件開發完成后再進行水印嵌入,另一種是在軟件開發過程中就同步完成水印嵌入。為了方便起見,把前一種方式稱為后期嵌入(post embedding),后一種稱為同步嵌入(synchronous embedding)。
1.1 后期嵌入軟件水印
后期嵌入方式的軟件水印的思想來源于多媒體水印。由于人類感官上的限制,多媒體信息,例如圖像、聲音等都會存在許多冗余信息,多媒體水印采用水印信息替換冗余信息的方式來實現水印嵌入。在主流操作系統上,軟件可執行文件都是采用COFF格式(Common Object File Format),例如Windows平臺下的PE文件,UNIX平臺下的ELF文件等。這種格式的特點是分節(Section),它會將軟件代碼分節存儲,出于對齊的考慮,各節的尾端都存在冗余空間,后期嵌入的水印正是試圖在這些空間中嵌入水印信息。
文獻[3]描述了一種在Win32平臺下對PE文件進行軟件水印嵌入的方案,將軟件水印分散嵌入到各個節尾端的冗余空間。通過分析顯示,大多數PE文件都會存在幾千個字節的冗余空間,足夠完成軟件水印的嵌入工作。此外,這種方案非常簡單,通用性也好。但是它也具有缺陷,最主要的是水印信息集中在節的尾端,與軟件代碼的融合不夠緊密,缺乏良好的隱藏性。
1.2 同步嵌入軟件水印
同步嵌入方式的軟件水印是為了克服軟件水印隱藏性弱的缺陷而出現的,它是軟件水印技術與程序設計、軟件工程等技術相結合的產物。這種方式的主要思想是在軟件開發過程中就考慮版權保護和軟件水印的嵌入,提高水印信息與軟件代碼的結合度,使得軟件代碼更加隱蔽,通過良好的隱藏性來抵御軟件水印攻擊。
同步嵌入方式的軟件水印是當前研究的熱點,在提出算法方面出了不少成果。文獻[4]對這些主要算法都作了一個描述。雖然在軟件水印算法上取得了不錯的進展,但是對于如何將軟件水印融入到軟件開發過程中卻還沒有一個清晰的思路。本文試圖將軟件水印與軟件開發工作結合起來,研究一種新的思路來促進軟件水印技術的實用化。
2 基于程序設計的軟件水印技術
基于程序設計的軟件水印技術是將軟件水印技術融入到軟件開發過程的一種技術。本文主要對水印嵌入和水印提取兩方面的主要步驟進行說明,給出各個步驟的形式化定義。并對這種軟件水印技術的過程進行形式化證明。
2.1 軟件水印嵌入過程
圖1描述了軟件水印的嵌入過程,包括預處理過程、代碼嵌入過程和產品生成過程三個階段。
2.1.1 預處理過程
在預處理過程中,首先選擇特定表現形式的所有者水印,例如一段“某某公司版權所有”的版權聲明,或是開發商的標志LOGO。這里選擇的水印將最終作為產品所有者的證明。然后選擇軟件開發過程中使用程序設計語言生成軟件水印代碼,為了增加水印的強度,還可以使用用戶密鑰進行加密。預處理過程如圖1(a)所示,它的形式化定義為:
Pw=G(W,K)(1)
其中W代表待嵌入的軟件水印,它可以具有文本、圖像或是動畫等多種表現形式;K代表軟件水印的加密密鑰,采用加密手段有助于提高軟件水印的健壯性;G代表源代碼的生成算法,也就是用特定的程序設計語言實現軟件水印的過程;Pw代表軟件水印的源代碼。
2.1.2 代碼嵌入過程
當軟件水印代碼與軟件源代碼分別編寫完成后,可以通過一定的嵌入算法,將軟件水印代碼嵌入到軟件源代碼中,得到二者的混合代碼。代碼嵌入過程中軟件水印代碼要盡可能地分散在軟件的關鍵源代碼中,軟件水印代碼與軟件源代碼不能影響對方的正常功能,同時軟件水印代碼不能嚴重降低軟件本身的運行效率。代碼嵌入過程如圖1(b)所示,它的形式化定義為:
Ps'=I(Pw,Ps)(2)
其中Pw代表由公式(1)得到的軟件水印源代碼;Ps代表軟件源代碼,它可以定義為Ps=G(S),其中S代表軟件本身表現形式;I代表軟件水印嵌入算法,也就是采用一定的策略將軟件水印源代碼分散到軟件源代碼中;Ps'代表混合代碼,也就是嵌入了水印代碼的軟件源代碼。
2.1.3 產品生成過程
完成代碼嵌入過程后,就可以使用編譯器對混合代碼進行編譯。編譯過程將程序設計語言轉換成了可執行代碼(二進制代碼),增加了軟件水印代碼與軟件源代碼的區分難度,因此包含軟件水印信息的代碼就不容易被發現和清除,提高了軟件水印的健壯性。產品生成過程如圖1(c)所示,它的形式化定義為:
Bs'=C(Ps')(3)
其中Ps'代表由公式(2)得到的軟件混合代碼;C代表編譯器,也就是將特定的程序設計語言轉換成機器語言的過程;Bs'代表目標軟件,也就是用于發售的軟件二進制代碼。
2.2 軟件水印提取過程
軟件水印的提取過程,主要有內部提取和外部提取兩種方式。內部提取可以在軟件運行過程中獨立完成水印提取工作,外部提取則需要加載器來完成水印提取。
內部提取將軟件水印提取算法作為一個獨立模塊嵌入到目標軟件中隨同軟件進行發售,在軟件運行過程中,用戶在正常使用軟件過程中并不會觸發軟件提取過程。只有在用戶執行某些特定行為(在正常使用軟件過程中很不常見)才可以觸發軟件水印的提取工作。圖2描述了使用獨立模塊進行軟件水印提取的過程。
外部提取則是通過一個外部加載器對特定的目標軟件進行文件分析或是在調試模式下運行,完成水印提取。外部提取方式可以開發專用的加載器,也可以使用通用的調試器(例如SoftICE,OllyDbg等)。使用外部提取可以避免水印提取代碼被跟蹤執行,提高了軟件水印的安全性,但是由于水印嵌入算法與提取算法是分離的,因此可信性不如使用內部提取方式。
軟件水印的提取工作實際上由兩部分構成,即還原和分離。還原其實就是對軟件的可執行代碼和水印的可執行代碼的執行過程。由于二者互不干擾,因此可以獨立地完成軟件功能和水印生成。分離可以將已經生成的軟件水印從軟件中提取出來。二者的形式化定義分別為:
S'=R(Bs')(4)
其中Bs'代表由公式(3)得到的目標軟件;R代表還原過程,也就是處理器執行軟件機器語言,完成軟件行為(也就是軟件表現形式)的過程;S'代表目標軟件行為,包括軟件自身的行為和軟件水印的行為兩個方面。
W=E(S')(5)
其中S'代表由公式(4)得到的目標軟件行為;E代表軟件水印提取算法,也就是將軟件水印行為與軟件自身行為分離的過程。
2.3 軟件水印技術的形式化證明
本節將對基于程序設計的軟件水印技術進行形式化證明,從邏輯層面上證明這種技術的正確性和完備性。
為了簡單起見,我們在下面證明過程中不考慮軟件水印的加密過程,只使用不加密的軟件水印W進行形式化證明。對于使用密鑰的軟件水印技術,可以使用加密水印W'=f(W,K)代替W。
對于軟件水印嵌入過程來說,程序設計語言源代碼的融合與二進制代碼的融合是對應的,即,
C(I(Ps,Pw))=I(C(Ps),C(Pw))(6)
因此根據公式(2)(3)(6),對于目標軟件的可執行代碼也可以表示為:
Bs'=C(I(Ps,Pw))=I(C(Ps),C(Pw))(7)
對于軟件水印提取過程來說,由于軟件本身可執行代碼的執行與水印可執行代碼的執行是各自獨立的,因此對于還原過程與分離過程來說是順序無關的,即
E(R(Bs'))=R(E(Bs')) (8)
因此根據公式(4)(5)(8),對于軟件水印的提取可以表示為:
W=E(R(Bs'))=R(E(Bs'))(9)
綜合水印嵌入和提取兩個過程,根據公式(7)(9),消去軟件嵌入和提取這一對相互對應的過程,可以得到:
W=R(E(I(C(Ps),C(Pw))))=R(C(pw))(10)
由于對軟件水印可執行代碼的執行過程等價于軟件水印本身,即,
R(C(Pw))=W (11)
證明完畢。
4 實驗結果與分析
本節給出使用程序設計實現手段為軟件添加水印的示例,開發平臺為Visual C++ 6.0,軟件項目BMPViewer是文獻[5]中的一個簡單BMP圖像瀏覽器,可以完成圖像的加載和顯示操作。這里,我們將為它添加一個開發商LOGO水印。將本文第3節中提出的基于程序設計的軟件水印技術運用到實際開發過程中,主要步驟有:
1) 選擇一個分辨率為208*64的人民郵電出版社LOGO灰度圖像作為所有者的版權證明。將像素內容讀入到一個大小為13312字節的水印圖像緩沖區中進行初始化。
2) 將水印圖像緩沖區的初始化代碼拆分成多條賦值語句,然后將代碼插入到BMPViewer項目源代碼中圖像的加載模塊中。這樣在軟件運行過程中已經秘密地生成了水印數據。
3) 將軟件水印的提取作為一個獨立的模塊也嵌入到源代碼中。定義水印提取觸發行為如下:載入特定BMP圖像大小為733*541,并且用戶在鍵盤上按下“test”按鍵序列。當用戶執行特定行為后觸發水印提取,同時還原水印圖像顯示在窗口中。
4) 將嵌入軟件水印的源代碼進行編譯和執行。用戶在正常運行軟件過程中并不會觸發水印顯示,而軟件所有者可以通過特定的行為來提取軟件水印證明其所有權。
如圖3所示,軟件水印能夠在滿足一定觸發條件的情況下顯示軟件所有者信息。由于采用代碼融合技術,軟件水印代碼能夠與軟件代碼緊緊結合,當攻擊者面對二進制代碼時,很難根據地址空間把它們分開。與2.1節提到的后期嵌入方式相比,隱蔽性有了很大提高。另外,由于多媒體圖像天生的冗余性,即使攻擊者能夠除去部分水印信息,軟件所有者依然可能提取殘缺的水印信息來證明其所有權。由此可見,該水印技術也擁有不錯的健壯性。
5 結論
軟件水印是近年來提出并開始研究的一種數字水印技術,它能夠為計算機軟件提供除加密和認證等常規技術以外的另一種版權保護手段,同時可以很好地應用到軟件版權保護工作中,開啟一個版權保護的新時代。本文研究了一種通用的基于程序設計的軟件水印技術,應用于軟件水印嵌入和提取工作,主要是針對軟件水印技術實用化的考慮。結果表明,該技術可以很好地完成軟件所有者信息的嵌入和提取。
參考文獻:
[1] 張立和,楊義先,鈕心忻,等.軟件水印綜述[J].軟件學報[J].2003,14(2):268-277.
[2] Jasvir Nagra, Clark Thomborson, and Christian Collberg.Software Watermarking: Protective Terminology. In Proceedings of the ACSC 2002, 2002.
[3] 吳振強,馮紹東,馬建峰.PE文件的信息隱藏方案與實現[J].計算機工程與應用,2005,41(27):148-150.
[4] 楊建龍,王建民,李德毅.軟件水印技術及其新進展[J].計算機工程,2007,33(17):168-170,175.
[5] 張力.Visual C++高級編程[M].北京:人民郵電出版社,2002.