1. 程式人生 > >基於API HOOK的剪下板監控

基於API HOOK的剪下板監控

1  引言

    計算機的普及帶來了資訊交流的便利,同時也造成了資訊洩露問題的日趨嚴重。剪下板是資訊洩露的一個主要途徑,對剪下板的監控是防止資訊洩密的不可或缺的一環。本文通過對剪下板機制和API HOOK技術的研究,通過遠端執行緒注入的方式替換剪下板的系統呼叫函式,實現對剪下板的監控。

2  剪下板機制

    Windows剪下板是一種簡單而且開銷較小的IPC(InterProcess Communication,程序間通訊)機制,方便使用者在不同程式間拷貝資料。在Windows作業系統中存在兩種剪下板機制,即標準剪下板機制和OLE剪下板機制。     標準剪下板的基本機制是【1】:Windows系統預留一塊全域性共享記憶體,提供資料的程序建立一個全域性記憶體塊,並將要傳送的資料拷貝到記憶體中,接受資料的程序獲取此記憶體塊的控制代碼,並拷貝其中的資料。程序使用剪下板的一般步驟為:呼叫OpenClipboard()函式開啟剪下板,呼叫GetClipboard Data()函式獲取剪下板的內容,如果是設定剪下板內容,則呼叫EmptyClipboard()函式清空剪下板,然後呼叫SetCipboard Data()設定剪下板內容,呼叫CloseClipboard()關閉剪下板。因此,防洩密系統可以通過截獲程序對USER32.dll中Open Clipboard、GetClipboardData、EmptyClipboard、SetClipboardData API函式的呼叫,實現對剪下板的控制。     自從OLE(Object Linking and Embedding,物件連結和嵌入)出現後,Windows作業系統出現了另一種剪下板機制――OLE剪下板機制。OLE剪下板使用IDataObject介面,相關的API函式和標準剪下板類似,主要有以下幾個:     OleSetClipboard():在剪下板上放置一個IDataObject介面指標;     OleGetClipboard():從剪下板獲取一個IDataObject介面指標;     OleFlushClipboard():清除剪下板中的內容,並釋放IDataObject介面指標;     OleIsCurrentClipboard():判斷剪下板上是否存在指定物件。

3  API HOOK

    Windows API是Windows提供給應用程式的介面,通過這個介面,應用程式可以使用作業系統的所有資源。大多數應用程式都要使用很多API函式,在應用程式沒有提供程式設計介面,也不知道原始碼的情況下,API HOOK技術是控制應用程式的一種有效途徑。通過API HOOK,可以實現對Win32 API函式的攔截,從而改變函式甚至應用程式的行為。

3.1  API HOOK途徑

    通常API HOOK的實現有以下兩種途徑【2】【3】:     1)匯入地址表(Import Address Table, IAT)補丁     Windows 32位作業系統中,所有可執行檔案或動態連結庫都是基於PE(Portable Executable)格式構建。PE檔案的結構由多個成為“節”塊組成,每個節中都包含了特定的內容,而且載入入記憶體中的PE檔案的結構與磁碟上的靜態檔案結構完全一樣。在PE檔案的.idata節中包含一個IAT,它儲存著所有與可執行程式碼應用的匯入函式名稱的偏移量。當呼叫某一匯入函式時,可執行程式從IAT中找到該匯入函式的入口地址,然後再跳轉到執行函式程式碼。使用者可以用自己函式的入口地址覆蓋IAT中相對應的匯入函式地址,實現API函式攔截。      2)修改應用程式     該方式主要通過替換函式實現的前幾個位元組。通過呼叫GetProcAddress函式得到被攔截API函式的入口地址,儲存入口地址前幾個位元組的內容,並用一個JMP或INT指令替換。當API函式被呼叫時,應用程式就會直接跳轉或通過中斷的方式跳轉到攔截函式。

3.2  API HOOK的實現步驟

    API HOOK的實現一般包括兩個步驟:     1) 程式碼注入     在Windows作業系統中,所有32位應用程式都執行在一個相對獨立的私有地址空間中。API HOOK的第一步就是把自己的攔截函式做成動態連結庫,注入到目標程序的地址空間中,然後再實現函式跳轉。通常程式碼注入採用建立遠端執行緒的方法。     建立遠端執行緒實現程式碼注入的主要思想是用Virtual AllocEx函式在遠端程序中申請空間,呼叫WriteProcess Memory將攔截函式動態連結庫的名字和路徑寫入申請的空間,呼叫CreateRemoteThread和LoadLibrary函式將動態連結庫對映到遠端程序,等待對映完畢後,呼叫GetExitCodeThread獲得返回碼,即得到對映的動態連結庫的載入基地址。至此,攔截程式碼已經載入到遠端程序的地址空間中。     2) 掛接API     得到攔截程式碼載入到遠端程序的地址後,就可以採用IAT補丁或應用程式修改的方法,將目標API函式的呼叫修改為攔截函式的呼叫。

4  剪下板監控的實現

    本文將兩種剪下板所用API函式的替代函式(如表1所示)儲存到ClipboardControl.dll中,供剪下板監控程式攔截API時呼叫。