基于API HOOK的剪切板監(jiān)控基于API HOOK的剪切板監(jiān)控 摘 要 本文通過對剪切板機(jī)制的研究,,采用API HOOK技術(shù)對剪切板的系統(tǒng)調(diào)用函數(shù)攔截,實現(xiàn)了對剪切板的監(jiān)控,,防止敏感信息通過剪切板泄露,。
關(guān)鍵詞 剪切板;API HOOK,;信息保密
1 引言 計算機(jī)的普及帶來了信息交流的便利,,同時也造成了信息泄露問題的日趨嚴(yán)重。剪切板是信息泄露的一個主要途徑,,對剪切板的監(jiān)控是防止信息泄密的不可或缺的一環(huán),。本文通過對剪切板機(jī)制和API HOOK技術(shù)的研究,通過遠(yuǎn)程線程注入的方式替換剪切板的系統(tǒng)調(diào)用函數(shù),,實現(xiàn)對剪切板的監(jiān)控,。
2 剪切板機(jī)制 Windows剪切板是一種簡單而且開銷較小的IPC(InterProcess Communication,進(jìn)程間通訊)機(jī)制,,方便用戶在不同程序間拷貝數(shù)據(jù),。在Windows操作系統(tǒng)中存在兩種剪切板機(jī)制,即標(biāo)準(zhǔn)剪切板機(jī)制和OLE剪切板機(jī)制,。
標(biāo)準(zhǔn)剪切板的基本機(jī)制是【1】:Windows系統(tǒng)預(yù)留一塊全局共享內(nèi)存,,提供數(shù)據(jù)的進(jìn)程創(chuàng)建一個全局內(nèi)存塊,并將要傳送的數(shù)據(jù)拷貝到內(nèi)存中,,接受數(shù)據(jù)的進(jìn)程獲取此內(nèi)存塊的句柄,,并拷貝其中的數(shù)據(jù)。進(jìn)程使用剪切板的一般步驟為:調(diào)用OpenClipboard()函數(shù)打開剪切板,,調(diào)用GetClipboard Data()函數(shù)獲取剪切板的內(nèi)容,,如果是設(shè)置剪切板內(nèi)容,則調(diào)用EmptyClipboard()函數(shù)清空剪切板,,然后調(diào)用SetCipboard Data()設(shè)置剪切板內(nèi)容,調(diào)用CloseClipboard()關(guān)閉剪切板,。因此,,防泄密系統(tǒng)可以通過截獲進(jìn)程對USER32.dll中Open Clipboard,、GetClipboardData、EmptyClipboard,、SetClipboardData API函數(shù)的調(diào)用,,實現(xiàn)對剪切板的控制。
自從OLE(Object Linking and Embedding,對象鏈接和嵌入)出現(xiàn)后,,Windows操作系統(tǒng)出現(xiàn)了另一種剪切板機(jī)制――OLE剪切板機(jī)制,。OLE剪切板使用IDataObject接口,相關(guān)的API函數(shù)和標(biāo)準(zhǔn)剪切板類似,,主要有以下幾個:
OleSetClipboard():在剪切板上放置一個IDataObject接口指針,;
OleGetClipboard():從剪切板獲取一個IDataObject接口指針;
OleFlushClipboard():清除剪切板中的內(nèi)容,,并釋放IDataObject接口指針,;
OleIsCurrentClipboard():判斷剪切板上是否存在指定對象。
3 API HOOK Windows API是Windows提供給應(yīng)用程序的接口,,通過這個接口,,應(yīng)用程序可以使用操作系統(tǒng)的所有資源。大多數(shù)應(yīng)用程序都要使用很多API函數(shù),,在應(yīng)用程序沒有提供編程接口,,也不知道源代碼的情況下,API HOOK技術(shù)是控制應(yīng)用程序的一種有效途徑,。通過API HOOK,,可以實現(xiàn)對Win32 API函數(shù)的攔截,從而改變函數(shù)甚至應(yīng)用程序的行為,。
3.1 API HOOK途徑 通常API HOOK的實現(xiàn)有以下兩種途徑【2】【3】:
1)導(dǎo)入地址表(Import Address Table, IAT)補(bǔ)丁
Windows 32位操作系統(tǒng)中,,所有可執(zhí)行文件或動態(tài)鏈接庫都是基于PE(Portable Executable)格式構(gòu)建。PE文件的結(jié)構(gòu)由多個成為“節(jié)”塊組成,,每個節(jié)中都包含了特定的內(nèi)容,,而且加載入內(nèi)存中的PE文件的結(jié)構(gòu)與磁盤上的靜態(tài)文件結(jié)構(gòu)完全一樣。在PE文件的.idata節(jié)中包含一個IAT,,它保存著所有與可執(zhí)行代碼應(yīng)用的導(dǎo)入函數(shù)名稱的偏移量,。當(dāng)調(diào)用某一導(dǎo)入函數(shù)時,可執(zhí)行程序從IAT中找到該導(dǎo)入函數(shù)的入口地址,,然后再跳轉(zhuǎn)到執(zhí)行函數(shù)代碼,。用戶可以用自己函數(shù)的入口地址覆蓋IAT中相對應(yīng)的導(dǎo)入函數(shù)地址,實現(xiàn)API函數(shù)攔截,。
2)修改應(yīng)用程序
該方式主要通過替換函數(shù)實現(xiàn)的前幾個字節(jié),。通過調(diào)用GetProcAddress函數(shù)得到被攔截API函數(shù)的入口地址,保存入口地址前幾個字節(jié)的內(nèi)容,,并用一個JMP或INT指令替換,。當(dāng)API函數(shù)被調(diào)用時,,應(yīng)用程序就會直接跳轉(zhuǎn)或通過中斷的方式跳轉(zhuǎn)到攔截函數(shù)。
3.2 API HOOK的實現(xiàn)步驟 API HOOK的實現(xiàn)一般包括兩個步驟:
1) 代碼注入
在Windows操作系統(tǒng)中,,所有32位應(yīng)用程序都運行在一個相對獨立的私有地址空間中,。API HOOK的第一步就是把自己的攔截函數(shù)做成動態(tài)鏈接庫,注入到目標(biāo)進(jìn)程的地址空間中,,然后再實現(xiàn)函數(shù)跳轉(zhuǎn),。通常代碼注入采用創(chuàng)建遠(yuǎn)程線程的方法。
創(chuàng)建遠(yuǎn)程線程實現(xiàn)代碼注入的主要思想是用Virtual AllocEx函數(shù)在遠(yuǎn)程進(jìn)程中申請空間,,調(diào)用WriteProcess Memory將攔截函數(shù)動態(tài)鏈接庫的名字和路徑寫入申請的空間,,調(diào)用CreateRemoteThread和LoadLibrary函數(shù)將動態(tài)鏈接庫映射到遠(yuǎn)程進(jìn)程,等待映射完畢后,,調(diào)用GetExitCodeThread獲得返回碼,,即得到映射的動態(tài)鏈接庫的加載基地址。至此,,攔截代碼已經(jīng)加載到遠(yuǎn)程進(jìn)程的地址空間中,。
2) 掛接API
得到攔截代碼加載到遠(yuǎn)程進(jìn)程的地址后,就可以采用IAT補(bǔ)丁或應(yīng)用程序修改的方法,,將目標(biāo)API函數(shù)的調(diào)用修改為攔截函數(shù)的調(diào)用,。
4 剪切板監(jiān)控的實現(xiàn) 本文將兩種剪切板所用API函數(shù)的替代函數(shù)(如表1所示)存儲到ClipboardControl.dll中,供剪切板監(jiān)控程序攔截API時調(diào)用,。
表1 剪切板API替換函數(shù)表
剪切板監(jiān)控程序調(diào)用CreateRemoteThread函數(shù)在閱讀器進(jìn)程中創(chuàng)建遠(yuǎn)程線程,把監(jiān)控代碼ClipboardControl.dll注入到目標(biāo)進(jìn)程中,,并調(diào)用ImageDirectoryEntryToData函數(shù)獲取目標(biāo)進(jìn)程模塊的輸入表地址,,通過遍歷輸入表找到USER32.dll模塊對應(yīng)的IMAGE_IMPORT_DESCRIPTOR,然后遍歷其IAT,,找到目標(biāo)API在IAT中相應(yīng)的表項,,通過VirtualQuery獲取內(nèi)存信息,調(diào)用VirtualProtectEx修改內(nèi)存為可讀寫,,再調(diào)用WriteProcessMemory修改內(nèi)存,,使表項中API函數(shù)的地址變?yōu)橄到y(tǒng)監(jiān)控代碼的地址,修改完畢后調(diào)用VirtualProtectEx將內(nèi)存屬性改回來,。當(dāng)用戶使用剪切板時,,監(jiān)控程序就能根據(jù)替換函數(shù)的代碼進(jìn)行相應(yīng)的操作,從而達(dá)到對剪切板進(jìn)行監(jiān)控的目的,。
5 總結(jié) 本文通過創(chuàng)建遠(yuǎn)程線程的方式,,將API替代函數(shù)注入目標(biāo)進(jìn)程,,通過修改IAT,對目標(biāo)API函數(shù)進(jìn)行替換,,達(dá)到對其攔截的目的,從而實現(xiàn)了剪切板的監(jiān)控,,防止信息通過剪切板泄露,。 |
|