Hook原理分析

首先說說這個技術的實現環境,大家都知道windows的近幾個版本都是使用了消息循環機制的,所謂的消息循環機制就是在windows上跑的各種程序之間和windows 之間的交互都是通過消息實現的,這裏特指的是windows 和應用程序之間而不是各個程序之間,既然提到了消息,那就說可以截獲消息,這裏截獲消息處理消息的過程就是消息鉤子。

簡單說下windows消息隊列,其實每一個IO操作,控制操作都可以看作是一種消息,這在DOS系統中是採用中斷的形式來處理的(現在部分交互改成windows消息機制了),應用程序發出消息->由Windows消息隊列接受消息->根據已有註冊的消息處理函數,分發給對應的消息處理函數(如果有的消息找不到處理函數,就會由系統接管該消息)->返回消息處理或者結束一次消息通訊,但是這個整個過程中windows做的就是始終監聽是否有消息需要轉發,確保消息轉發和處理的及時性。

實現原理:
每一個Hook程序都有一個索引指針,這個指針是被串在一個由系統來維護的鉤子鏈表上,這樣系統就是可以把獲得的消息和回調函數對應起來(註冊Hook處理程序的時候都指定了要處理的消息類型)。當有對應的消息過來的時,系統我就把該消息傳遞當對應的Hook程序,由Hook 處理該消息,也可以修改消息,最後可以把消息傳遞下去也可以結束消息循環,當然一個程序可以被註冊多個消息處理函數,這些函數會根據調用哪呢?其實是最早掛載的鉤子會在最晚執行(隊列結構),每一次銷燬一個Hook程序,就會更新一下鉤子鏈表(這裏不要求按順序刪除鉤子),還有就是具有消息鉤子的程序結束了但是還沒卸載對應的鉤子,這個會由系統來幫着卸載。

根據鉤子程序的性質,決定了他有一些編碼要求,要是保證在程序運行的時候隨時可以被系統調用,要註冊成回調函數(Callback),也不能定義爲類的成員函數,只能定義爲一般的的函數,不然被回調不了的,記住所有的callback函數都是一類被動觸發的函數,一般監控這某個事件的發生,在Windows API 中實現的函數是setWindowHookEx(),其中最後一個參數來表示他是系統鉤子還是線程鉤子,當然在兩個鉤子都安裝的情況下,會優先調用自己的線程鉤子,多個鉤子處理過程可以形成鉤子鏈條來傳遞處理消息。

Hook的應用:
很多windows的正規程序都是使用了Hook技術,說下對二進制DLL的注入,也是一種Hook,這裏可以實現對原來函數功能的修改,很多插件就是這樣工作的,如有道的屏幕取詞劃詞功能就是Hook了鼠標的LeftMouseUp事件。
在說下詭異的應用,替換模式,windows 更新的熱補丁就是替換了函數調用前的四個無用字節,使內存代碼的執行流程修改,達到立即生效的目的,還有要是對於加了互斥鎖的DLL,本來是不允許兩個線程或進程同時訪問的,這裏直接在內存修改調用該DLL的導出表就直接跳過限制DLL,執行自己任意功能,然後也可以再跳回到正確的DLL執行,這樣在不影響程序功能的情況下完成了Hook。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章