掛鈎技術工作原理
1)HOOK可以監視和截獲系統或進程中的各種事件訊息;(2)截獲訊息後,將本由原API函式處理的訊息交給自定義的函式(自定義的函式,即鉤子函式)處理,並做出處理動作。如即時翻譯軟體做出的對截獲的文字進行翻譯的動作;(3)HOOK技術有一個基本原則:被HOOK的API的原有功能不受到任何影響。即指在HOOK API之後,若鉤子解除,系統仍能正常運作,正常功能不受到影響。舉個簡單的例子,比如一些基於HOOK技術的安全軟體,在監視系統運行時,若發現有非法進程,會立即為用戶彈出提示視窗,提示用戶“阻止”或“放行”。選擇“阻止”,就是將訊息交給鉤子函式處理;或用戶認為屬於“誤報”,選擇“放行”,就是不影響進程正常流程,讓其正常運行。這正是遵守了這一原則。(4)由於增加了系統對每個訊息的處理量,因此HOOK會使系統變慢。這也正是很多基於HOOK技術的安全軟體在安裝運行之後會影響系統速度的原因。
HOOK的分類及其主要作用
按事件分類及其作用:
(1)鍵盤鉤子和低級鍵盤鉤子可以監視各種鍵盤訊息。
(2)滑鼠鉤子和低級滑鼠鉤子可以監視各種滑鼠訊息。
(3)外殼鉤子可以監視各種Shell事件訊息。如啟動和關閉應用程式。
(4)日誌鉤子可以記錄從系訊息佇列中取出的各種事件訊息。
(5)視窗過程鉤子監視所有從系統訊息佇列發往目標視窗的訊息。
按使用範圍分類:
主要有執行緒鉤子和系統鉤子。執行緒鉤子監視指定執行緒的事件訊息;系統鉤子監視系統的所有執行緒的事件訊息。
特殊類別——日誌鉤子:
日誌鉤子是一種很特別的鉤子,它只是在系統信息(如鍵盤信息和滑鼠信息等)進出佇列時才起作用。系統中只存在一個這樣的日誌鉤子,所以無論我們要提取滑鼠信息還是鍵盤信息都只需載入一次日誌鉤子,因此利用日誌鉤子提取系統信息的方法,與以往的方法比較起來就顯得簡單、快捷。日誌鉤子函式在系統中優先權最大,一般情況下日誌鉤子是在系統之前就處理了它所需要處理的信息,因此對於日誌鉤子來說,系統無法將它所需的信息禁止,讓日誌鉤子無法提取。日誌鉤子函式可以提取出別的鉤子函式無法提取的信息。
HOOK技術與函式結合修改函式地址
HOOK處理特地訊息的本領,使它能夠將自身的代碼“融入”被hook住的程式的進程中,成為目標進程的一個部分,在windows2000以後的系統中,普通用戶程式的進程空間都是獨立的,程式的運行彼此間都不受干擾。這就使我們希望通過一個程式改變其他程式的某些行為的想法不能直接實現,但是hook的出現給我們開拓了解決此類問題的道路。在windows系統下編程,應該會接觸到API函式的使用,常用的API函式大概有2000個左右。隨著控制項,STL等高效編程技術的出現,API的使用機率在普通的用戶程式上就變得越來越小了。當諸如控制項這些現成的手段不能實現的功能時,我們還需要藉助API。最初有些人對某些API函式的功能不太滿意,就產生了如何修改這些API,使之更好的服務於程式的想法,這樣API HOOK就自然而然的出現了。我們可以通過API HOOK,改變一個系統API的原有功能。基本的方法就是通過HOOK“接觸”到需要修改的API函式入口點,改變它的地址指向新的自定義的函式。APIHOOK並不屬於MSDN上介紹的13類hook中的任何一種。所以說,API HOOK並不是什麼特別不同的hook,它也需要通過基本的hook提高自己的許可權,跨越不同進程間訪問的限制,達到修改API函式地址的目的。對於自身進程空間下使用到的API函式地址的修改,是不需要用到API HOOK技術就可以實現的
基於HOOK技術的網路流媒體截獲機制
目前,市場上流行多種網路即時通信軟體,例如QQ、MSN和BOLSIP等等。這些即時通信軟體在運行時,除了互動信令信息外,還會傳遞大量流媒體數據。VOIP數據如果針對這些軟體互動的流媒體數據,在傳遞路徑中進行實時截獲,並使用機密信息的嵌入等復用操作,再及時傳送出去這樣就可以實現端到端的隱蔽通信因此,如何截獲這些即時通信軟體的流媒體數據是我們研究的重點在windows環境下,採用HOOK技術來截獲網路數據的基本策略如下:
DLL注入方法分析由於windows系統的進程間無法共享記憶體地址,必須通過動態程式庫[DLL]注入,將包含我們自定義的函式的DLL載入到目標進程的地址空間DLL注入最主要的方法有3種:改註冊表、使用windows HOOK、使用遠程進程。本文使用第3種方法windows的大多數函式只允許對當前進程進行操作這是很好的一個特性,因為它能夠防止一個進程破壞另一個進程的正常運行,但是,有些函式卻允許一個進程對另一個進程進行操作這些函式大部分最初是為調試程式和其他工具設計的,不過任何函式都可以調用這些函式,windows提供了一個稱為Create Remote Thread的函式,使我們能夠非常容易地在另一個進程中創建執行緒在完成了在另一個進程中創建進程的操作後,我們可以通過使用Road library函式,將需要注入到後一個進程的DLL載入到進程空間中,這種方法具有很大的靈活性,HOOK API方法分析API掛接並不是一個新技術,掛接API的一般方式有兩種一種是修改API本身代碼另一種是修改IAT。IAT即當連結程式進行輸入符號轉換時,它會將一個叫做“輸入節”的模組放入到可執行映像中這個輸入節包含了該模組所需的DLL名以及該模組會用到的每個DLL中的符號列表當模組調用一個輸入函式時,執行緒實際上要從模組的輸入節中捕獲需要的輸入函式的地址,然後轉移到該地址要掛接一個特定的API,只需要改變模組的輸入節中的地址即可,基於上述分析,針對目前即時通信軟體的特點,設計了一種通用的即時通信軟體的流媒體截獲基本框架,如圖1所示。