◆張李 林清 劉志敏 蔣彤彤
安全模型、算法與編程
基于HOOK的U盤文檔自動添加水印方法的研究與實現
◆張李 林清 劉志敏 蔣彤彤
(南京理工大學計算機科學與工程學院 江蘇 210000)
針對Windows應用程序都是通過調用Windows API函數對文件進行讀寫這一特性,本文利用Windows HOOK技術,設計并實現了一種U盤文檔自動添加水印的方法。當加密U盤中寫入文檔時,會先對文檔添加水印,再存入加密U盤。本方法不僅能有效提高文件的安全性,而且添加水印的過程無須用戶參與,提高了應用的透明性。
Windows HOOK;水印;加密U盤;版權保護
隨著互聯網的不斷普及,無紙化辦公的不斷推廣,數字文檔正逐漸取代傳統的紙質文檔。但數字文檔具有易于共享,復制成本低等特點,因此數字文檔的版權保護問題比傳統的紙質文檔更為突出[1]。數字水印技術是目前保護數字文檔版權的主要手段之一。它是將作者的版權信息以數字水印的形式嵌入到圖像、文檔、音頻、視頻等數字產品中[2]。本文所提出的方法主要功能是針對word文檔、pdf文檔、excel文檔、ppt文檔和jpg圖片等無紙化辦公中的常見文件,為其添加數字水印,以便在共享這些文件的過程中保護作者的版權。通過本文所實現的方法,一方面提高了存儲在加密U盤內文件的安全性,即使U盤丟失也無法獲取U盤內文件的明文內容,另一方面通過HOOK技術實現了自動添加水印的功能,保護了用戶的版權。水印的添加和文檔內容的加解密對用戶完全透明,使用起來方便快捷。
本文主要使用了加密U盤技術,HOOK技術和多種數字水印算法。通過加密U盤技術實現對U盤內容的加密保護,通過HOOK技術和數字水印算法實現對U盤內容自動添加版權水印。
加密U盤是一種能夠對U盤存儲內容進行加密的特殊U盤。對U盤存儲內容進行加密的方法主要有三種:(1)假加密,這種方法對實際存儲的內容并不進行加密,只是隱藏了U盤內的文件,因此稱為假加密。(2)軟加密,通過U盤內置或附帶的軟件對U盤內的文件進行加密。(3)硬件加密,通過U盤內置的硬件對U盤內的文件進行加密,保密性最強。本文使用軟加密方法對U盤內容進行加密。所使用的加密U盤分為光盤區和U盤區,U盤區和普通U盤一樣認證身份后可以進行讀寫,光盤區中內置了多種加密算法和身份認證的接口。U盤附帶的軟件通過DLL動態庫調用光盤區提供的加密算法和身份認證函數的接口。因此,只有同時使用指定的U盤和附帶的軟件才能對U盤區內容進行讀寫, 這種加密U盤具有極高的安全性。
HOOK技術一般稱為鉤子技術或掛鉤技術,是運行在Windows內核中的一種特殊機制,其功能和DOS系統的“中斷”機制類似[3]。通過HOOK技術,應用程序可以對Windows消息或指定事件進行實時監聽,當消息發出或事件發生時,應用程序可以立即獲得控制權。此時應用程序可以根據情況選擇不作處理或者運行指定函數來實現一些額外功能。
HOOK API是指專門對應用程序調用API函數進行監聽的HOOK技術。一旦Windows系統調用特定的 API函數,將優先執行HOOK函數,執行完HOOK函數之后再執行API函數。實現從API函數跳轉執行HOOK函數的方法主要有兩種:(1)通過修改PE文件的IAT導入表,對API地址進行重定向來實現函數的跳轉。(2)通過修改API函數的前幾個字節,并用一個JMP指令代替,來實現函數的跳轉[4-5]。
針對不同類型的文件采用了三種不同的水印算法。針對jpg圖像文件采用分塊DCT水印算法,針對word、excel、pdf文件采用基于隱屬性的水印算法,針對ppt文件增量更新機制采用基于增量更新的水印算法。
2.3.1 jpg圖像文件
分塊DCT水印算法是一種具有較強魯棒性的數字水印算法。分塊DCT算法分為三個步驟:(1)將原始圖像和水印圖像劃分為大小相等的圖像塊(兩個圖像大小可以不同)并進行DCT變換;(2)將水印DCT系數按不同強度嵌入原圖DCT系數中;(3)通過DCT反變換,將水印圖像嵌入到原圖像中[6]。
該算法生成的可見水印具有如下特性:(1)水印易辨識,不論是在單色還是彩色圖像中,水印都清晰可見;(2)水印魯棒性強,水印分布在圖像重要部分,即使原圖像被剪切或刪除部分,水印信息也能得到保留,具有較強的魯棒性。
2.3.2 word,excel,pdf文本文件
對word、excel、pdf文本文件,使用嵌入式水印方法為其增加隱水印。常用的嵌入式水印技術有基于文本格式的文本水印技術[7]和基于特征編碼的文本水印技術[8]。但基于文本格式的水印受到文本格式編輯的影響較大。尤其是對文本內容進行無格式拷貝時,會導致水印內容的完全丟失。所以本文采用了基于隱性字符屬性的特征編碼算法,來為文本文件添加水印。
隱性屬性指的是該屬性的變化不會對文檔頁面產生任何影響[9]。例如是否啟用字距調整的 kerning 屬性,默認值為 false。選用這樣的兩個隱屬性作為水印信息的“1”和“0”,通過修改屬性的默認值來達到嵌入水印信息的目的。這種算法的優勢是:(1)水印隱蔽性強,實現真正的無頁面修改;(2)水印魯棒性強,一般的格式變化對水印信息幾乎沒有影響。但實現這種算法需要找到恰當的屬性值,且容量較小,對文本的長度有一定要求。
2.3.3 ppt文件
與word等文本文件不同,ppt文件采用增量更新機制來組織文件,也就是說對ppt文檔內容進行的修改或刪除并不會直接刪除原來的內容,而是在原文件尾部追加數據來標明所做出的修改。當對ppt文檔進行刪除幻燈片或刪除幻燈片內容等操作時會產生許多廢棄數據[10]。這就為添加數字水印信息留下了巨大的空間,對這些廢棄數據嵌入水印信息完全不會影響用戶的使用。針對ppt文檔的這一特點,根據文檔增量更新信息來增加數字水印具有良好的魯棒性。
本文所提方法最終通過自主設計的軟件進行實現和驗證。該軟件存放在U盤上,主要分為三個層次:用戶層,應用層和內核層。其中內核層主要負責操作HOOK驅動以及對寫入指定U盤的文檔添加水印。應用層主要負責解密文檔內容、識別U盤設備以及把HOOK驅動模塊載入到目標進程。用戶層主要負責用戶的身份驗證和水印信息的修改。在用戶層通過身份認證后,應用層會將HOOK驅動模塊載入到目標API上,對WriteFile API進行實時監聽,此時用戶即可使用文檔水印功能。軟件的架構如圖1所示。
本文采用C#語言實現上述軟件。軟件主要包括六個功能模塊:水印信息管理模塊、U盤設備識別模塊、身份認證模塊、文檔加解密模塊、HOOK載入與驅動模塊以及水印添加模塊。以下對這六個功能模塊進行逐一介紹。
本模塊主要負責水印基本信息(水印內容、水印字體大小、水印字體顏色等)的設置和不可見數字水印信息的提取。每當調用文檔水印算法時,將本模塊存儲的水印信息作為參數傳給文檔水印算法。該部分的界面如圖2,圖3所示。

圖1 軟件架構圖

圖2 jpg文檔水印信息管理界面

圖3 word文檔水印信息管理界面
本模塊主要負責U盤設備的識別。通過DLL動態庫(Dongle_API)的方式,將U盤中存儲的U盤識別函數和加密函數載入到附帶的軟件中。在運行軟件時,軟件會首先調用U盤中的設備識別函數(每個U盤存有一個唯一的序列號,通過識別函數返回給系統),若軟件收不到正確的返回值則無法運行。
在Dongle_API庫中提供了多種操作U盤的函數,如對U盤的讀寫和加密函數。Dongle_Enum為U盤設備識別函數,當軟件系統調用該函數后會返回存儲在U盤內的唯一序列號,通過該序列號來對U盤進行識別。在收到正確的返回值后則進行用戶身份的認證。
本模塊主要負責對用戶進行身份認證。在用戶初次使用U盤附帶的軟件時會進行用戶身份的注冊。即設置用戶名和密碼。系統還會根據用戶設置的用戶名和密碼通過散列的方式生成一串密鑰,然后將用戶設置的用戶名、密碼和密鑰一起寫入到U盤的光盤區內。進行過用戶身份注冊之后,用戶的身份信息就存儲在光盤區中,用戶不可對其進行更改。之后每次進行身份認證時,都會通過調用U盤內置的身份認證函數對用戶進行身份認證。身份認證界面如圖4所示。

圖4 身份認證界面
本模塊具體步驟如下:
(1)調用U盤識別函數;
(2)如果未接收到正確的返回值則提示“沒找到指定設備”,否則執行步驟3;
(3)用戶輸入用戶名和密碼;
(4)進行身份認證,如果身份認證通過則執行步驟5,否則執行步驟3;
(5)用戶輸入密鑰;
(6)如果密鑰正確則對U盤內容解密,否則提示“密鑰不正確”并執行步驟5。
本模塊流程圖如圖5所示。

圖5 身份認證流程圖
文檔加解密模塊主要負責對文檔內容的加解密。當用戶輸入正確的密鑰之后,根據用戶選擇的加密算法調用相應的解密算法對文檔進行解密。此時,用戶才能看到存儲在U盤內文檔的明文內容。解密界面如圖6所示

圖6 文檔解密界面
HOOK載入模塊主要是向目標進程注入HOOK函數。因為該技術主要針對的是WriteFile這一Windows API函數,所以采用修改WriteFile函數的前幾個字節,來實現函數的跳轉。HOOK驅動模塊負責實際的API攔截處理工作。
本模塊主要負責對文檔添加水印。首先在Windows系統內核層攔截文件的操作句柄,獲得文件地址以及文件名稱,之后根據文件地址判斷該文件是否為寫入指定U盤的文件,如果是則根據文檔類型調用相應的水印函數為文檔添加版權信息后調用U盤中的加密函數對文檔內容加密,最后執行WriteFile函數將文檔寫入U盤內。本模塊流程圖如圖7所示。
具體步驟如下:
(1)監聽Windows WriteFile API;
(2)用戶將文檔存入指定U盤;
(3)調用Windows WriteFile API執行寫文檔;
(4)通過API HOOK技術跳轉到水印函數;
(5)判斷該文檔是否存在版權水印如果不存在則執行步驟6;
(6)為文檔添加水印并加密后,將文檔存入U盤。

圖7 文檔水印流程
本文所實現的方法主要使用了加密U盤技術,Windows HOOK技術以及數字水印算法。通過C#編程實現,具有界面簡潔友好,用戶操作簡單,U盤內容安全性高的特點。此外,由于C#中的EasyHOOK庫中封裝了許多操作Windows API 和HOOK的函數,在實現Windows HOOK技術時較為簡單。用戶在接入指定的U盤并進行身份驗證之后,只需簡單地設置基本水印信息,即可實現對存入U盤的文檔自動添加水印的功能。但該技術還存在許多問題,如只能在Windows平臺上使用,不支持跨平臺;只支持常見的word、ppt、excel、pdf、jpg這五種文件,對其他常見的辦公文檔如cad文件,bng文件還不能使用;當U盤內容較多時,解密速度較慢。在后續研究中,將重點圍繞上述問題進行深入研究。
[1]彭敏之. 數字文檔版權保護的研究[D].中南林業科技大學,2014.
[2]呂秀麗,楊雨飛,張勇.基于VC++和MATLAB混合編程的可見水印系統設計[J].科學技術與工程,2009,9(16):4828-4832.
[3]Shen Jianfang,Cheng Lianglun,Fu Xiufen. Implementation of program behavior anomaly detection and protection using hook technology [C]. Kunming:International Conference on Com-munications and Mobile Computing,2009.
[4]舒敬榮,朱安國,齊善明.HOOK API 時代碼注入方法和函數重定向技術研究[J].計算機應用與軟件,2009,26(5):107-110.
[5]劉克勝,王忠壽.API Hook關鍵技術解析[J].網絡安全技術與應用,2006(11):48-50.
[6]Yao Zhao,Baozong Yuan. A hybrid image compression scheme combining block-based fractal coding and DCT[J]. Signal Processing: Image Communication,1996,8(2).
[7]Brassil J T,Low S,Maxemchuk N F,et al.Electronic marking and identification techniques to discourage document copying[J].IEEE Journal on Selected Areasin Communications,2006,13(8): 1495-1504.
[8]Mir N.Copyright for web content using invisible text watermarking [J].Computers in Human Behavior,2014,30(30):648-653.
[9]連攀攀,陳青.文本數字水印算法的研究綜述[J].信息技術,2014(01):180-182+186.
[10]劉永平. 基于ppt文檔的信息隱藏技術研究[D].湖南大學,2009.